Docker Compose 和 Docker Swarm 和 Docker Service

Docker Compose

介绍

通过yml文件配置,高效管理多个docker,启停

中文文档

https://www.php.cn/manual/view/36129.html

安装

# 慢
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 国内镜像
$ sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

授权文件

$ sudo chmod +x /usr/local/bin/docker-compose

测试

$ docker-compose --version
docker-compose version 1.27.4, build 1110ad01

卸载

sudo rm /usr/local/bin/docker-compose

测试使用(官方给的)

1创建文件夹

$ mkdir composetest
$ cd composetest

2写测试程序Python。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)

3创建py文件依赖文件requirements.txt

flask
redis

4创建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"]

5创建docker-compose.yml

# version: "3.9" 需要版本对应
version: "3"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

6使用Compose构建并运行应用程序

docker-compose up
# 后台运行
# docker-compose up -d

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-87feppxX-1608950922543)(C:\Users\admin\AppData\Local\Temp\1608866566146.png)]

  1. docker images 自动下载依赖镜像
  2. 默认服务名: 文件名 _ 服务名 _ num(集群副本数量)
  3. 创建docker compose自己默认网络,并将所有启动的容器添加到网络中
  4. 在同一网络下可以直接使用域名访问

停止

# 前端运行使用 ctrl + c 停止
# 后台运行使用
docker-compose stop

yml文件规则

version: "3" # docker-compose核心版本
services: # 服务
	fw: # 服务名称
		image: redis # 服务配置
		ports: # 服务配置2
      		- "5000:5000"
      	depends_on: # 依赖(启动顺序)
      		- fw2
      		- redis
      	..... # 容器启动的所有配置
	fw2: 
		image: # 服务配置

官方文档 https://docs.docker.com/compose/compose-file/compose-file-v2/

测试开源程序(官方给的)

创建工作文件夹 my_wordpress/

创建docker-compose.yml

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
volumes:
    db_data: {}

后台运行

docker-compose up -d

Docker Swarm

  • 集群
  • 必须有两个或两个以上主节点才能运行

Docker Compose 和 Docker Swarm 和 Docker Service

[root@centos3 ~]# docker swarm --help

Usage:  docker swarm COMMAND

Manage Swarm

Commands:
  ca          管理根CA
  init        初始化集群
  join        加入集群
  join-token  创建加入令牌
  leave       离开集群
  unlock      解锁群
  unlock-key  管理解锁密钥
  update      更新集群

Run 'docker swarm COMMAND --help' for more information on a command.

1初始化一个集群

docker swarm init [OPTIONS]
名字,简写 默认 描述
–advertise-addr 通告地址(格式:<ip | interface>:端口)
–autolock 启用管理器自动锁定(需要解锁密钥才能启动停止的管理器)
–availability active 节点的可用性(“活动”|“暂停”|“漏”)
–cert-expiry 2160h0m0s 节点证书的有效期(ns | us | ms | s | m | h)
–data-path-addr 用于数据路径流量的地址或接口(格式:<ip | interface>)
–dispatcher-heartbeat 5S 调度员心跳周期(ns | us | ms | s | m | h)
–external-ca 一个或多个证书签名端点的规格
–force-new-cluster 强制从当前状态创建一个新的群集
–listen-addr 0.0.0.0:2377 监听地址(格式:<ip | interface>:端口)
–max-snapshots 0 要保留的附加木筏快照的数量
–snapshot-interval 10000 Raft快照之间的日志条目数
–task-history-limit 5 任务历史保留限制
# 初始化集群
docker swarm init --advertise-addr 192.168.0.191

2加入一个节点

docker swarm join [OPTIONS] HOST:PORT
名字,简写 默认 描述
–advertise-addr 通告地址(格式:<ip | interface>:端口)
–availability active 节点的可用性(“活动”|“暂停”|“漏”)
–data-path-addr 用于数据路径流量的地址或接口(格式:<ip | interface>)
–listen-addr 0.0.0.0:2377 监听地址(格式:<ip | interface>:端口)
–token 进入群的令牌
# 例如加入一个节点
# 令牌SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2
docker swarm join --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 192.168.0.191:2377

3获取令牌

docker swarm join-token [OPTIONS] (worker|manager)
# 工作令牌
docker swarm join-token worker
# 管理令牌
docker swarm join-token manager

查看节点

# 查看节点
docker node

Docker Service

