1. 介绍#
当在宿主机启动较多的容器时候,如果都是手动操作会觉得比较麻烦而且容器出错,这个时候推荐使用docker单机编排工具docker-compose,docker-compose是docker容器的一种单机编排服务,docker-compose是一个管理多个容器的工具,比如可以解决容器之间的依赖关系,就像启动一个nginx前端服务的时候会调用后端的tomcat,那就得先启动tomcat,但是启动tomcat容器还需要依赖数据库,那就还得先启动数据库,docker-compose就可以解决这样的嵌套依赖关系,其完全可以替代dockerrun对容器进行创建、启动和停止。 docker-compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排,docker-compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。
Docker-compose(老版本python写的,需要yum安装) Docker compose(新版go写的,不用安装)
- 产生任何变更,容器直接重建
- 按顺序启动,需要依赖关系
https://github.com/docker/compose https://github.com/docker/compose/releases

2. 安装#
新版
- 二进制
apt update
wget https://github.com/docker/compose/releases/download/v2.36.0/docker-compose-linux-x86_64
sudo chmod a+x docker-compose-linux-x86_64
rm -rf /usr/bin/docker-compose
cp docker-compose-linux-x86_64 /usr/local/bin/docker-compose
docker-compose version旧版 旧版是用python写的需要安装 yum或者apt
Ubuntu
#默认版本
apt update
apt install docker-compose
#用python下载最新版
python3
apt-cahce madison docker-compose
#先安装docker
apt install -y python3-pip
pip3 install docker-compose
Centos
yun install epel-release
yum install -y python-pip
pip install --upgrade pip
yum makecache fast3. 使用#
1 命令#
- 所在文件夹就是project
- 执行命令的时候当前目录下有docker-compose.yaml文件.否则会报错
- 第一次启动项目./install.sh
- tag号 2023-8-15_12-42-30 qwte3e41-08-15-21-23-20

docker-compose -h
docker-compose up -d 重新构建容器,并在后台持久运行
docker-compose -f 指定docker-compose.yaml文件位置
docker-compose start 启动容器
docker-compose stop $server 停止容器(不写停止全部)
docker-compose rm -s -f 删除容器(删除前必须关闭容器,-s停的意思)
docker-compose ps --service 显示所有容器
docker-compose logs 查看的日志
docker-compose config -q 检查docker-compose.yaml是否有语法问题
docker-compose version 查看版本
docker-compose pull (把本地的镜像,覆盖掉)****
docker-compose tag (修改latest,传到本地)
docker-compose pause 暂停容器
docker-compose unpause 恢复容器
docker-compose port nginx-server 80 查看端口(只能看单个server)
docker-compose top 显示容器运行的进程
docker-compose kill 停止并删除容器
docker-compose down 停止并删除(停止资源来实现,会删除网络,比较危险)
docker-compose exec nginx-server /bin/bash #登录到容器中(没有-it)
docker-compose events 查看docker的日志
docker-compose build 修改dockerfile后,重新构建镜像并重建服务
docker-compose restart 重新启动容器
docker-compose run --no-dep --rm php-fpm php -v #在php-fpm中不启动关联容器,并容器执行php -v执行完成后删除容器(docker --rm)
docker-compose --no-cache #重新构建,不用上次的缓存
docker-compose bulid #构建镜像的步骤(没有启动其他容器的步骤)
docker-compose scale nginx-server=2 伸缩资源
docker-compose logs -f 验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
跟随挂载
docker run -it --volums-from=1e centos:72 模块#
- 自定义网络不创建网段,他会自己分配,防止占用已有的网络 网络
nerworks:
front: #自定义前端服务网络
driver: bridge
backend: #自定义后端网络
driver: bridge
default: #使用已经存在的docker0默认为172.17.0.1/16的网络
external:
name: bridge #这个是名字不是网络模式挂载卷
volumes:
- /data/textapp:/data/tomcat/webapps/textapp:ro
volumes:
- /data/textapp:/data/tomcat/webapps/textapp:ro添加解析
links:
- tomcat-server-app1
- tomcat-server-app14. 生产#
1 从 docker-compose 启动单个容器#
mkdir -p /opt/compose
cd /opt/compose
vim docker-compose.yaml单个容器的dockercompose文件: 编写一个yml格式的配置docker-compose文件,启动一个nginx服务,由于格式为yml格式,因此要注意前后的缩进及上下行的等级关系。
version: '3.6' #从Compose V2 规范开始(如 Docker Compose v2.37.0),官方已弃用顶层` ``version`字段
services:
nginx-service:
image: harbor.123asd.com/docker/alpine-nghinx:v1.28.0
expose:
- 80
- 443
ports:
- "80:80"
- "443:443"通过添加删除来观察容器中的网络
docker-compose up -d
2 使用网络方案#

