简单来说,docker-compose 能简化我们对 docker 的操作(当然,它还有更多的功能),并且它别 docker run 命令更具有可读性。
Compose 有 2 个重要的概念:
项目(Project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
服务(Service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
# 1. docker compose 安装与卸载
docker-compose 本质上是一个命令(而命令的本质则是一个可执行的二进制文件),当然,docker-compose 不是 Linux 自带的命令,所以需要我们 “安装” 。
所谓的 “安装” ,本质上就是将 docker-compose 的二进制可执行程序放在 Linux 特定的目录下,让 Linux 系统 “多” 出来一个命令可用。
步骤 1: 获得 docker-compose 二进制程序
网速和人品不好的时候,你需要老师把已经下好的 docker-compose 发给你,你再上传到你的 Linux 服务器上:
rz # 通过 xshell 上传 mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
网速和人品都不错的时候,你可以从 docekr-compse 的 github 仓库下载:
sudo curl \ -L "https://github.com/docker/compose/releases/download/1.29.0/docker-compose-$(uname -s)-$(uname -m)" \ -o /usr/local/bin/docker-compose
步骤 2: 启用 docker-compose 命令
chmod +x /usr/local/bin/docker-compose ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose docker-compose --version
# 2. docker compose 重要命令
# 2.1 命令选项
命令选项 | 说明 |
---|---|
-f <FILE> | 指定使用的 Compose 模板文件,默认为 docker-compose.yml |
-p <NAME> | 指定项目名称, 默认将使用所在目录名称作为项目名 |
–verbose | 输出更多调试信息 |
-v | 打印版本并退出 |
# 2.2 常用 & 重要命令
docker-compose 等同于 docker-compose -f docker-compose.yml 命令,很显然,默认的编排文件的文件名是 docker-compose.yml 。如果你的编排文件的文件名不是 docker-compose.yml,那么你就需要使用 -f 选项给指定。
# 2.3 docker up 命令
docker-compose -f xxx.yml up 命令十分强大(重点掌握),它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
docker-compose -f xxx.yml up -d
默认情况,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。
如果使用docker-compose up -d 将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。
docker-compose -f xxx.yml up --no-recreate
默认情况,如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容。
如果用户不希望容器被停止并重新创建,可以使用 docker-compose up --no-recreate 。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。
docker-compose -f xxx.yml up --no-deps -d <SERVICE_NAME>
如果用户只想重新部署某个服务,可以使用 docker-compose up --no-deps -d <SERVICE_NAME> 来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。
docker-compose -f xxx.yml up 命令总结
- -d 在后台运行服务容器。
- --no-color 不使用颜色来区分不同的服务的控制台输出。
- --no-deps 不启动服务所链接的容器。
- --force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
- --no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
- --no-build 不自动构建缺失的服务镜像。
- -t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。
# 3. docker-compose.yml 文件
默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。其内容例如:
version: '3'
services:
mysql-3306:
container_name: mysql-3306
image: mysql:8.0.16
network_mode: "bridge"
# restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456
volumes:
- ./3306/conf.d:/etc/mysql/conf.d
- ./3306/mysql.conf.d:/etc/mysql/mysql.conf.d
- ./3306/data:/var/lib/mysql
ports:
- "3306:3306"
注意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等)将会自动被获取,无需在 docker-compose.yml 中重复设置。
docker-compose.yml 文件内容详解 :
# docker-compose.yml 的 volumes 的第二种写法
docker-compose 里 2 种设置方式都是可以持久化的。
对于上面使用卷标的写法,你可能需要使用下面的命令查看卷标信息: