石一歌的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:
端口模式
- published:
- target:
ports: - "80:80" - "8080:8080" --- ports: - target: 80 # 容器端口 published: 8080 # 宿主机端口 protocol: tcp # 协议类型 mode: host # host 在每个节点上发布主机端口, ingress 对于群模式端口进行负载均衡
- SHORT 格式
-
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:
只读权限
- source:
- type:
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客户端发来的请求,调度适合的节点来运行容器
核心概念
- 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)上。
-
Service
服务(Service)是一个抽象的概念,是对要在管理节点或工作节点上执行的任务的定义。它是集群系统的中心结构,是用户与集群交互的主要根源。Swarm 创建服务时,可以为服务定义以下信息:
- 服务名称;
- 使用哪个镜像来创建容器;
- 要运行多少个副本;
- 服务的容器要连接到哪个网络上;
- 要映射哪些端口。
-
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。
- Replicated Services:当服务需要动态扩缩容时,只需通过
工作流程
Swarm Manager:
- API:接受命令并创建 service 对象(创建对象)
- orchestrator:为 service 对象创建的 task 进行编排工作(服务编排)
- allocater:为各个 task 分配 IP 地址(分配 IP)
- dispatcher:将 task 分发到 nodes(分发任务)
- scheduler:安排一个 worker 节点运行 task(运行任务)
Worker Node:
- worker:连接到调度器,检查分配的 task(检查任务)
- executor:执行分配给 worker 节点的 task(执行任务)
Overlay 网络
Overlay 网络其实并不是一门新技术,它是指构建在另一个网络上的计算机网络,这是一种网络虚拟化技术的形式,近年来云计算虚拟化技术的演进促进了网络虚拟化技术的应用。所以 Overlay 网络就是建立在另一个计算机网络之上的虚拟网络,它是不能独立出现的,Overlay 底层依赖的网络就是 Underlay 网络。
Underlay 网络是专门用来承载用户 IP 流量的基础架构层,它与 Overlay 网络之间的关系有点类似物理机和虚拟机。Underlay 网络和物理机都是真正存在的实体,它们分别对应着真实存在的网络设备和计算设备,而 Overlay 网络和虚拟机都是依托在下层实体的基础之上,使用软件虚拟出来的层级。在 Docker 版本 1.12 以后 Swarm 模式原生已支持覆盖网络(Overlay Network),只要是这个覆盖网络内的容器,不管在不在同一个宿主机上都能相互通信,即跨主机通信。不同覆盖网络内的容器之间是相互隔离的(相互 ping 不通)。
Overlay 网络是目前主流的容器跨节点数据传输和路由方案。当然,容器在跨主机进行通信的时候,除了可以使用 overlay 网络模式进行通信之外,还可以使用 host 网络模式,直接使用物理机的 IP 地址就可以进行通信。
调度策略
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文件 |