services:
nginx-service:
image: harbor.123asd.com/docker/alpine-nginx:v1.28.0
container_name: nginx-web1
network_mode: bridge
expose:
- 80
- 443
ports:
- "80:80"
- "443:443"
tomcat-service-app1:
image: harbor.123asd.com/docker/tomcat-app:v1
container_name: tomcat-app1
network_mode: bridge
expose:
- 8080
- 8443
ports:
- "8080:8080"
- "8443:8443"
tomcat-service-app2:
image: harbor.123asd.com/docker/tomcat-app:v2
container_name: tomcat-app2
network_mode: bridge
expose:
- 8080
- 8444
ports:
- "8081:8080"
- "8444:8443"
networks:
front: #自定义前端服务网络
driver: bridge
backend: #自定义后端网络
driver: bridge
default: #使用已经存在的docker0默认为172.17.0.1/16的网络
external:
name: bridge #这个是名字不是网络模式```http://192.168.1.31
http://192.168.1.31:8080/myapp/
http://192.168.1.31:8081/myapp/3 两个networks通信#

services:
nginx-service:
image: harbor.123asd.com/docker/alpine-nginx:v1.28.0
container_name: nginx-web1
expose:
- 80
- 443
ports:
- "80:80"
- "443:443"
networks:
- front
# - backend
tomcat-service-app1:
image: harbor.123asd.com/docker/tomcat-app:v1
container_name: tomcat-app1
networks:
- backend
expose:
- 8080
- 8443
ports:
- "8080:8080"
- "8443:8443"
tomcat-service-app2:
image: harbor.123asd.com/docker/tomcat-app:v2
container_name: tomcat-app2
networks:
- backend
expose:
- 8080
- 8444
ports:
- "8081:8080"
- "8444:8443"
networks:
front: #自定义前端服务网络
driver: bridge
backend: #自定义后端网络
driver: bridge 测试
docker-compose down
docker rm -f `docker ps -aq`
docker-compose up -d
#通过添加删除-backend来观察容器中的网络
docker exec -it 58dc4e950ffc sh (nginx)
docker exec -it 2b35825b023c sh (app1)
docker exec -it dcc1853e3205 sh (app2)
dcc1853e3205
ip a
发现多了个网卡(代表可以连接前后端网络,可以做负载均衡器,绕过eth0直接访问后端网络)
#分别查看两个容器的网络(nginx中 没有网络backend 看能不能ping通)
ipconfig
没有多个网络,得在宿主机上添加iptables
ping
iptables-save > iptables-save.sh
vim iptables-save.sh
#修改规则
iptables-restore < iptables-save.sh





修改nginx的配置文件,动静分离
- 暂时能用,但是新建容器会换ip

docker exec -it 899ad6606faa sh
vim /apps/nginx/conf/nginx.conf
upstream web {
server tomcat-service-app1:8080;
server tomcat-service-app2:8080;
}
location/myapp{
proxy_pass http://web;
}
/apps/nginx/sbin/nginx -s reload
http://192.168.1.31/myapp/index.jsp
http://192.168.1.32/myapp/index.jsp

4 docker-compose案例#
haproxy->nginx->tomcat->mysql/redis

services:
haproxy-service:
image: harbor.123asd.com/docker/haproxy:2.2.11-v1
networks:
- backend
container_name: haproxy-01
expose:
- 80
- 9999
- 443
ports:
- "80:80"
- "443:443"
- "9999:9999"
links:
- nginx-service
nginx-service:
image: harbor.123asd.com/docker/nginx:v1.28.0
container_name: nginx-web1
networks:
- backend
# expose:
# - 80
# - 443
# ports:
# - "80:80"
# - "443:443"
links:
- tomcat-service-app1
- tomcat-service-app2
tomcat-service-app1:
image: harbor.123asd.com/docker/tomcat-app:v1
container_name: tomcat-server-app1
# volumes:
# - /data/textapp:/data/tomcat/webapps/textapp
networks:
- backend
# expose:
# - 8080
# - 8443
# ports:
# - "8080:8080"
# - "8443:8443"
tomcat-service-app2:
image: harbor.123asd.com/docker/tomcat-app:v2
container_name: tomcat-server-app2
# volumes:
# - /data/textapp:/data/tomcat/webapps/textapp:ro
networks:
- backend
# expose:
# - 8080
# - 8444
# ports:
# - "8081:8080"
# - "8444:8443"
networks:
front: #自定义前端服务网络
driver: bridge
backend: #自定义后端网络
driver: bridgenginx-v3
docker exec -it nginx-web1 bash
vim /apps/nginx/conf/nginx.conf
upstream web {
server tomcat-service-app1:8080;
server tomcat-service-app2:8080;
}
location /myapp {
proxy_pass http://web;
}
/apps/nginx/sbin/nginx -s reload
vim build-command.sh
docker push nginx:v3haproxy
docker exec -it haproxy-01 bash
vim /etc/haproxy/haproxy.cfg
listen web_port-80
bind 0.0.0.0:80
mode http
log global
balance roundrobin
server web1 nginx-service:80 check inter 3000 fall 2 rise 5
listen web_port-443
bind 0.0.0.0:443
mode http
log global
balance roundrobin
server web1 nginx-service:443 check inter 3000 fall 2 rise 5
docker cp haproxy-01:/etc/haproxy/haproxy.cfg .
vim build-command.sh
docker push haproxy-2.2.11-v1docker-compose up -d
192.168.1.31:9999/haproxy-status
haadmin
123456
haproxy -f /etc/haproxy/haproxy.cfg新环境测试
scp docker-compose.yaml 192.168.1.30:/opt/docker-compose/
docker rm -f `docker ps -aq`
192.168.1.31:9999/haproxy-status
192.168.1.31
192.168.1.31/myapp
192.168.1.31/myapp #刷新一次