docker service COMMAND
命令 描述
docker service create 创建一项新服务
docker service inspect 显示一项或多项服务的详细信息
docker service logs 获取服务或任务的日志
docker service ls 列出服务
docker service ps 列出一项或多项服务的任务
docker service rm 删除一项或多项服务
docker service scale 扩展一个或多个复制服务
docker service update 更新服务

1创建服务

docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
名字,简写 默认 描述
–config 指定配置以暴露给服务
–constraint 展示位置限制
–container-label 容器标签
–credential-spec 托管服务帐户的凭证规范(仅限Windows)
–detach,-d 真正 立即退出,而不是等待服务收敛
–dns 设置自定义DNS服务器
–dns-option 设置DNS选项
–dns-search 设置自定义DNS搜索域
–endpoint-mode 要人 端点模式(vip或dnsrr)
–entrypoint 覆盖图像的默认入口点
–env,-e 设置环境变量
–env-file 读入环境变量文件
–group 为容器设置一个或多个补充用户组
–health-cmd 运行以检查运行状况的命令
–health-interval 运行检查之间的时间(ms | s | m | h)
–health-retries 0 需要报告不健康的连续失败
–health-start-period 在重新计数到不稳定(ms | s | m | h)之前,容器初始化的开始时间段
–health-timeout 允许一次检查运行的最长时间(ms | s | m | h)
–host 设置一个或多个自定义主机到IP映射(主机:IP)
–hostname 容器主机名
–label, -l 服务标签
–limit-CPU 限制CPU
–limit-memory 0 限制记忆
–log-driver 记录驱动程序的服务
–log-OPT 记录驱动程序选项
–mode 复制 服务模式(复制或全局)
–mount 将文件系统挂载附加到服务
–name 服务名称
–network 网络附件
–no-healthcheck 禁用任何容器指定的HEALTHCHECK
–no-resolve-image 不要查询注册表来解析图像摘要和支持的平台
–placement-PREF 添加展示位置首选项
–publish,-p 将端口发布为节点端口
–quiet,-q 抑制进度输出
–read-only 将容器的根文件系统挂载为只读
–replicas 任务数量
–reserve-CPU 预留CPU
–reserve-memory 0 保留内存
–restart-condition 满足条件时重新启动(“none”|“on-failure”|“any”)(默认为“any”)
–restart-delay 重启尝试之间的延迟(ns | us | ms | s | m | h)(默认5秒)
–restart-max-attempts 放弃前的最大重启次数
–restart-window 用于评估重新启动策略的窗口(ns | us | ms | s | m | h)
–rollback-delay 0 任务回滚之间的延迟(ns | us | ms | s | m | h)(默认值为0)
–rollback-failure-action 回滚失败的操作(“暂停”|“继续”)(默认“暂停”)
–rollback-max-failure-ratio 0 在回滚期间容忍的失败率(默认0)
–rollback-monitor 0 (ns | us | ms | s | m | h)(默认5秒)每个任务回滚之后的持续时间
–rollback-order 回滚顺序(“start-first”|“stop-first”)(默认“stop-first”)
–rollback-parallelism 1 同时回滚的任务的最大数量(0一次全部回滚)
–secret 指定泄露给服务的秘密
–stop-grace-period 强制杀死一个容器之前等待的时间(ns | us | ms | s | m | h)(默认10秒)
–stop-signal 停止容器的信号
–tty, -t 分配一个伪TTY
–update-delay 0 更新之间的延迟(ns | us | ms | s | m | h)(默认为0)
–update-failure-action 更新失败的操作(“暂停”|“继续”|“回滚”)(默认“暂停”)
–update-max-failure-ratio 0 更新期间容许的失败率(默认0)
–update-monitor 0 (ns | us | ms | s | m | h)(默认5秒)每个任务更新后的持续时间
–update-order 更新顺序(“start-first”|“stop-first”)(默认为“stop-first”)
–update-parallelism 1 同时更新的最大任务数(0个一次全部更新)
–user,-u 用户名或UID(格式:<名称| uid>:<组| gid>)
–with-registry-auth 向注册代理发送注册表认证详细信息
–workdir,-w 容器内的工作目录
# 例如,启动一个nginx服务,暴露8080端口
docker service create -p 8080:80 --name nginx01 nginx
# docker run 容器启动,单机版本
# docker service 服务启动,支持扩缩容器
# 查看服务
docker service ps nginx01
# 查看副本
docker service ls
# 查看详情
docker service inspect nginx01

2更新服务

