Skip to content

六、Docker-compose

1、简介

Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml, 写好多个容器之间的调用关系 。然后,只要一个命令,就能同时启动/关闭这些容器

Docker-Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

https://docs.docker.com/compose/compose-file/compose-file-v3/

https://docs.docker.com/compose/install/

2、安装与卸载

sh
sudo curl -L "https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 可以进这里看版本
https://github.com/docker/compose/releases/

sudo chmod +x /usr/local/bin/docker-compose

docker-compose --version 

# 如果是使用的 curl 方式来安装的
sudo rm /usr/local/bin/docker-compose

3、核心概念

一文件

docker-compose.yml

两要素

  • 服务(service) 一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器
  • 工程(project) 由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

4、Compose使用的三个步骤

  • 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
  • 使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
  • 最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线

5、docker-compose常用命令

sh
docker-compose -h                           #  查看帮助 
docker-compose up                           #  启动所有 docker-compose服务 
docker-compose up -d                        #  启动所有 docker-compose服务 并后台运行 
docker-compose down                         #  停止并删除容器、网络、卷、镜像。 
docker-compose exec  yml里面的服务id                 # 进入容器实例内部  docker-compose exec  docker-compose.yml文件中写的服务id  /bin/bash 
docker-compose ps                      # 展示当前docker-compose编排过的运行的所有容器 
docker-compose top                     # 展示当前docker-compose编排过的容器进程 
 
docker-compose logs  yml里面的服务id     #  查看容器输出日志 
docker-compose config     #  检查配置 
docker-compose config -q  #  检查配置,有问题才有输出 
docker-compose restart   #  重启服务 
docker-compose start     #  启动服务 
docker-compose stop      #  停止服务 

docker-compose up -d nginx                     # 构建建启动nignx容器
docker-compose exec nginx bash            # 登录到nginx容器中
docker-compose down                              # 删除所有nginx容器,镜像
docker-compose ps                                   # 显示所有容器
docker-compose restart nginx                   # 重新启动nginx容器
docker-compose run --no-deps --rm php-fpm php -v  # 在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器
docker-compose build nginx                     # 构建镜像 。        
docker-compose build --no-cache nginx   # 不带缓存的构建。
docker-compose logs  nginx                     # 查看nginx的日志 
docker-compose logs -f nginx                   # 查看nginx的实时日志
 
docker-compose config  -q                        # 验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。 
docker-compose events --json nginx       # 以json的形式输出nginx的docker日志
docker-compose pause nginx                 # 暂停nignx容器
docker-compose unpause nginx              # 恢复ningx容器
docker-compose rm nginx                       # 删除容器(删除前必须关闭容器)
docker-compose stop nginx                    # 停止nignx容器
docker-compose start nginx                    # 启动nignx容器

6、docker-compose-yaml

1、docker-compose.yaml

yaml
version: '2'
services:
  tomcat:
    image: tomcat:8.5
    container_name: tomcat
    ports: 
    - "8081:8080"
    volumes:
    - ./tomcat/webapps:/usr/local/tomcat/webapps
    - ./tomcat/conf/:/usr/local/tomcat/conf/
    - ./tomcat/bin/:/usr/local/tomcat/bin/
    - ./tomcat/logs/:/usr/local/tomcat/logs/
  mysql:
    image: mysql:5.7
    container_name: mysql
    restart: always
    ports: 
    - "3306:3306"
    volumes: 
    - ./mysql/mysql:/etc/mysql
    - ./mysql/logs:/var/log/mysql
    - ./mysql/data/:/var/lib/mysql
    environment:
    - MYSQL_ROOT_PASSWORD=123456
  nginx:
    image: nginx
    container_name: nginx
    ports:
    - "80:80"
    - "9920:9920"
    volumes:
    - ./nginx/html:/usr/share/nginx/html
    - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
    - ./nginx/logs:/var/log/nginx
  activemq:
    image: webcenter/activemq
    container_name: activemq
    ports:
    - "61616:61616"
    - "8161:8161"
    volumes:
    - ./activemq/conf:/opt/activemq/conf
    environment:
    - ACTIVEMQ_ADMIN_LOGIN=admin
    - ACTIVEMQ_ADMIN_PASSWORD=admin
    - ACTIVEMQ_CONFIG_MINMEMORY=512
    - ACTIVEMQ_CONFIG_MAXMEMORY=2048
    - TZ=Asia/Shanghai
