1.Docker Compose
参考文档:官方 Docker Compose 文档
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Compose 使用的三个步骤:
- 使用 Dockerfile 定义应用程序的环境。
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 最后,执行 docker-compose up 命令来启动并运行整个应用程序(如果想后台执行,也可以 docker compose up -d)。
示例:
# yaml 配置实例
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
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
检查是否安装成功
docker-compose --version
>>>>
docker-compose version 1.24.1, build 4667896b
执行后可能会提示
-bash: /usr/local/bin/docker-compose: Permission denied
是文件权限问题,执行以下语句,授予权限
sudo chmod +x /usr/local/bin/docker-compose
1.2、指令说明
如果指令记不清的话,可以通过 docker-compose --help
进行查询
version
指定本 yml 依从的 compose 哪个版本制定的。
Docker 版本和 Docker Compose 版本对应表build
根据 dockerfile 构建镜像container_name
指定自定义容器名称,而不是生成的默认名称。container_name: my-web-container
depends_on
设置依赖关系
以上就说明在 先启动 db,redis 再启动 web。当然也不是 web 等到 db 和 redis 启动完毕后才启动。
在停止(docker-compose stop )的时候 先停止 web,再停止 db ,redisversion: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
entrypoint
作用与 Dockerfile 一致,用来覆盖 Dockerfile 中的entrypoint。env_file
从文件中获取环境变量,可以是单个值或列表的多个值。
也可以是列表env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
environment
添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。environment:
RACK_ENV: development
SHOW: 'true'
expose
expose暴露容器给link到当前容器的容器,和ports的区别是,expose不会将端口暴露给主机。image
指定容器运行的镜像。以下格式都可以:image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd # 镜像id
network_mode
设置网络模式network_mode: "bridge" # 桥接
network_mode: "host" # 和宿主机一致
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
restart
重启容器的方式- no:(默认重启策略),在任何情况下都不会重启容器
- always:容器总是重新启动
- on-faliure:在容器非正常退出时(退出状态非0),才会重启容器
- unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
注:swarm 集群模式,请改用 restart_policy。restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
volumes
将主机的数据卷或着文件挂载到容器里。
1.3、运行
在 docker-compose.yml 所在目录执行一下命令行
docker-compose up
如果想在后台运行,则可以追加 -d
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 文件
tar -zxf harbor-offline-installer-v2.1.2.tgz
# 解压后
harbor harbor-offline-installer-v2.1.2.tgz
2.1.2、证书(https 才需要)
后续需要修改 harbor 默认配置文件,默认是 http 和 https 都开启,则 htpps需要生成证书,如果关闭 https 访问,则可跳过。推荐使用证书认证,不然在 push 时可能出现问题
2.1.3、配置
修改默认配置
# 进入解压后的目录
cd harbor/
# 配置文件修改名称
mv harbor.yml.tmpl harbor.yml
修改配置文件
vi harbor.yml
修改内容
# (第5行)主机名,可以是 IP 也可以是域名。如果是域名,需要在 /etc/hosts 中配置 ip 域名映射关系
5 hostname: reg.mydomain.com
# (第10行)端口,默认 80,只有在冲突时候才需要修改(非必须)
10 port: 80
# (第17,18行) 修改证书地址 ,2.1.2 中提到的证书,如果不想使用 https 方式,将 13-19 行都注释掉
17 certificate: /your/certificate/path
18 private_key: /your/private/key/path
# (第34行) 管理员 admin 登录密码,默认 Harbor12345,
# 只有首次修改才会生效,安装后只能通过UI进行修改(非必须)
34 harbor_admin_password: Harbor12345
# (第39行) mysql 数据库密码,默认 root123 (非必须)
39 password: root123
后续如果想修改配置文件,则需 重启 docker-compose 使配置生效
# 停止 docker-compose
docker-compose stop
# 启动
docker-compose up -d
2.1.4、安装
# 下载准备镜像
./prepare
# 安装
./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
安装完毕后,通过 ip(默认端口 80 可省略)即可访问,默认 账号:admin,密码:Harbor12345
2.1.5、docker 登录连接
因为刚才配置的 hostname
是通过域名,则此时登录连接也是需要通过域名访问
docker login harbor.com
2.1.6、打包,推送
在打包推送之前,需要先确认远程服务器上有对应的仓库,点击页面中 项目-> 新建项目
,输入仓库名即可。
示例域名:harbor23.com
示例仓库名是:harbor
如果不记得打包,推送相关命令,可以在前端页面菜单中复制
2.1.7、卸载
删除相关文件
rm -rf `find / -name harbor`
停止相关容器
此处直接停止全部容器,可针对性停止 harbor 相关容器
docker stop $(docker ps -aq)
- 删除相关容器
此处直接删除全部容器,可针对性删除 harbor 相关容器
docker rm $(docker ps -aq)
- 删除相关镜像
此处直接删除全部镜像,可针对性删除 harbor 相关镜像
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 节点下线都不影响整体集群的高可用。<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
一个服务是任务的定义,管理机或工作节点上执行。它是群体系统的中心结构,是用户与群体交互的主要根源。创建服务时,需要指定要使用的容器镜像。
- 任务与调度
任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点
3.3、关键字说明
参考文档:官方 docker swarm 文档
3.3.1、swarm
查看指令关键字的参数(操作内容)
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 - 初始化
初始化一个 集群,它自身也有多个参数
docker swarm init --help
Usage: docker swarm init [OPTIONS]
Initialize a swarm
Options:
# 设置一个集群的 主管理节点
--advertise-addr string Advertised address (format:
示例:
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:通过令牌的方式加入集群
# 获取 manager join 的令牌
docker swarm join-token manager
# 获取 workder join 的令牌
docker swarm join-token worker
运行后,或给出对应角色加入的令牌
docker swarm join --token SWMTKN-1-3ih7yh9b0hsl4xxbskmg1qlvr8ucaxqijgthnx4c1t4vdtdrzy-0i5skbdaf1jsuryse7g9tv7u8 192.168.111.135:2377
在操作完全部服务器后,可以查看下整体的集群情况 `docker node ls`
示例(2主2从)
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
0iee36zz064oo4771qrvniltq * localhost.localdomain Ready Active Leader 20.10.11
b31qmgytz3deycwsg38vop920 localhost.localdomain Ready Active 20.10.11
jr2sf8oqwovmkbk3a0ndxu4mc localhost.localdomain Ready Active 20.10.11
nh5py3c0ki8zprbbkep2aqqmb localhost.localdomain Ready Active Reachable 20.10.11
AVAILABILITY 说明该节点的状态
- Active:正常
- Down:下线
MANAGER 说明服务器节点的属性,如果是
- 空白 :则说明是工作节点
- Leader:则说明是 Manager 节点
- Reachable:则说明是 Manager 节点,和其他 Manager 节点可达
3.3.1.3、leave - 离开
该节点脱离集群
docker swarm leave
3.3.2、service
参考文档:官方 docker service
一次性声明定义多个服务,在服务中可以声明创建的镜像、副本数量、对外暴露端口等等。
因为在集群的前提下,所以多个服务也是在同一个集群中,如果创建成功,则访问集群中任意 节点都是可以的。
查看下属参数
docker service --help
>>>
Usage: docker service COMMAND
Manage services
Commands:
create Create a new service
inspect Display detailed information on one or more services
logs Fetch the logs of a service or task
ls List services
ps List the tasks of one or more services
rm Remove one or more services
rollback Revert changes to a service's configuration
scale Scale one or multiple replicated services
update Update a service
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 - 创建
创建一个新的服务。可以一次性创建多个,声明对外暴露的端口等等
docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
示例:
docker service create --replicas 3 --name my_nginx -p 8888:80 nginx
## --replicas 3 创建了3个副本(副本会在集群中任意节点中创建,不区分 Manger /Worker),非必填
## --name xxx 服务自定义的名称
## -p 对外暴露的端口
## nginx 镜像的名称
运行后会在集群中包含的服务器(节点)中任意节点中启动副本,查看副本启动地方的方式
docker ps
3.3.2.2、inspect - 查看信息
可以查看 service 的信息
docker service inspect [OPTIONS] SERVICE [SERVICE...]
示例:
docker service inspect my_nginx
可以查看比如 端口信息,镜像信息等等
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 8888,
"PublishMode": "ingress"
}
]
3.3.2.3、ps - 查看运行中服务
查看正在运行中的服务
docker service ps [OPTIONS] SERVICE [SERVICE...]
示例:
docker service ps my_nginx
>>>>
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
9tgzu4mh3t9a my_nginx.1 nginx:latest localhost.localdomain Running Running 16 minutes ago
b5ltu6rlk2le my_nginx.2 nginx:latest localhost.localdomain Running Running 16 minutes ago
e9aoakl1zl2y my_nginx.3 nginx:latest localhost.localdomain Running Running 16 minutes ago # 服务数量,状态,ID...
3.3.2.4、 ls - 查看服务列表
查看已经配置的服务列表
docker service ls [OPTIONS]
示例:
docker service ls
>>>
ID NAME MODE REPLICAS IMAGE PORTS
43cqde7pie9g my_nginx replicated 3/3 nginx:latest *:8888->80/tcp
#ID 名称 模式:副本 副本数 源镜像 端口信息 对外端口:内部端口
3.3.2.5、rm - 移除服务
移除已存在的 service
docker service rm SERVICE [SERVICE...]
示例:
docker service rm my_nginx
3.3.2.6、update 和 scale - 修改
update 和 scale 其实作用不一致,但是它们都有扩容的作用
- update:修改 service 的属性
docker service update [OPTIONS] SERVICE
示例:
docker service update --replicas 7 my_nginx
# 修改 my_nginx 服务副本数量为 7
- scale :扩容。修改副本的数量
docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...]
示例:
docker service scale my_nginx=7
# 扩容,修改 my_nginx 服务副本数为 7
3.3.3、node
一个节点是docker引擎集群的一个实例。您还可以将其视为Docker节点。您可以在单个物理计算机或云服务器上运行一个或多个节点,但生产群集部署通常包括分布在多个物理和云计算机上的Docker节点。
要将应用程序部署到swarm,请将服务定义提交给 管理器节点。管理器节点将称为任务的工作单元分派 给工作节点。
3.3.3.1、节点降级 demote
从 swarm 中的 manager 中降级一个或多个节点
docker node demote <node name>
3.3.3.2、详情 inspect
显示一个或多个节点的详细信息
默认情况下,此命令将所有结果呈现在 JSON 数组中。您可以指定替代格式来为每个结果执行给定的模板
名称、简写 | 说明 |
---|---|
—format , -f | 使用给定的 Go 模板格式化输出 |
—pretty | 以人性化的格式打印信息 |
docker node inspect <node name>
3.3.3.3、列表 ls
列出 swarm 中的节点
docker node ls
3.3.3.4、节点升级 promote
将一个或多个节点提升为 swarm 中的管理器
docker node promote <node name>
3.3.3.4、任务列表 ps
列出一个或多个节点上运行的任务,默认为当前节点。
docker node ps swarm-manager1
列出 Docker 知道的节点上的所有任务。您可以使用-for—filter标志进行过滤 。目前支持的过滤器有:
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”
<a name="EoNk8"></a>
####
<a name="OQv1j"></a>
#### 3.3.3.5、节点移除 rm
从 swarm 中移除一个或多个节点
```shell
docker node rm swarm-node-02
3.3.3.6、节点更新 update
更新节点,更新有关节点的元数据,例如其可用性、标签或角色。
docker node update --label-add foo worker1