docker service update [OPTIONS] SERVICE
名字,简写 默认 描述
–args 服务命令参数
–config-add 添加或更新服务上的配置文件
–config-RM 删除配置文件
–constraint-add 添加或更新展示位置约束
–constraint-RM 删除约束
–container-label-add 添加或更新容器标签
–container-label-rm 用钥匙取出容器标签
–credential-spec 托管服务帐户的凭证规范(仅限Windows)
–detach,-d 立即退出,而不是等待服务收敛
–dns-add 添加或更新自定义DNS服务器
–dns-option-add 添加或更新DNS选项
–dns-option-rm 删除一个DNS选项
–dns-rm 删除自定义的DNS服务器
–dns-search-add 添加或更新自定义DNS搜索域
–dns-search-rm 删除一个DNS搜索域
–endpoint-mode 端点模式(vip或dnsrr)
–entrypoint 覆盖图像的默认入口点
–env-add 添加或更新环境变量
–env-RM 删除一个环境变量
–force 即使没有更改需要,也强制更新
–group-add 向容器添加一个附加的补充用户组
–group-RM 从容器中删除先前添加的补充用户组
–health-cmd 运行以检查运行状况的命令
–health-interval 运行检查之间的时间(ms | s | m | h)
–health-retries 0 需要报告不健康的连续失败
–health-retries 在重新计数到不稳定(ms | s | m | h)之前,容器初始化的开始时间段
–health-timeout 允许一次检查运行的最长时间(ms | s | m | h)
–host加 添加或更新自定义主机到IP映射(主机:IP)
–host-RM 删除自定义的主机到IP映射(主机:IP)
–hostname 容器主机名
–image 服务图片标签
–label-add 添加或更新服务标签
–label-RM 用钥匙去除标签
–limit-CPU 限制CPU
–limit-memory 0 限制记忆
–log-driver 记录驱动程序的服务
–log-OPT 记录驱动程序选项
–mount-add 添加或更新服务上的装载
–mount-RM 通过目标路径移除一个安装
–network加 添加一个网络
–network-RM 删除网络
–no-healthcheck 禁用任何容器指定的HEALTHCHECK
–no-resolve-image 不要查询注册表来解析图像摘要和支持的平台
–placement-PREF-ADD 添加展示位置首选项
–placement-PREF-RM 删除展示位置偏好设置
–publish相加 添加或更新已发布的端口
–publish-RM 通过目标端口删除发布的端口
–quiet,-q 抑制进度输出
–read-only 将容器的根文件系统挂载为只读
–replicas 任务数量
–reserve-CPU 预留CPU
–reserve-memory 0 保留内存
–restart-condition 条件满足时重新启动(“none”|“on-failure”|“any”)
–restart-delay 重启尝试之间的延迟(ns | us | ms | s | m | h)
–restart-max-attempts 放弃前的最大重启次数
–restart-window 用于评估重新启动策略的窗口(ns | us | ms | s | m | h)
–rollback 回退到先前的规范
–rollback-delay 0 任务回滚之间的延迟(ns | us | ms | s | m | h)
–rollback-failure-action 回滚失败的操作(“暂停”|“继续”)
–rollback-max-failure-ratio 0 在回滚期间容忍的失败率
–rollback-monitor 0 每个任务回滚后监视失败的持续时间(ns | us | ms | s | m | h)
–rollback-order 回滚顺序(“start-first”|“stop-first”)
–rollback-parallelism 0 同时回滚的任务的最大数量(0一次全部回滚)
–secret-add 添加或更新服务的秘密
–secret-RM 去掉一个秘密
–stop-grace-period 强制杀死一个容器之前的等待时间(ns | us | ms | s | m | h)
–stop-signal 停止容器的信号
–tty, -t 分配一个伪TTY
–update-delay 0 更新之间的延迟(ns | us | ms | s | m | h)
–update-failure-action 更新失败的操作(“暂停”|“继续”|“回滚”)
–update-max-failure-ratio 0 更新期间容错的失败率
–update-monitor 0 (ns | us | ms | s | m | h)每个任务更新后的持续时间
–update-order 更新顺序(“start-first”|“stop-first”)
–update-parallelism 0 同时更新的最大任务数(0个一次全部更新)
–user,-u 用户名或UID(格式:<名称| uid>:<组| gid>)
–with-registry-auth 向注册代理发送注册表认证详细信息
–workdir,-w 容器内的工作目录
# 为 nginx01 创建 10 个副本
docker service update --replicas 10 nginx01 
# 或 使用 scale 命令
docker service scale nginx01=10

移除服务

docker service rm nginx01
上一篇:搭建docker swarm集群实现负载均衡


下一篇:IPFS私有集群的安装部署