Docker Compose 是一个用于管理多个 Docker 容器应用程序的工具,旨在简化容器化应用程序的部署和管理过程。它通过一个单独的 YAML 文件来定义应用程序的各种方面,包括服务、网络、卷挂载等。Compose允许用户通过一个单独的docker-compose.yum模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project), 可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。


Docker-compose容器编排的优点

• 简化多容器应用部署

使用docker-compose可以轻松定义和管理多容器应用程序的部署配置,将多个容器定义在一个文件中,简化了部署过程。

• 统一管理

通过docker-compose,可以在一个文件中定义所有容器的配置,包括网络、存储卷、环境变量等,使得管理和维护更加方便。

• 快速部署和启动

通过简单的命令即可启动、停止、重启或删除整个应用程序的所有容器,加快了开发和测试周期。

• 可移植性

使用docker-compose定义的配置文件可以轻松在不同环境中部署,确保在开发、测试和生产环境中一致性。

• 版本控制

可以将docker-compose配置文件纳入版本控制系统中,方便团队协作和追踪更改。

• 资源优化

compose可以根据需要动态调整容器的资源分配,使得资源利用更加高效。

• 自定义网络

可以定义自己的网络,使得容器之间的通信更加安全和可控。


Compose常用命令
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                     # 停止服务

yml 配置指令解析

• build;指定镜像构建参数

build:
        # 上下文路径
        context: .
        # 指定构建镜像的 Dockerfile 文件名
        dockerfile: Dockerfile-compose
        # 添加构建参数,这是只能在构建过程中访问的环境变量。
        args:
        - http_proxy: https://proxy.golang.com.cn,https://goproxy.cn,direct
        # 设置构建镜像的标签。
        labels:
        - "myhello:1.0"
        - "com.example.description=Accounting webapp"
        # target:多层构建,可以指定构建哪一层。
        # tags:指定镜像的tags
        tags:
        - "myhello:1.0.0"
        - "localhost:5000/myhello:1.0.0"

• command;覆盖容器启动的默认命令

command: ["bundle", "exec", "thin", "-p", "3000"]

• container_name;指定自定义容器名称,而不是生成的默认名称

container_name: my-web-container

• depends_on;设置依赖关系

  • docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动web。
  • docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
  • docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。
version: "3.7"
services:
        web:
                build: .
                depends_on:
                        - db
                        - redis
        redis:
                image: redis
        db:
                image: postgres

• entrypoint;覆盖容器默认的 entrypoint

entrypoint: /code/entrypoint.sh

也可以是以下格式:

entrypoint:
        - php
        - -d
        - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-        20100525/xdebug.so
        - -d
        - memory_limit=-1
        - vendor/bin/phpunit

• env_file;从文件添加环境变量,可以是单个值或列表的多个值

env_file: .env

也可以是列表格式:

env_file:
        - ./common.env
        - ./apps/web.env
        - /opt/secrets.env

• environment;添加环境变量

可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。

environment:
        RACK_ENV: development
        SHOW: 'true'

• expose;暴露端口,但不映射到宿主机,只被连接的服务访问

仅可以指定内部端口为参数:

expose:
        - "3000"
        - "8000"

• extra_hosts;添加主机名映射

extra_hosts:
        - "somehost:162.242.195.82"
        - "otherhost:50.31.209.229"

• healthcheck;用于检测 docker 服务是否健康运行

healthcheck:
        test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序
        interval: 1m30s # 设置检测间隔
        timeout: 10s # 设置检测超时时间
        retries: 3 # 设置重试次数
        start_period: 40s # 启动后,多少秒开始启动检测程序

• image;指定容器运行的镜像

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd # 镜像id

• logging;服务的日志记录配置

仅在 json-file 驱动程序下,可以使用以下参数,限制日志得数量和大小。

logging:
        driver: json-file
        options:
                max-size: "200k" # 单个文件大小为200k
                max-file: "10" # 最多10个文件

当达到文件限制上限,会自动删除旧得文件。syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。

logging:
        driver: syslog
        options:
                syslog-address: "tcp://192.168.0.106:123"

driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项:

driver: "json-file"
driver: "syslog"
driver: "none"

• restart

  • no:当容器退出时,不要自动重新启动。
  • on-failure[:max-retries]:仅当容器以非零退出状态退出时才重新启动。
  • always:无论退出状态如何,始终重新启动容器。无论容器的当前状态如何,容器也将始终在守护程序启动时启动。
  • unless-stopped:论退出状态如何,始终重新启动容器,包括守护程序启动时,除非容器在Docker守护程序停止之前处于停止状态。
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

• volumes;将主机的数据卷或着文件挂载到容器里

version: "3.7"
services:
        db:
                image: postgres:latest
                volumes:
                        - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
                        - "/localhost/data:/var/lib/postgresql/data"

• networks;为容器指定网络

services:
        frontend:
                image: awesome/webapp
                networks:
                        front-tier:
                                ipv4_address: 172.16.238.10
                                ipv6_address: 2001:3984:3989::10
networks:
        front-tier:
                ipam:
                        driver: default
                        config:
                                - subnet: "172.16.238.0/24"
                                - subnet: "2001:3984:3989::/64"

使用Compose实例

• 构建镜像

进入到这个目录,用 Dockerfile构建镜像。

docker build -t cgxin_docker:1.1 .

• 编写docker-compose.yml文件

# docker-compose文件版本号
version: "3"
# 配置各个容器服务 
services:
  microService:
    image: guai_docker:1.6
    container_name: ms01  # 容器名称,如果不指定,会生成一个服务名加上前后缀的容器名
    ports:
      - "6001:6001"
    volumes:
      - /app/microService:/data
    networks: 
      - guai_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: 
      - guai_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: 'db2023'
      MYSQL_USER: 'luo'
      MYSQL_PASSWORD: 'luo123'
    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:
      - cgxin_net
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问

# 自定义 docker 网络 
networks: 
   cgxin_net:

• 修改docker_boot 项目中的 yml

mysql 的密码, mysql 和 redis 域名是在 docker-compose.yml 中编排的。

• 执行Compose

# 检查配置,有问题才有输出
dokcer-compose config -q 
# 启动所有docker-compose服务并后台运行
docker-compose up -d
# 或者
docker-compose up

• 进入mysql容器实例并新建库db2023以及新建表t_user

docker exec -it 容器实例id /bin/bash

mysql -uroot -p
create database db2023;
use db2023;

CREATE TABLE `t_user` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用户名',
  `password` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '密码',
  `sex` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '性别 0=女 1=男 ',
  `deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

• 关停容器

docker-compose stop