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