1.Docker Compose

参考文档:菜鸟教程 - Docker Compose

参考文档:官方 Docker Compose 文档

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

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序(如果想后台执行,也可以 docker compose up -d)。

示例:

  1. # yaml 配置实例
  2. version: '3'
  3. services:
  4. web:
  5. build: .
  6. ports:
  7. - "5000:5000"
  8. volumes:
  9. - .:/code
  10. - logvolume01:/var/log
  11. links:
  12. - redis
  13. redis:
  14. image: redis
  15. volumes:
  16. logvolume01: {}

1.1、安装

  1. curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

检查是否安装成功

  1. docker-compose --version
  2. >>>>
  3. docker-compose version 1.24.1, build 4667896b

执行后可能会提示
-bash: /usr/local/bin/docker-compose: Permission denied
是文件权限问题,执行以下语句,授予权限

  1. sudo chmod +x /usr/local/bin/docker-compose

1.2、指令说明

如果指令记不清的话,可以通过 docker-compose --help 进行查询

  • version
    指定本 yml 依从的 compose 哪个版本制定的。
    Docker 版本和 Docker Compose 版本对应表


    3_Docker进阶 - 图1

  • build
    根据 dockerfile 构建镜像

  • container_name
    指定自定义容器名称,而不是生成的默认名称。

    1. container_name: my-web-container
  • depends_on
    设置依赖关系
    以上就说明在 先启动 db,redis 再启动 web。当然也不是 web 等到 db 和 redis 启动完毕后才启动。
    在停止(docker-compose stop )的时候 先停止 web,再停止 db ,redis

    1. version: "3.7"
    2. services:
    3. web:
    4. build: .
    5. depends_on:
    6. - db
    7. - redis
    8. redis:
    9. image: redis
    10. db:
    11. image: postgres
  • entrypoint
    作用与 Dockerfile 一致,用来覆盖 Dockerfile 中的entrypoint。

  • env_file
    从文件中获取环境变量,可以是单个值或列表的多个值。
    也可以是列表

    1. env_file: .env
    1. env_file:
    2. - ./common.env
    3. - ./apps/web.env
    4. - /opt/secrets.env
  • environment
    添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。

    1. environment:
    2. RACK_ENV: development
    3. SHOW: 'true'
  • expose
    expose暴露容器给link到当前容器的容器,和ports的区别是,expose不会将端口暴露给主机。

  • image
    指定容器运行的镜像。以下格式都可以:

    1. image: redis
    2. image: ubuntu:14.04
    3. image: tutum/influxdb
    4. image: example-registry.com:4000/postgresql
    5. image: a4bc65fd # 镜像id
  • network_mode
    设置网络模式

    1. network_mode: "bridge" # 桥接
    2. network_mode: "host" # 和宿主机一致
    3. network_mode: "none"
    4. network_mode: "service:[service name]"
    5. network_mode: "container:[container name/id]"
  • restart
    重启容器的方式

    • no:(默认重启策略),在任何情况下都不会重启容器
    • always:容器总是重新启动
    • on-faliure:在容器非正常退出时(退出状态非0),才会重启容器
    • unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
      1. restart: "no"
      2. restart: always
      3. restart: on-failure
      4. restart: unless-stopped
      注:swarm 集群模式,请改用 restart_policy。
  • volumes
    将主机的数据卷或着文件挂载到容器里。

1.3、运行

在 docker-compose.yml 所在目录执行一下命令行

  1. docker-compose up

如果想在后台运行,则可以追加 -d

  1. docker-compose up -d

2、自建Harbor

参考链接:【CSDN】Harbor仓库搭建及简单使用
其中涉及到的证书设置,参考链接【知乎】harbor镜像仓库-https访问的证书配置

2.1、环境与配置

2.1.1、环境

