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 fast

3. 使用#

1 命令#

  1. 所在文件夹就是project
  2. 执行命令的时候当前目录下有docker-compose.yaml文件.否则会报错
  3. 第一次启动项目./install.sh
  4. 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:7

2 模块#

  • 自定义网络不创建网段,他会自己分配,防止占用已有的网络 网络
  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-app1

4. 生产#

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 使用网络方案#

500

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通信#

500

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

700

修改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: bridge

nginx-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:v3

haproxy

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-v1
docker-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  #刷新一次