Docker Compose
单机容器编排,一键批量管理多个容器,使用yaml格式:docker-compose.yml
-
Docker Compose V1(
docker-compose)-
命名形式:命令为
docker-compose(带连字符)。 -
开发语言:基于 Python 开发,是独立于 Docker 引擎的第三方工具。
-
在配置文件中显式指定
version字段)。
-
使用dockercompose部署wordpress(单机Docker环境)
# 创建一个名为docker-compose.yml的文件
vim docker-compose.yml
----------------------------------
version: '3.8'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: root123
MYSQL_ROOT_HOST: '%'
command: --default-authentication-plugin=mysql_native_password
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: root123
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
volumes:
db_data:
wp_data:
--------------------------------------
# 如果之前有下载过需要删除的(没有就省略)
docker compose down -v
# 启动服务
docker compose up -d
# 浏览器搜索192.168.221.21:8000

Docker私有镜像站-Harbor
私有镜像站,方便管理、下载部署内部的镜像;
## 下载Harbor
cd /opt
wget http://192.168.57.200/Software/harbor-offline-installer-v2.14.0.tgz
## 安装Harbor
tar -xvf harbor-offline-installer-v2.14.0.tgz
# 进入Harbor目录,后续都在这个目录里操作
cd harbor/
./install.sh
# 最后出现两行这个就说明正确了
# prepare base dir is set to /opt/harbor
# no config file: /opt/harbor/harbor.yml
# 修改配置文件中的主机名为本机IP
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
第五行的hostname改为192.168.221.21
## 创建密钥
# 1.进入证书目录
mkdir ssl
cd ssl/
# 2.创建本地私有密钥
openssl genrsa -out ssl.key 2048
# 3.按提示输入即可
openssl req -new -key ssl.key -out ssl.csr
# 4.创建证书crt
openssl x509 -req -days 1460 -in ssl.csr -signkey ssl.key -out ssl.crt
# 5.创建证书pem
openssl dhparam -out ssl.pem 2048
# 后面就是一堆点了,等待......
## 修改配置文件
vim harbor.yml
第17行的certificate改成/opt/harbor/ssl/ssl.crt
第18行的private_key改成/opt/harbor/ssl/ssl.key
第47行的密码可以改成root123,不改的话登陆密码就是原来的
./install.sh
# 最后出现✔ ----Harbor has been installed and started successfully.----
docker compose up -d
# 浏览器搜索IP就是Harbor的界面了
vim /etc/docker/daemon.json
"insecure-registries": [
在这个后面加两行"http://192.168.57.200:8099",
"http://192.168.221.21",
"https://192.168.221.21"
]
systemctl daemon-reload
systemctl restart docker
docker compose up -d
docker login http://192.168.221.21
docker login https://192.168.221.21
# 最后都出现Login Succeeded就对了
# 在项目中标记镜像:
docker tag SOURCE_IMAGE[:TAG] 192.168.221.21/library/REPOSITORY[:TAG]
# 推送镜像到当前项目:
docker push 192.168.221.21/library/REPOSITORY[:TAG]

Docker-Swarm
多主机容器集群管理工具;统一管理多台服务器上的Docker容器;
需要至少一个master节点:统一管理node节点和所有node节点上的容器;
相关命令
Docker Swarm命令:
init 初始化一个Swarm。
join 将Docker主机加入到Swarm作为工作节点或管理节点。
leave 使节点离开Swarm。
update 更新Swarm配置。
Docker Service命令:
create 创建一个新的服务。
inspect 检查一个或多个服务。
update 更新一个服务。
remove 移除一个或多个服务。
tasks 列出一个或多个服务的任务。
Docker Node命令:
accept 接受加入到Swarm的请求。
promote 将节点提升为Swarm中的管理节点。
demote 将管理节点降级为Swarm中的工作节点。
inspect 检查一个或多个节点。
update 更新一个节点。
tasks 列出分配给一个或多个节点的任务。
ls 列出Swarm中的节点。
rm 从Swarm中移除一个或多个节点。
Docker Stack命令:
config 输出最终的配置文件,在完成合并和插值后
deploy 部署一个新的堆栈或更新现有的堆栈
ls 列出堆栈
ps 列出堆栈中的任务
rm 移除一个或多个堆栈
services 列出堆栈中的服务
swam集群部署
- 192.168.221.21 Manager
- 192.168.221.22 Node1
- 192.168.221.23 Node2
# 1.安装Docker
apt update
apt-get -y install ca-certificates curl gnupg lsb-release
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt-get -y install docker-ce docker-ce-cli containerd.io
systemctl stop docker
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://0c105db5188026850f80c001def654a0.mirror.swr.myhuaweicloud.com",
"https://5tqw56kt.mirror.aliyuncs.com",
"https://docker.1panel.live",
"http://mirrors.ustc.edu.cn",
"http://mirror.azure.cn",
"https://hub.rat.dev",
"https://docker.chenby.cn",
"https://docker.hpcloud.cloud",
"https://docker.m.daocloud.io",
"https://docker.unsee.tech",
"https://dockerpull.org",
"https://dockerhub.icu",
"https://proxy.1panel.live",
"https://docker.1panel.top",
"https://docker.1ms.run",
"https://docker.ketches.cn"
],
"insecure-registries": [
"http://192.168.57.200:8099"
],
"hosts": [
"tcp://0.0.0.0:2375",
"unix:///var/run/docker.sock"
]
}
sed -i 's/ExecStart=\/usr\/bin\/dockerd -H fd:\/\/ --containerd=\/run\/containerd\/containerd.sock/ExecStart=\/usr\/bin\/dockerd --containerd=\/run\/containerd\/containerd.sock/' /lib/systemd/system/docker.service
systemctl daemon-reload
systemctl restart docker
# 2.所有节点设置 hosts 解析
cat >> /etc/hosts << EOF
192.168.221.21 server01
192.168.221.22 server02
192.168.221.23 server03
EOF
## 接下来分开操作
# 在第一台manager机器上(192.168.221.21操作)
# 3.初始化集群-init
docker swarm init --advertise-addr 192.168.221.21
# 保存第三行的命令与token令牌,用于添加工作节点;添加Manager节点到Swarm集群时,执行'docker swarm join-token manager'获取令牌
# 4.添加worker(node工作节点)到swarm集群(在另外两台22和23节点上操作)
# 复制你自己上一步中输出的完整命令到工作节点中。
docker swarm join --token SWMTKN-1-5q4ztzm6zd0fzdnxw7tprido1d2p38jb650mdujddianpo812n-b51z5ij8vqzlmcr56mluk4irg 192.168.221.21:2377
第三台机器同理
最后出现这一行 This node joined a swarm as a worker.
# 验证加入情况,确保三台机器都在(192.168.221.21操作)
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ifo32t0qq63nl6c2t3a3kio2h * server-21 Ready Active Leader 28.5.1
shzi3kedbzdvn5lmy5ovgp59s server-22 Ready Active 28.5.1
lctl7rf6k96dnvqy4bmqiaxvs server-23 Ready Active 28.5.1
# 在Docker集群中运行容器((192.168.221.21操作)无需下载nginx镜像)
# 1.在集群中创建overlay网络,让不同宿主上的容器可以在同一个网段内通信,方便搭建负载均衡
docker network create -d overlay nginx_net
docker network ls | grep nginx_net
会出现一行drht1x02my05 nginx_net overlay swarm
# 2.使用service创建相同容器的集群,replicas 3表示至少需要3个副本(三个都running则成功)
docker service create --replicas 3 --network nginx_net --name my_nginx -p 80:80 nginx
# 3.验证集群信息
# 查看正在运行服务的列表
docker service ls
# 查询Swarm中服务的信息(-pretty 使命令输出格式化为可读的格式,不加 --pretty 可以输出更详细的信息)
docker service inspect --pretty my_nginx
# 4.查看容器ID
docker ps
docker exec -it 容器ID /bin/bash
echo "nginx-1" > /usr/share/nginx/html/index.html
# 5.查看浏览器(反复刷新)
curl 192.168.221.21
扩容、缩容
scale是在Swarm中的动态扩展服务,它提供了容器复制的功能。 可以通过 docker service scale 命令来设置服务中容器的副本数。
# 将上面的 my_nginx 容器动态扩展到6个
docker service scale my_nginx=6
# 将上面的 my_nginx 容器动态缩到2个
docker service scale my_nginx=2
容器版本升级、回滚
# 容器版本升级
docker service update --image nginx:1.29 my_nginx
# 回滚
docker service update --image nginx:1.26 my_nginx
# 查看版本可以加上参数-i
curl -i 192.168.221.21
使用dockercompose部署wordpress(Docker Swarm集群)
# 1)创建wordpress文件夹
mkdir -p /data/wordpress
cd /data/wordpress/
# 2)编辑docker-compose.yml文件
vim docker-compose.yml
---------------------------------
version: "3"
services:
wordpress:
image: wordpress
ports:
- 8090:80
networks:
- overlay
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: root123
deploy:
mode: replicated
replicas: 3
db:
image: mysql:5.7
networks:
- overlay
volumes:
- db-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: root123
deploy:
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
volumes:
db-data:
networks:
overlay:
# 3)部署服务
docker stack deploy -c docker-compose.yml wordpress
# 部署服务使用docker stack deploy命令
# -c:指定compose文件名
docker stack ls
# 4)查看效果
打开浏览器输入 任一节点IP:8080 即可看到各节点运行状态
所有数据仅供实验参考,开发环境不要设置这么简单
Docker Compose与Swarm集群实践
1624

被折叠的 条评论
为什么被折叠?