Harbor安装有在线版和离线版两种方式,在线版可以参照 [【CSDN】Harbor仓库搭建及简单使用](https://blog.csdn.net/qq_40378034/article/details/90752212) ,鉴于Harbor 软件较大(500+M)本次记录的是离线版的安装方式,下载地址:【github】goharbor / harbor/v2.1.1
下载后上传到任意地点即可
解压 tgz 文件

  1. tar -zxf harbor-offline-installer-v2.1.2.tgz
  2. # 解压后
  3. harbor harbor-offline-installer-v2.1.2.tgz

2.1.2、证书(https 才需要)

后续需要修改 harbor 默认配置文件,默认是 http 和 https 都开启,则 htpps需要生成证书,如果关闭 https 访问,则可跳过。推荐使用证书认证,不然在 push 时可能出现问题

2.1.3、配置

修改默认配置

  1. # 进入解压后的目录
  2. cd harbor/

image.png

  1. # 配置文件修改名称
  2. mv harbor.yml.tmpl harbor.yml

修改配置文件

  1. vi harbor.yml

修改内容

  1. # (第5行)主机名,可以是 IP 也可以是域名。如果是域名,需要在 /etc/hosts 中配置 ip 域名映射关系
  2. 5 hostname: reg.mydomain.com
  3. # (第10行)端口,默认 80,只有在冲突时候才需要修改(非必须)
  4. 10 port: 80
  5. # (第17,18行) 修改证书地址 ,2.1.2 中提到的证书,如果不想使用 https 方式,将 13-19 行都注释掉
  6. 17 certificate: /your/certificate/path
  7. 18 private_key: /your/private/key/path
  8. # (第34行) 管理员 admin 登录密码,默认 Harbor12345,
  9. # 只有首次修改才会生效,安装后只能通过UI进行修改(非必须)
  10. 34 harbor_admin_password: Harbor12345
  11. # (第39行) mysql 数据库密码,默认 root123 (非必须)
  12. 39 password: root123

后续如果想修改配置文件,则需 重启 docker-compose 使配置生效

  1. # 停止 docker-compose
  2. docker-compose stop
  3. # 启动
  4. docker-compose up -d

2.1.4、安装

  1. # 下载准备镜像
  2. ./prepare
  3. # 安装
  4. ./install.sh

如果在安装过程中出现 Error response from daemon: Get https://xxx/v2/: dial tcp xxx
则参考:Docker下搭建Harbor。容器内登陆报错:Error response from daemon: Get https://192.168.2.101/v2/: dial tcp 192.168
image.png
image.png
安装完毕后,通过 ip(默认端口 80 可省略)即可访问,默认 账号:admin,密码:Harbor12345
image.png
image.png

2.1.5、docker 登录连接

因为刚才配置的 hostname是通过域名,则此时登录连接也是需要通过域名访问

  1. docker login harbor.com

image.png

2.1.6、打包,推送

在打包推送之前,需要先确认远程服务器上有对应的仓库,点击页面中 项目-> 新建项目,输入仓库名即可。
示例域名:harbor23.com
示例仓库名是:harbor
如果不记得打包,推送相关命令,可以在前端页面菜单中复制
image.png
image.png
image.png
image.png

2.1.7、卸载

  • 删除相关文件

    1. rm -rf `find / -name harbor`
  • 停止相关容器

此处直接停止全部容器,可针对性停止 harbor 相关容器

  1. docker stop $(docker ps -aq)
  • 删除相关容器

此处直接删除全部容器,可针对性删除 harbor 相关容器

  1. docker rm $(docker ps -aq)
  • 删除相关镜像

此处直接删除全部镜像,可针对性删除 harbor 相关镜像

  1. docker rmi $(docker images -aq)

3、Docker Swarm

3.1、概念

Docker Swarm用于 管理 多个服务器上的 Docker 集群,更好地动态扩缩容

主要有以下几个关键字:

  • service
  • node

3.2、工作模式

  • Node
    节点。
    节点分为 管理者节点(Manager) 和 工作者节点(Worker),形成主从节点关系。Manager 之间是可以互相访问的,但是Worker 之间,Worker 访问 Manager 之间是不通的。
    并且 Manager 节点 遵循 Raft(一致性算法协议) ,限定 Manager 节点数的一半一定要大于 1,也即 Manager 节点数一定是大于等于3。如果只有2台 Manager ,则当其中一台异常下线,则另外一台在该协议下也会不能正常工作。但是如果是 3台,则其中1台异常下线,不会影响其他2台 Manager 继续工作,防止后续剩余2台再异常,保证了集群的高可用。
    但是,如果 Worker 并不需要遵循 Raft ,其中任意数量的 Worker 节点下线都不影响整体集群的高可用。

    1. <br />![](https://cdn.nlark.com/yuque/0/2022/png/25709938/1641540430308-990d1b59-6786-4ab7-bf88-b496b85cdc53.png#crop=0&crop=0&crop=1&crop=1&id=wNqJ9&originHeight=566&originWidth=1207&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
  • Service
    一个服务是任务的定义,管理机或工作节点上执行。它是群体系统的中心结构,是用户与群体交互的主要根源。创建服务时,需要指定要使用的容器镜像。

3_Docker进阶 - 图12

  • 任务与调度
    任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点

3_Docker进阶 - 图13

3.3、关键字说明

参考文档:官方 docker swarm 文档

3.3.1、swarm

查看指令关键字的参数(操作内容)

  1. docker swarm --help
指令 说明 示例
ca
init 初始化一个集群 docker swarm init —advertise-addr 192.168.111.135
join 将swarm作为节点或者管理器加入集群 docker swarm join —token SWMTKN-1-3ih7yh9b0hsl4xxbskmg1qlvr8ucaxqijgthnx4c1t4vdtdrzy-0i5skbdaf1jsuryse7g9tv7u8 192.168.111.135:2377
join-token 管理连接令牌 docker swarm join-token manager
leave 退出集群 docker swarm leave
unlock 解锁集群 docker swarm unlock
unlock-key 管理解锁密钥 docker swarm unlock-key
update 更新集群 docker swarm update —cert-expiry 720h

对以上指令进行说明

3.3.1.1、init - 初始化

初始化一个 集群,它自身也有多个参数

  1. docker swarm init --help

Usage: docker swarm init [OPTIONS] Initialize a swarm Options: # 设置一个集群的 主管理节点 --advertise-addr string Advertised address (format: [:port]) //...其他

示例:

  1. docker swarm init --advertise-addr 192.168.111.135

运行以上一行命令后,会创建一个 docker 集群,并且显示以下内容。但是此时该集群只有一个 本机主节点,需要设置其他服务器为 管理者/工作者 节点。

# 当前 Swarm 已经初始化,当前节点是一个 管理者节点 Swarm initialized: current node (0iee36zz064oo4771qrvniltq) is now a manager. # 如果想添加一个 Worker 节点,则可以使用以下命令 To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3ih7yh9b0hsl4xxbskmg1qlvr8ucaxqijgthnx4c1t4vdtdrzy-0a1vfhrzw82n9dp7i4n6w5rmb 192.168.111.135:2377 #如果想添加一个 Manager 节点,则可以使用以下命令,在Manager 节点中运行 docker swarm join-token manager来获取加入令牌 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

3.3.1.2、join和 join-token - 加入

join :加入集群

join-token:通过令牌的方式加入集群

  1. # 获取 manager join 的令牌
  2. docker swarm join-token manager
  3. # 获取 workder join 的令牌
  4. docker swarm join-token worker

运行后,或给出对应角色加入的令牌

  1. docker swarm join --token SWMTKN-1-3ih7yh9b0hsl4xxbskmg1qlvr8ucaxqijgthnx4c1t4vdtdrzy-0i5skbdaf1jsuryse7g9tv7u8 192.168.111.135:2377
  1. 在操作完全部服务器后,可以查看下整体的集群情况 `docker node ls`

示例(2主2从)

  1. ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
  2. 0iee36zz064oo4771qrvniltq * localhost.localdomain Ready Active Leader 20.10.11
  3. b31qmgytz3deycwsg38vop920 localhost.localdomain Ready Active 20.10.11
  4. jr2sf8oqwovmkbk3a0ndxu4mc localhost.localdomain Ready Active 20.10.11
  5. nh5py3c0ki8zprbbkep2aqqmb localhost.localdomain Ready Active Reachable 20.10.11

AVAILABILITY 说明该节点的状态

  • Active:正常
  • Down:下线

MANAGER 说明服务器节点的属性,如果是

  • 空白 :则说明是工作节点
  • Leader:则说明是 Manager 节点
  • Reachable:则说明是 Manager 节点,和其他 Manager 节点可达

3.3.1.3、leave - 离开

该节点脱离集群

  1. docker swarm leave

3.3.2、service

参考文档:官方 docker service

一次性声明定义多个服务,在服务中可以声明创建的镜像、副本数量、对外暴露端口等等。

因为在集群的前提下,所以多个服务也是在同一个集群中,如果创建成功,则访问集群中任意 节点都是可以的。

查看下属参数

  1. docker service --help
  2. >>>
  3. Usage: docker service COMMAND
  4. Manage services
  5. Commands:
  6. create Create a new service
  7. inspect Display detailed information on one or more services
  8. logs Fetch the logs of a service or task
  9. ls List services
  10. ps List the tasks of one or more services
  11. rm Remove one or more services
  12. rollback Revert changes to a service's configuration
  13. scale Scale one or multiple replicated services
  14. update Update a service
  15. Run 'docker service COMMAND --help' for more information on a command.
指令 说明 示例
create 创建一个service docker service create —replicas 3 —name my_nginx -p 8888:80 nginx
inspect 查看配置详情 docker service inspect my_nginx
logs 查看日志 docker service logs xxx
ls 列表 docker service ls
ps 一个或者多个列表 docker service ps
rm 移除 docker service rm xxx
rollback 回滚配置
scale 扩缩容副本 docker service scale my_nginx=7
update 更新、修改 docker service update —replicas 7 my_nginx

3.3.2.1、create - 创建

创建一个新的服务。可以一次性创建多个,声明对外暴露的端口等等

  1. docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]

示例:

  1. docker service create --replicas 3 --name my_nginx -p 8888:80 nginx
  2. ## --replicas 3 创建了3个副本(副本会在集群中任意节点中创建,不区分 Manger /Worker),非必填
  3. ## --name xxx 服务自定义的名称
  4. ## -p 对外暴露的端口
  5. ## nginx 镜像的名称

运行后会在集群中包含的服务器(节点)中任意节点中启动副本,查看副本启动地方的方式

  1. docker ps

3.3.2.2、inspect - 查看信息

可以查看 service 的信息

  1. docker service inspect [OPTIONS] SERVICE [SERVICE...]

示例:

  1. docker service inspect my_nginx

可以查看比如 端口信息,镜像信息等等

  1. "Ports": [
  2. {
  3. "Protocol": "tcp",
  4. "TargetPort": 80,
  5. "PublishedPort": 8888,
  6. "PublishMode": "ingress"
  7. }
  8. ]

3.3.2.3、ps - 查看运行中服务

查看正在运行中的服务

  1. docker service ps [OPTIONS] SERVICE [SERVICE...]

示例:

  1. docker service ps my_nginx
  2. >>>>
  3. ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
  4. 9tgzu4mh3t9a my_nginx.1 nginx:latest localhost.localdomain Running Running 16 minutes ago
  5. b5ltu6rlk2le my_nginx.2 nginx:latest localhost.localdomain Running Running 16 minutes ago
  6. e9aoakl1zl2y my_nginx.3 nginx:latest localhost.localdomain Running Running 16 minutes ago # 服务数量,状态,ID...

3.3.2.4、 ls - 查看服务列表

查看已经配置的服务列表

  1. docker service ls [OPTIONS]

示例:

  1. docker service ls
  2. >>>
  3. ID NAME MODE REPLICAS IMAGE PORTS
  4. 43cqde7pie9g my_nginx replicated 3/3 nginx:latest *:8888->80/tcp
  5. #ID 名称 模式:副本 副本数 源镜像 端口信息 对外端口:内部端口

3.3.2.5、rm - 移除服务

移除已存在的 service

  1. docker service rm SERVICE [SERVICE...]

示例:

  1. docker service rm my_nginx

3.3.2.6、update 和 scale - 修改

update 和 scale 其实作用不一致,但是它们都有扩容的作用

  • update:修改 service 的属性
  1. docker service update [OPTIONS] SERVICE

示例:

  1. docker service update --replicas 7 my_nginx
  2. # 修改 my_nginx 服务副本数量为 7
  • scale :扩容。修改副本的数量
  1. docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...]

