石一歌的Docker进阶笔记

Docker进阶

Docker Compose

Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务。然后,只需一个命令,就可以从配置中创建并启动所有服务。

文档

两个重要的概念:

  • 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
  • 项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml中定义

安装

别怂,选择compose v2版本

  • v1

    • 安装

      curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
      # 镜像
      curl -L https://get.daocloud.io/docker/compose/releases/download/v2.3.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
      
    • 授予可执行权限

      chmod +x /usr/local/bin/docker-compose
      
    • 确认

      docker-compose --version
      
  • v2

    • 安装

      mkdir -p /usr/local/lib/docker/cli-plugins
      curl -SL https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
      # 镜像
      curl -L https://get.daocloud.io/docker/compose/releases/download/v2.2.3/docker-compose-`uname -s`-`uname -m` > /usr/local/lib/docker/cli-plugins/docker-compose
      
    • 授予可执行权限

      chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
      
    • 确认

      docker compose version
      

Getting Started

  • 依赖服务

    • app.py

      import time
      import redis
      from flask import Flask
      
      app = Flask(__name__)
      cache = redis.Redis(host='redis', port=6379)
      
      def get_hit_count():
          retries = 5
          while True:
              try:
                  return cache.incr('hits')
              except redis.exceptions.ConnectionError as exc:
                  if retries == 0:
                      raise exc
                  retries -= 1
                  time.sleep(0.5)
      
      @app.route('/')
      def hello():
          count = get_hit_count()
          return 'Hello World! I have been seen {} times.\n'.format(count)
      
    • requirements.txt

      flask
      redis
      
  • Dockerfile

    FROM python:3.7-alpine
    WORKDIR /code
    ENV FLASK_APP=app.py
    ENV FLASK_RUN_HOST=0.0.0.0
    RUN apk add --no-cache gcc musl-dev linux-headers
    COPY requirements.txt requirements.txt
    RUN pip install -r requirements.txt
    EXPOSE 5000
    COPY . .
    CMD ["flask", "run"]
    
  • docker-compose.yml

    version: "3.9"
    services:
      web:
        build: .
        ports:
          - "8000:5000"
        volumes:
          - .:/code
        environment:
          FLASK_ENV: development
      redis:
        image: "redis:alpine"
    
  • 基础命令

    # 启动应用
    	docker compose up
    	[options]: 
    		-d :后台模式运行
    		--build :重新打包
    		--scale scale :服务扩展实例
    # 退出应用
    	docker-compose stop(Ctrl+C)
    # 完全删除容器
    	docker compose down
    	[options]: 
    		--volumes :删除数据卷
    # 查看服务
    	docker-compose ps
    

docker-compose.yml

