7、docker-compose 基础
7.1 docker-compose 安装(CentOS7)
# 访问 https://docs.docker.com/compose/install/
# 下载命令
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 对二进制文件应用可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 注意:如果docker-compose安装后命令失败,请检查您的路径。您还可以/usr/bin在路径中创建指向或任何其他目录的符号链接。
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 完成安装,查看版本
docker-compose --version
7.2 docker-compose 几个术语
服务 (service) 一个应用容器,实际上可以运行多个相同镜像的实例。
项目 (project) 由一组关联的应用容器组成的一个完整业务单元。
可见,一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理。
7.3 docker-compose 几个常见指令
# 服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。可以随时在项目目录下运行 docker-compose build 来重新构建服务
docker-compose build
# 验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误显示错误原因。
docker-compose config
# down此命令将会停止 up 命令所启动的容器,并移除网络
docker-compose up
# 进入指定的容器
docker-compose exec
# 获得一个命令的帮助。
docker-compose help
# 列出 Compose 文件中包含的镜像。
docker-compose images
# 停止服务容器
docker-compose kill -s SIGINT
# 查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。
docker-compose logs [options] [SERVICE...]
# 暂停一个服务容器。
docker-compose pause [SERVICE...]
# 打印某个容器端口所映射的公共端口。
docker-compose port [options] SERVICE PRIVATE_PORT
选项:
--protocol=proto 指定端口协议,tcp(默认值)或者 udp。
--index=index 如果同一服务存在多个容器,指定命令对象容器的序号(默认为 1)。
# 列出项目中目前的所有容器。
docker-compose ps
# 拉取镜像依赖
docker-compose pull 服务名称
# 推送服务依赖的镜像到 Docker 镜像仓库。
docker-compose push 服务名称
# 重启项目中的服务。
docker-compose restart 服务名称
# 删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。
docker-compose rm 服务名称
7.4 docker-compse 的模板文件
# 容器名称 指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式。
container_name
# depends_on 解决容器的依赖、启动先后的问题。以下例子中会先启动 redis db 再启动 web
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
# 注意:web 服务不会等待 redis db 「完全启动」之后才启动。
# dns 自定义 DNS 服务器。可以是一个值,也可以是一个列表。
dns:
- 8.8.8.8
- 114.114.114.114
# env_file 从文件中获取环境变量,可以为单独的文件路径或列表。
如果通过 docker-compose -f FILE 方式来指定 Compose 模板文件,则 env_file 中变量的路径会基于模板文件路径。
如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。
env_file:
- ./common.env
- ./apps/web.env
# environment 设置环境变量。你可以使用数组或字典两种格式。
只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。
environment:
- RACK_ENV=development
- SESSION_SECRET
# expose 暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数
expose:
- "3000"
- "8000"
# image 镜像名称 指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
image: ubuntu
image: orchardup/postgresql
# logging 配置日志选项
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
# 目前支持三种日志类型
driver: "json-file"
driver: "syslog"
driver: "none"
# 配置日志相关参数
options:
max-size: "200k"
max-file: "10"
# network_mode 设置网络模式
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
# networks 配置容器连接的网络
version: "3"
services:
some-service:
networks:
- some-network
- other-network
networks:
some-network:
other-network:
# 暴露端口信息 使用宿主端口:容器端口 (HOST:CONTAINER) 格式,
# 或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
注意:当使用 HOST:CONTAINER 格式来映射端口时,
如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,
因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。
# sysctls 配置系统内核参数
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
# ulimits 指定容器的 ulimits 限制值。
例如,指定最大进程数为 65535,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制) 和 40000(系统硬限制,只能 root 用户提高)。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
# volumes 数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER),并且可以设置访问模式 (HOST:CONTAINER:ro)。
version: "3"
services:
my_src:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
# restart 指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always或者 unless-stopped。
restart: always
# privileged 允许容器中运行一些特权命令。
privileged: true