示例:

  1. docker service scale my_nginx=7
  2. # 扩容,修改 my_nginx 服务副本数为 7

3.3.3、node

一个节点是docker引擎集群的一个实例。您还可以将其视为Docker节点。您可以在单个物理计算机或云服务器上运行一个或多个节点,但生产群集部署通常包括分布在多个物理和云计算机上的Docker节点。
要将应用程序部署到swarm,请将服务定义提交给 管理器节点。管理器节点将称为任务的工作单元分派 给工作节点。

3.3.3.1、节点降级 demote

从 swarm 中的 manager 中降级一个或多个节点

  1. docker node demote <node name>

3.3.3.2、详情 inspect

显示一个或多个节点的详细信息
默认情况下,此命令将所有结果呈现在 JSON 数组中。您可以指定替代格式来为每个结果执行给定的模板

名称、简写 说明
—format , -f 使用给定的 Go 模板格式化输出
—pretty 以人性化的格式打印信息
  1. docker node inspect <node name>

3.3.3.3、列表 ls

列出 swarm 中的节点

  1. docker node ls

3.3.3.4、节点升级 promote

将一个或多个节点提升为 swarm 中的管理器

  1. docker node promote <node name>

3.3.3.4、任务列表 ps

列出一个或多个节点上运行的任务,默认为当前节点。

  1. docker node ps swarm-manager1

列出 Docker 知道的节点上的所有任务。您可以使用-for—filter标志进行过滤 。目前支持的过滤器有:

  • 名称 name
  • ID id
  • 标签 label
  • 期望状态 desired-state ```shell

    name

    docker node ps -f name=redis swarm-manager1

id

docker node ps -f id=bg8c07zzg87di2mufeq51a2qp swarm-manager1

label

docker node ps -f “label=usage”

desired-state filter can take the values running, shutdown, or accepted.

docekr node ps -f “desired-state=running”

  1. <a name="EoNk8"></a>
  2. ####
  3. <a name="OQv1j"></a>
  4. #### 3.3.3.5、节点移除 rm
  5. 从 swarm 中移除一个或多个节点
  6. ```shell
  7. docker node rm swarm-node-02

3.3.3.6、节点更新 update

更新节点,更新有关节点的元数据,例如其可用性、标签或角色。

  1. docker node update --label-add foo worker1