文档

  • version

    指定 docker-compose.yml 文件的写法格式

    version: "3.x"
    
  • services

    服务,多个容器集合

    • image

      指定创建容器时所需的镜像名称标签或者镜像 ID。如果镜像在本地不存在,会去远程拉取。

      services:
        web:
          image: hello-world
      
    • build

      基于 Dockerfile 文件构建,在使用 up 命令时会执行构建任务。

      build 配置项可以直接指定 Dockerfile 所在文件夹的路径或者由下一级对象指定。

      # 绝对路径,在该路径下基于名称为 Dockerfile 的文件构建镜像
      build: /usr/local/docker-centos
      # 相对路径,相对当前 docker-compose.yml 文件所在目录,基于名称为 Dockerfile 的文件构建镜像
      build: .
      
      • context

        该选项可以是 Dockerfile 文件的绝对/相对路径,也可以是远程 Git 仓库的 URL,当提供的值是相对路径时,相对当前 docker-compose.yml 文件所在目录。

        context: . # 相对当前 docker-compose.yml 文件所在目录
        
      • dockerfile

        一般情况下,默认都基于文件名叫 Dockerfile 的文件构建镜像,当然也可以是自定义的文件名,使用 dockerfile 声明,不过这个选项只能声明文件名,文件所在路径还是要通过 centext 来声明。

        dockerfile: Dockerfile-alternate # 基于名称为 Dockerfile-alternate 的文件构建镜像
        
      • 补充

        args:                  # args: Dockerfile 在 build 过程中需要的参数 (等同于 docker container build --build-arg 的作用)
        cache_from:            # v3.2中新增的参数, 指定缓存的镜像列表 (等同于 docker container build --cache_from 的作用)
        labels:                # v3.3中新增的参数, 设置镜像的元数据 (等同于 docker container build --labels 的作用)
        shm_size:              # v3.5中新增的参数, 设置容器 /dev/shm 分区的大小 (等同于 docker container build --shm-size 的作用)
        
    • container_name

      创建的容器默认生成的名称格式为:工程名称_服务条目名称_序号。如果要使用自定义名称,使用 container_name 声明。(等同于 docker run --name 的作用)

      注:Docker 容器名称必须唯一,如果指定了自定义名称,就不能将服务扩展至多个容器。会导致错误。

      container_name: mycentos7 # 容器名称,默认为"工程名称_服务条目名称_序号" 
      
    • depends_on

      默认为从上到下启动容器,使用depends_on解决容器依赖、启动先后问题的配置项。

      depends_on:
      	- redis
      
    • ports

      容器对外暴露的端口

      • SHORT 格式
        • 左边宿主机端口:右边容器端口
      • LONG 格式
        • target:容器端口
          • published:宿主机端口
          • protocol:协议类型
          • mode:端口模式
      ports:  
      	- "80:80"  
      	- "8080:8080"
      ---	
      ports:
      	- target: 80                    # 容器端口
      		published: 8080               # 宿主机端口
      		protocol: tcp                 # 协议类型
      		mode: host                    # host 在每个节点上发布主机端口,  ingress 对于群模式端口进行负载均衡
      
    • expose

      容器暴露的端口不映射到宿主机,只允许能被连接的服务访问。

      expose:  
      	- "80"  
      	- "8080"
      
    • restart

      容器重启策略,简单的理解就是 Docker 重启以后容器要不要一起启动:

      • no:默认的重启策略,在任何情况下都不会重启容器;
      • on-failure:容器非正常退出时,比如退出状态为非0(异常退出),才会重启容器;
      • always:容器总是重新启动,即使容器被手动停止了,当 Docker 重启时容器也还是会一起启动;
      • unless-stopped:容器总是重新启动,除非容器被停止(手动或其他方式),那么 Docker 重启时容器则不会启动
      restart: always
      
    • environment

      添加环境变量。可以使用数组也可以使用字典。布尔相关的值(true、false、yes、no)都需要用引号括起来,以确保 YML 解析器不会将它们转换为真或假。

      environment:
        RACK_ENV: development
        SHOW: 'true'
        SESSION_SECRET:
      ---
      environment:
        - RACK_ENV=development
        - SHOW=true
        - SESSION_SECRET
      
    • env_file

      从文件中获取环境变量,可以指定一个或多个文件,其优先级低于 environment 指定的环境变量。

      env_file:
        - /opt/runtime_opts.env # 绝对路径
        - ./common.env # 相对路径
      
    • command

      覆盖容器启动后默认执行的命令。支持 shell 格式和 [] 格式

      command: echo "helloworld"
      ---
      command: ["echo", "helloworld"]
      
    • volumes

      数据卷,用于实现目录挂载,支持指定目录挂载匿名挂载具名挂载

      • SHORT 格式

        • 指定目录挂载的格式为:左边宿主机目录:右边容器目录,或者左边宿主机目录:右边容器目录:读写权限

        • 匿名挂载格式为:容器目录即可,或者容器目录即可:读写权限

        • 具名挂载格式为:数据卷条目名称:容器目录,或者`数据卷条目名称:容器目录:读写权限

      • LONG 格式

        • type: mount类型
          • source:宿主机目录
          • target:容器目录
          • volume:额外选项
          • read_only:只读权限
       volumes:
            # 绝对路径
            - "/mydata/docker_mysql/data:/var/lib/mysql"
            # 相对路径,相对当前 docker-compose.yml 文件所在目录
            - "./conf:/etc/mysql/conf.d"
            # 匿名挂载,匿名挂载只需要写容器目录即可,容器外对应的目录会在 /var/lib/docker/volume 中生成
            - "/var/lib/mysql"
            # 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生成
            - "mysql-data-volume:/var/lib/mysql"
      ---
      volumes:
      	- type: volume                  # mount 的类型, 必须是 bind、volume 或 tmpfs
      		source: mydata              # 宿主机目录
      		target: /data               # 容器目录
      		volume:                     # 配置额外的选项, 其 key 必须和 type 的值相同
      			nocopy: true            # volume 额外的选项, 在创建卷时禁用从容器复制数据
      	- type: bind                    # volume 模式只指定容器路径即可, 宿主机路径随机生成; bind 需要指定容器和数据机的映射路径
      		source: ./static
      		target: /opt/app/static
      		read_only: true             # 设置文件系统为只读文件系统
      
    • network_mode

      设置网络模式,类似 docker run 时添加的参数 --net host 或者 --network host 的用法。

      network_mode: "bridge"
      network_mode: "host"
      network_mode: "none"
      network_mode: "service:[service name]"
      network_mode: "container:[container name/id]"
      
    • networks

      配置容器连接的网络,引用顶级 networks 下的条目。

      networks: 
            - nginx-net # 具体网络的条目名称
      
      • aliases

        网络上此服务的别名。同一网络上的其他容器可以使用服务名或此别名连接到服务容器。同一服务在不同的网络上可以具有不同的别名。

        aliases:
        	- nginx1 # 同一网络上的其他容器可以使用服务名或此别名连接到服务容器
        
      • ipv4_address

        ipv4_address: # IP V4 格式
        
      • ipv6_address

        ipv6_address:  # IP V6 格式
        
    • 补充

      configs               
      cgroup_parent         
      credential_spec       
      devices               # 指定设备映射列表 (等同于 docker run --device 的作用)
      dns                   # 设置 DNS 地址(等同于 docker run --dns 的作用)
      dns_search            # 设置 DNS 搜索域(等同于 docker run --dns-search 的作用)
      tmpfs                 # v2 版本以上, 挂载目录到容器中, 作为容器的临时文件系统(等同于 docker run --tmpfs 的作用, 在使用 swarm 部署时将忽略该选项)
      entrypoint            # 覆盖容器的默认 entrypoint 指令 (等同于 docker run --entrypoint 的作用)
      external_links        # 连接不在 docker-compose.yml 中定义的容器或者不在 compose 管理的容器(docker run 启动的容器, 在 v3 版本中使用 swarm 部署时将忽略该选项)
      extra_hosts           # 添加 host 记录到容器中的 /etc/hosts 中 (等同于 docker run --add-host 的作用)
      healthcheck           # v2.1 以上版本, 定义容器健康状态检查, 类似于 Dockerfile 的 HEALTHCHECK 指令
      	test                  # 检查容器检查状态的命令, 该选项必须是一个字符串或者列表, 第一项必须是 NONE, CMD 或 CMD-SHELL, 如果其是一个字符串则相当于 CMD-SHELL 加该字符串
      		NONE                  # 禁用容器的健康状态检测
      		CMD                   # test: ["CMD", "curl", "-f", "http://localhost"]
      		CMD-SHELL             # test: ["CMD-SHELL", "curl -f http://localhost || exit 1"] 或者 test: curl -f https://localhost || exit 1
      	interval: 1m30s       # 每次检查之间的间隔时间
      	timeout: 10s          # 运行命令的超时时间
      	retries: 3            # 重试次数
      	start_period: 40s     # v3.4 以上新增的选项, 定义容器启动时间间隔
      	disable: true         # true 或 false, 表示是否禁用健康状态检测和 test: NONE 相同
      init                  # v3.7 中新增的参数, true 或 false 表示是否在容器中运行一个 init, 它接收信号并传递给进程
      isolation             # 隔离容器技术, 在 Linux 中仅支持 default 值
      labels                # 使用 Docker 标签将元数据添加到容器, 与 Dockerfile 中的 LABELS 类似
      links                 # 链接到其它服务中的容器, 该选项是 docker 历史遗留的选项, 目前已被用户自定义网络名称空间取代, 最终有可能被废弃 (在使用 swarm 部署时将忽略该选项)
      logging               # 设置容器日志服务
      	driver                # 指定日志记录驱动程序, 默认 json-file (等同于 docker run --log-driver 的作用)
      		options               # 指定日志的相关参数 (等同于 docker run --log-opt 的作用)
      			max-size              # 设置单个日志文件的大小, 当到达这个值后会进行日志滚动操作
      			max-file              # 日志文件保留的数量
      pid: 'host'           # 共享宿主机的 进程空间(PID)
      secrets               
      security_opt          # 为每个容器覆盖默认的标签 (在使用 swarm 部署时将忽略该选项)
      stop_grace_period     # 指定在发送了 SIGTERM 信号之后, 容器等待多少秒之后退出(默认 10s)
      stop_signal           # 指定停止容器发送的信号 (默认为 SIGTERM 相当于 kill PID; SIGKILL 相当于 kill -9 PID; 在使用 swarm 部署时将忽略该选项)
      sysctls               # 设置容器中的内核参数 (在使用 swarm 部署时将忽略该选项)
      ulimits               # 设置容器的 limit
      userns_mode           # 如果Docker守护程序配置了用户名称空间, 则禁用此服务的用户名称空间 (在使用 swarm 部署时将忽略该选项)
      
  • volumes

    可以位于 services 键的二级键和 compose 顶级键, 如果需要跨服务间使用则在顶级键定义, 在 services 中引用

    volumes:
    	mydata:                                 # 定义在 volume, 可在所有服务中调用
    
  • networks

    可以位于 services 键的二级键和 compose 顶级键, 如果需要跨服务间使用则在顶级键定义, 在 services 中引用

    networks:         				 # 定义 networks 信息
    	driver:                		  # 指定网络模式, 大多数情况下, 它 bridge 于单个主机和 overlay Swarm 上
    		bridge:                	  # Docker 默认使用 bridge 连接单个主机上的网络
             	overlay:               # overlay 驱动程序创建一个跨多个节点命名的网络
             	host:                  # 共享主机网络名称空间(等同于 docker run --net=host)
             	none:                  # 等同于 docker run --net=none
    	driver_opts:          		  # v3.2以上版本, 传递给驱动程序的参数, 这些参数取决于驱动程序
    	attachable:            		  # driver 为 overlay 时使用, 如果设置为 true 则除了服务之外,独立容器也可以附加到该网络; 如果独立容器连接到该网络,则它可以与其他 Docker 守护进程连接到的该网络的服务和独立容器进行通信
    	ipam:                  		  # 自定义 IPAM 配置. 这是一个具有多个属性的对象, 每个属性都是可选的
    		driver:                   # IPAM 驱动程序, bridge 或者 default
    		config:                   # 配置项
    			subnet:               # CIDR格式的子网,表示该网络的网段
    	external:             		  # 外部网络, 如果设置为 true 则 docker-compose up 不会尝试创建它, 如果它不存在则引发错误
    	name:                 		  # v3.5 以上版本, 为此网络设置名称,默认为"工程名称_default"
    

常用命令

# 常用命令
    docker compose [OPTIONS] COMMAND
    Options:
          --ansi string                字符串控制何时打印ansi控制字符
                                       ("never"|"always"|"auto") (default "auto")
          --compatibility              兼容性在向后兼容模式下运行compose
          --env-file string            指定备用环境文件
      -f, --file stringArray           Compose配置文件
          --profile stringArray        指定要启用的配置文件
          --project-directory string   指定备用工作目录
                                       (default: Compose文件所在路径)
      -p, --project-name string        项目名称
                                       (default: Compose文件所在路径)
    Commands:
      build       构建或重建服务
      convert     将Compose文件转换为平台的规范格式
      cp          在服务容器和本地文件系统之间复制文件/文件夹
      create      为服务创建容器。 
      down        停止并移除容器、网络
      events      从容器接收实时事件。
      exec        在运行的容器中执行命令。
      images      列出所创建容器使用的镜像
      kill        强制停止服务容器。
      logs        查看容器的输出
      ls          列出正在运行的compose项目
      pause       暂停服务
      port        打印端口绑定的公共端口
      ps          列出容器
      pull        拉取服务镜像
      push        推送服务镜像
      restart     重新启动容器
      rm          移除停止的服务容器
      run         对服务运行一次性命令
      start       启动服务
      stop        暂停服务
      top         显示正在运行的进程
      unpause     取消暂停服务
      up          创建并启动容器
      version     显示Docker Compose的版本信息

Docker Swarm

在多个服务器或主机上创建容器集群服务

Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器

1479220-20181018163339198-1499005562

核心概念

  • Swarm

  Docker Engine 1.12 引入了 Swarm 模式,一个 Swarm 由多个 Docker 主机组成,它们以 Swarm 集群模式运行。Swarm 集群由 Manager 节点(管理者角色,管理成员和委托任务)和 Worker 节点(工作者角色,运行 Swarm 服务)组成。这些 Docker 主机有些是 Manager 节点,有些是 Worker 节点,或者同时扮演这两种角色。

   Swarm 创建服务时,需要指定要使用的镜像、在运行的容器中执行的命令、定义其副本的数量、可用的网络和数据卷、将服务公开给外部的端口等等。与独立容器相比,群集服务的主要优势之一是,你可以修改服务的配置,包括它所连接的网络和数据卷等,而不需要手动重启服务。还有就是,如果一个 Worker Node 不可用了,Docker 会调度不可用 Node 的 Task 任务到其他 Nodes 上。

  • Node

    ​ Swarm 集群由 Manager 节点(管理者角色,管理成员和委托任务)和 Worker 节点(工作者角色,运行 Swarm 服务)组成。一个节点就是 Swarm 集群中的一个实例,也就是一个 Docker 主机。你可以运行一个或多个节点在单台物理机或云服务器上,但是生产环境上,典型的部署方式是:Docker 节点交叉分布式部署在多台物理机或云主机上。节点名称默认为机器的 hostname。

    • Manager:负责整个集群的管理工作包括集群配置、服务管理、容器编排等所有跟集群有关的工作,它会选举出一个 leader 来指挥编排任务;
    • Worker:工作节点接收和执行从管理节点分派的任务(Tasks)运行在相应的服务(Services)上。

    1479220-20181020220250190-271703054

  • Service

服务(Service)是一个抽象的概念,是对要在管理节点或工作节点上执行的任务的定义。它是集群系统的中心结构,是用户与集群交互的主要根源。Swarm 创建服务时,可以为服务定义以下信息:

  • 服务名称;
  • 使用哪个镜像来创建容器;
  • 要运行多少个副本;
  • 服务的容器要连接到哪个网络上;
  • 要映射哪些端口。

1479220-20181020220303428-146351236

  • Task

        任务(Task)包括一个 Docker 容器在容器中运行的命令。任务是一个集群的最小单元,任务与容器是一对一的关系。管理节点根据服务规模中设置的副本数量将任务分配给工作节点。一旦任务被分配到一个节点,便无法移动到另一个节点。它只能在分配的节点上运行或失败。

  • Replicated and global services

    Swarm 不只是提供了优秀的高可用性,同时也提供了节点的弹性扩容和缩容的功能。可以通过以下两种类型的 Services 部署实现:

    • Replicated Services:当服务需要动态扩缩容时,只需通过 scale 参数或者 --replicas n 参数指定运行相同任务的数量,即可复制出新的副本,将一系列复制任务分发至各节点当中,这种操作便称之为副本服务(Replicate)。
    • Global Services:我们也可以通过 --mode global 参数将服务分发至全部节点之上,这种操作我们称之为全局服务(Global)。在每个节点上运行一个相同的任务,不需要预先指定任务的数量,每增加一个节点到 Swarm 中,协调器就会创建一个任务,然后调度器把任务分配给新节点。

      下图用黄色表示拥有三个副本服务 Replicated Service,用灰色表示拥有一个全局服务 Global Service。

1479220-20181020220320789-1157117261

工作流程

Swarm Manager:

  1. API:接受命令并创建 service 对象(创建对象)
  2. orchestrator:为 service 对象创建的 task 进行编排工作(服务编排)
  3. allocater:为各个 task 分配 IP 地址(分配 IP)
  4. dispatcher:将 task 分发到 nodes(分发任务)
  5. scheduler:安排一个 worker 节点运行 task(运行任务)

Worker Node:

  1. worker:连接到调度器,检查分配的 task(检查任务)
  2. executor:执行分配给 worker 节点的 task(执行任务)

1479220-20181020220312417-120406041

Overlay 网络

​ Overlay 网络其实并不是一门新技术,它是指构建在另一个网络上的计算机网络,这是一种网络虚拟化技术的形式,近年来云计算虚拟化技术的演进促进了网络虚拟化技术的应用。所以 Overlay 网络就是建立在另一个计算机网络之上的虚拟网络,它是不能独立出现的,Overlay 底层依赖的网络就是 Underlay 网络。

  Underlay 网络是专门用来承载用户 IP 流量的基础架构层,它与 Overlay 网络之间的关系有点类似物理机和虚拟机。Underlay 网络和物理机都是真正存在的实体,它们分别对应着真实存在的网络设备和计算设备,而 Overlay 网络和虚拟机都是依托在下层实体的基础之上,使用软件虚拟出来的层级。在 Docker 版本 1.12 以后 Swarm 模式原生已支持覆盖网络(Overlay Network),只要是这个覆盖网络内的容器,不管在不在同一个宿主机上都能相互通信,即跨主机通信。不同覆盖网络内的容器之间是相互隔离的(相互 ping 不通)。

​ Overlay 网络是目前主流的容器跨节点数据传输和路由方案。当然,容器在跨主机进行通信的时候,除了可以使用 overlay 网络模式进行通信之外,还可以使用 host 网络模式,直接使用物理机的 IP 地址就可以进行通信。

350c0c464af591b8a01655ca5bf233a4

调度策略

Swarm在调度(scheduler)节点(leader节点)运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:spread, binpack, random.

  • Random 顾名思义,就是随机选择一个Node来运行容器,一般用作调试用,spread和binpack策略会根据各个节点的可用的CPU, RAM以及正在运行的容器的数量来计算应该运行容器的节点。
  • Spread在同等条件下,Spread策略会选择运行容器最少的那台节点来运行新的容器,binpack策略会选择运行容器最集中的那台机器来运行新的节点。使用Spread策略会使得容器会均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了只会损失少部分的容器。
  • Binpack Binpack策略最大化的避免容器碎片化,就是说binpack策略尽可能的把还未使用的节点留给需要更大空间的容器运行,尽可能的把容器运行在一个节点上面。

常用命令

  • docker swarm
命令 说明
docker swarm init 初始化集群
docker swarm join-token worker 查看工作节点的 token
docker swarm join-token manager 查看管理节点的 token
docker swarm join 加入集群
  • docker node
命令 说明
docker node ls 查看集群所有节点
docker node ps 查看当前节点所有任务
docker node rm 节点名称|节点ID 删除节点(-f强制删除)
docker node inspect 节点名称|节点ID 查看节点详情
docker node demote 节点名称|节点ID 节点降级,由管理节点降级为工作节点
docker node promote 节点名称|节点ID 节点升级,由工作节点升级为管理节点
docker node update 节点名称|节点ID 更新节点
  • docker service
命令 说明
docker service create 创建服务
docker service ls 查看所有服务
docker service inspect 服务名称|服务ID 查看服务详情
docker service logs 服务名称|服务ID 查看服务日志
docker service rm 服务名称|服务ID 删除服务(-f强制删除)
docker service scale 服务名称|服务ID=n 设置服务数量
docker service update 服务名称|服务ID 更新服务

集群部署

  • 环境准备

    • 修改主机名
      • 可以通过 hostname 主机名 修改机器的主机名(立即生效,重启后失效);
      • 或者 hostnamectl set-hostname 主机名 修改机器的主机名(立即生效,重启也生效);
      • 或者 vi /etc/hosts 编辑 hosts 文件,如下所示, 给 127.0.0.1 添加主机名(重启生效)。
    • 开放端口或者关闭防火墙
      • TCP 端口 2377,用于集群管理通信;
      • TCP 和 UDP 端口 7946,用于节点之间通信;
      • UDP 端口 4789,用于覆盖网络。
  • 集群操作

    • 创建集群

      ​ 在任意节点下通过 docker swarm init 命令创建一个新的 Swarm 集群并加入,且该节点会默认成为 Manager 节点。根据我们预先定义的角色,在 101 ~ 103 的任意一台机器上运行该命令即可。

        通常,第一个加入集群的管理节点将成为 Leader,后来加入的管理节点都是 Reachable。当前的 Leader 如果挂掉,所有的 Reachable 将重新选举一个新的 Leader。

      docker swarm init --advertise-addr 192.168.10.101
      
    • 加入集群

      默认情况下,通过 docker swarm init 命令创建一个新的 Swarm 集群时,Manager 节点会生成新的根证书颁发机构(CA)和密钥对,用于保护与加入群集的其他节点之间的通信安全。

        Manager 节点会生成两个令牌,供其他节点加入集群时使用:一个 Worker 令牌,一个 Manager 令牌。每个令牌都包括根 CA 证书的摘要和随机生成的密钥。当节点加入群集时,加入的节点使用摘要来验证来自远程管理节点的根 CA 证书。远程管理节点使用密钥来确保加入的节点是批准的节点。

      • Manager

        docker swarm join-token manager
        docker swarm join --token 管理者令牌
        
      • Worker

        docker swarm join-token worker
        docker swarm join --token 工人令牌
        
    • 查看集群信息

      在任意 Manager 节点中运行 docker info 可以查看当前集群的信息。

      docker info
      
  • 节点操作

    • 查看节点

      在任意 Manager 节点中运行 docker node ls 可以查看当前集群节点信息。

      节点 MANAGER STATUS 说明:表示节点是属于 Manager 还是 Worker,没有值则属于 Worker 节点。

      • Leader:该节点是管理节点中的主节点,负责该集群的集群管理和编排决策;
      • Reachable:该节点是管理节点中的从节点,如果 Leader 节点不可用,该节点有资格被选为新的 Leader;
      • Unavailable:该管理节点已不能与其他管理节点通信。如果管理节点不可用,应该将新的管理节点加入群集,或者将工作节点升级为管理节点。

      节点 AVAILABILITY 说明:表示调度程序是否可以将任务分配给该节点。

      • Active:调度程序可以将任务分配给该节点;
      • Pause:调度程序不会将新任务分配给该节点,但现有任务仍可以运行;
      • Drain:调度程序不会将新任务分配给该节点,并且会关闭该节点所有现有任务,并将它们调度在可用的节点上。
      docker node ls
      
    • 删除节点

      • Manager

        • 先将该节点的 AVAILABILITY 改为 Drain。其目的是为了将该节点的服务迁移到其他可用节点上,确保服务正常。最好检查一下容器迁移情况,确保这一步已经处理完成再继续往下。

          docker node update --availability drain 节点名称|节点ID 
          
        • 将该 Manager 节点进行降级处理,降级为 Worker 节点。

          docker node demote 节点名称|节点ID 
          
        • 在已经降级为 Worker 的节点中运行以下命令,离开集群。

          docker swarm leave 
          
        • 在管理节点中对刚才离开的节点进行删除

          docker node rm 节点名称|节点ID
          
      • Worker

        • 先将该节点的 AVAILABILITY 改为 Drain。其目的是为了将该节点的服务迁移到其他可用节点上,确保服务正常。最好检查一下容器迁移情况,确保这一步已经处理完成再继续往下。

          docker node update --availability drain 节点名称|节点ID 
          
        • 在准备删除的 Worker 节点中运行以下命令,离开集群。

          docker swarm leave 
          
        • 在管理节点中对刚才离开的节点进行删除。

          docker node rm 节点名称|节点ID
          
  • 服务操作

    跟集群管理有关的任何操作,都是在 Manager 节点上操作的。

    • 创建服务

      服务会被随机指派给一个工作节点运行。

      # 创建服务
      	docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
      	Options:
              --replicas :服务实例个数
              --name :服务名称
              --update-delay:定义滚动更新的时间间隔;
              --update-parallelism:定义并行更新的副本数量,默认为 1;
              --update-failure-action:定义容器启动失败之后所执行的动作;
              --rollback-monitor:定义回滚的监控时间;
              --rollback-parallelism:定义并行回滚的副本数量;
              --rollback-max-failure-ratio:任务失败回滚比率,超过该比率执行回滚操作,0.2 表示 20%。
      
    • 查看服务

      # 查看服务列表
      	docker service ls [OPTIONS]
      # 查看服务的元数据
      	docker service inspect [OPTIONS] SERVICE [SERVICE...]
      # 查看服务运行节点
      	docker service ps [OPTIONS] SERVICE [SERVICE...]
      
    • 弹性服务

      # 设置服务副本
      	docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...]
      # 服务更新
      	docker service update [OPTIONS] SERVICE
      	Options:
      		--replicas :服务实例个数
      		--image string :滚动更新
      		--rollback :回滚服务
      
    • 删除服务

      # 删除服务
      	docker service rm SERVICE [SERVICE...]
      

Docker Stack

分布式集群同时编排多个服务。

对比Docker Compose

  • Docker Stack会忽略了“构建”指令,无法使用stack命令构建新镜像,它是需要镜像是预先已经构建好的。 所以Docker Compose更适合于开发场景;
  • Docker Compose是一个Python项目,在内部,它使用Docker API规范来操作容器。所以需要安装Docker Compose,以便与Docker一起在您的计算机上使用;
  • Docker Stack功能包含在Docker引擎中。你不需要安装额外的包来使用它,Docker Stack 只是swarm mode的一部分。
  • Docker Stack不支持基于第2版写的docker-compose.yml ,也就是version版本至少为3。然而Docker Compose对版本为2和3的 文件仍然可以处理;
  • Docker Stack把Docker Compose的所有工作都做完了,因此docker stack将占主导地位。同时,对于大多数用户来说,切换到使用docker stack既不困难,也不需要太多的开销。如果您是Docker新手,或正在选择用于新项目的技术,请使用docker stack。

常用命令

命令 描述
docker stack deploy 部署新的堆栈或更新现有堆栈
docker stack ls 列出现有堆栈
docker stack ps 列出堆栈中的任务
docker stack rm 删除一个或多个堆栈
docker stack services 列出堆栈中的服务

Docker Secret

原理

manager节点保持状态的一致是通过Raft Database这个分布式存储的数据库,它本身就是将信息进行了secret,所以可以利用这个数据库将一些敏感信息,例如账号、密码等信息保存在这里,然后通过给service授权的方式允许它进行访问,这样达到避免密码明文显示的效果。

  secret的Swarm中secret的管理通过以下步骤完成:

  • secret存在于Swarm Manager节点的的Raft Database里
  • secret可以assign给一个service,然后这个service就可以看到这个secret
  • 在container内部secret看起来像文件,实际上就是内存

常用命令

命令 描述
docker secret create 创建一个secret文件
docker secret inspect 显示一个或多个secret文件的详细信息
docker secret ls 列出secret文件
docker secret rm 删除一个或多个secret文件

Docker Config

常用命令

命令 描述
docker config create 从文件或标准输入创建config
docker config inspect 查看config文件详细信息
docker config ls 查看config文件列表
docker config rm 删除config文件

参考链接

posted @ 2022-03-11 22:13  Faetbwac  阅读(116)  评论(0编辑  收藏  举报