# redis
  master:
    image: redis
    container_name: redis-master
    command: redis-server --requirepass boShang@Redis --slave-announce-ip 172.16.253.210 --slave-announce-port 6379
    ports:
    - "6379:6379"
    networks:
    - my_network
  slave1:
    image: redis
    container_name: redis-slave-1
    ports:
    - "6380:6379"
    command: redis-server --slave-announce-ip 172.16.253.210 --slave-announce-port 6380 --slaveof redis-master 6379 --requirepass boShang@Redis --masterauth boShang@Redis
    depends_on:
    - master
    networks:
    - my_network
  slave2:
    image: redis               
    container_name: redis-slave-2
    ports:
    - "6381:6379"
    command: redis-server --slave-announce-ip 172.16.253.210 --slave-announce-port 6381 --slaveof redis-master 6379 --requirepass boShang@Redis --masterauth boShang@Redis
    depends_on:
    - master
    networks:
    - my_network
  sentinel1:
    image: redis
    container_name: redis-sentinel-1
    ports:
    - 26379:26379
    command:
    - /bin/sh
    - -c
    - |
      mkdir /var/log/redis
      touch /var/log/redis/sentinel.log
      redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
    - ./redis/sentinel_1.conf:/usr/local/etc/redis/sentinel.conf
  sentinel2:
    image: redis
    container_name: redis-sentinel-2
    ports:
    - 26380:26379
    command:
    - /bin/sh
    - -c
    - |
      mkdir /var/log/redis
      touch /var/log/redis/sentinel.log
      redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
    - ./redis/sentinel_2.conf:/usr/local/etc/redis/sentinel.conf
  sentinel3:
    image: redis
    container_name: redis-sentinel-3
    ports:
    - 26381:26379
    command:
    - /bin/sh
    - -c
    - |
      mkdir /var/log/redis
      touch /var/log/redis/sentinel.log
      redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
    - ./redis/sentinel_3.conf:/usr/local/etc/redis/sentinel.conf

networks:
  my_network:

2、docker-compose redis 集群

yaml
version: '2'
services:
  master:
    image: redis
    container_name: redis-master
    command: redis-server --requirepass boShang@Redis --slave-announce-ip 172.16.253.210 --slave-announce-port 6379
    ports:
    - "6379:6379"
    networks:
    - sentinel-master
  slave1:
    image: redis
    container_name: redis-slave-1
    ports:
    - "6380:6379"
    command: redis-server --slave-announce-ip 172.16.253.210 --slave-announce-port 6380 --slaveof redis-master 6379 --requirepass boShang@Redis --masterauth boShang@Redis
    depends_on:
    - master
    networks:
    - sentinel-master
  slave2:
    image: redis                ## 镜像
    container_name: redis-slave-2
    ports:
    - "6381:6379"
    command: redis-server --slave-announce-ip 172.16.253.210 --slave-announce-port 6381 --slaveof redis-master 6379 --requirepass boShang@Redis --masterauth boShang@Redis
    depends_on:
    - master
    networks:
    - sentinel-master
networks:
  sentinel-master:
yaml
# 哨兵模式

version: '2'
services:
  sentinel1:
    image: redis
    container_name: redis-sentinel-1
    ports:
    - 26379:26379
    command:
    - /bin/sh
    - -c
    - |
      mkdir /var/log/redis
      touch /var/log/redis/sentinel.log
      redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
    - ./sentinel_1.conf:/usr/local/etc/redis/sentinel.conf
  sentinel2:
    image: redis
    container_name: redis-sentinel-2
    ports:
    - 26380:26379
    command:
    - /bin/sh
    - -c
    - |
      mkdir /var/log/redis
      touch /var/log/redis/sentinel.log
      redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
    - ./sentinel_2.conf:/usr/local/etc/redis/sentinel.conf
  sentinel3:
    image: redis
    container_name: redis-sentinel-3
    ports:
    - 26381:26379
    command:
    - /bin/sh
    - -c
    - |
      mkdir /var/log/redis
      touch /var/log/redis/sentinel.log
      redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
    - ./sentinel_3.conf:/usr/local/etc/redis/sentinel.conf
networks:
  default:
    external:
      name: redis_sentinel-master

3、zookeeper.compose.yml

yaml
version: '2.0'
services:
  zoo1:
    image: zookeeper
    restart: always
    hostname: zoo1
    container_name: zookeeper_1
    #domainname:
    ports:
      - 2181:2181
    volumes:
      - ./zoo1/data:/data
      - ./zoo1/datalog:/datalog
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181

  zoo2:
    image: zookeeper
    restart: always
    hostname: zoo2
    container_name: zookeeper_2
    ports:
      - 2182:2181
    volumes:
      - ./zoo2/data:/data
      - ./zoo2/datalog:/datalog
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181

  zoo3:
    image: zookeeper
    restart: always
    hostname: zoo3
    container_name: zookeeper_3
    ports:
      - 2183:2181
    volumes:
      - ./zoo3/data:/data
      - ./zoo3/datalog:/datalog
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181

4、SpringBoot基本应用

yaml
version: "3" 
  
services: 
  microService: 
    image: my_docker:1.6 
    container_name: ms01 
    ports: 
      - "6001:6001" 
    volumes: 
      - /app/microService:/data 
    networks
      - my_net  
    depends_on
      - redis 
      - mysql 
  
  redis: 
    image: redis:6.0.8 
    ports: 
      - "6379:6379" 
    volumes: 
      - /app/redis/redis.conf:/etc/redis/redis.conf 
      - /app/redis/data:/data 
    networks
      - my_net 
    command: redis-server /etc/redis/redis.conf 
  
  mysql: 
    image: mysql:5.7 
    environment: 
      MYSQL_ROOT_PASSWORD: '123456' 
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no' 
      MYSQL_DATABASE: 'db2021' 
      MYSQL_USER: 'test_user' 
      MYSQL_PASSWORD: 'test_user123' 
    ports: 
       - "3306:3306" 
    volumes: 
       - /app/mysql/db:/var/lib/mysql 
       - /app/mysql/conf/my.cnf:/etc/my.cnf 
       - /app/mysql/init:/docker-entrypoint-initdb.d 
    networks: 
      - my_net 
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问 
  
networks
   my_net: