Docker Compose、私有镜像站和Swam集群
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.7volumes:- db_data:/var/lib/mysqlrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: root123MYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: root123MYSQL_ROOT_HOST: '%'command: --default-authentication-plugin=mysql_native_passwordwordpress:depends_on:- dbimage: wordpress:latestports:- "8000:80"restart: alwaysenvironment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: root123WORDPRESS_DB_NAME: wordpressvolumes:- wp_data:/var/www/htmlvolumes:db_data:wp_data:--------------------------------------# 如果之前有下载过需要删除的(没有就省略)docker compose down -v# 启动服务docker compose up -d# 浏览器搜索192.168.221.21:8000
Docker私有镜像站-Harbor
私有镜像站,方便管理、下载部署内部的镜像;
## 下载Harborcd /optwget http://192.168.57.200/Software/harbor-offline-installer-v2.14.0.tgz## 安装Harbortar -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# 修改配置文件中的主机名为本机IPcp harbor.yml.tmpl harbor.ymlvim harbor.yml第五行的hostname改为192.168.221.21## 创建密钥# 1.进入证书目录mkdir sslcd ssl/# 2.创建本地私有密钥openssl genrsa -out ssl.key 2048# 3.按提示输入即可openssl req -new -key ssl.key -out ssl.csr# 4.创建证书crtopenssl x509 -req -days 1460 -in ssl.csr -signkey ssl.key -out ssl.crt# 5.创建证书pemopenssl 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-reloadsystemctl restart dockerdocker compose up -ddocker login http://192.168.221.21docker 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.安装Dockerapt updateapt-get -y install ca-certificates curl gnupg lsb-releasecurl -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.iosystemctl stop dockervim /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.servicesystemctl daemon-reloadsystemctl restart docker# 2.所有节点设置 hosts 解析cat >> /etc/hosts << EOF192.168.221.21 server01192.168.221.22 server02192.168.221.23 server03EOF## 接下来分开操作# 在第一台manager机器上(192.168.221.21操作)# 3.初始化集群-initdocker 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 lsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSIONifo32t0qq63nl6c2t3a3kio2h * server-21 Ready Active Leader 28.5.1shzi3kedbzdvn5lmy5ovgp59s server-22 Ready Active 28.5.1lctl7rf6k96dnvqy4bmqiaxvs server-23 Ready Active 28.5.1# 在Docker集群中运行容器((192.168.221.21操作)无需下载nginx镜像)# 1.在集群中创建overlay网络,让不同宿主上的容器可以在同一个网段内通信,方便搭建负载均衡docker network create -d overlay nginx_netdocker 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.查看容器IDdocker psdocker exec -it 容器ID /bin/bashecho "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# 查看版本可以加上参数-icurl -i 192.168.221.21
使用dockercompose部署wordpress(Docker Swarm集群)
# 1)创建wordpress文件夹mkdir -p /data/wordpresscd /data/wordpress/# 2)编辑docker-compose.yml文件vim docker-compose.yml---------------------------------version: "3"services:wordpress:image: wordpressports:- 8090:80networks:- overlayenvironment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: root123deploy:mode: replicatedreplicas: 3db:image: mysql:5.7networks:- overlayvolumes:- db-data:/var/lib/mysqlenvironment:MYSQL_ROOT_PASSWORD: root123MYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: root123deploy:placement:constraints: [node.role == manager]visualizer:image: dockersamples/visualizer:stableports:- "8080:8080"stop_grace_period: 1m30svolumes:- "/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 即可看到各节点运行状态
所有数据仅供实验参考,开发环境不要设置这么简单