简单来说,docker-compose 能简化我们对 docker 的操作(当然,它还有更多的功能),并且它别 docker run 命令更具有可读性。

Compose 有 2 个重要的概念:

  • 项目(Project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

  • 服务(Service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

# 1. docker compose 安装与卸载

docker-compose 本质上是一个命令(而命令的本质则是一个可执行的二进制文件),当然,docker-compose 不是 Linux 自带的命令,所以需要我们 “安装” 。

所谓的 “安装” ,本质上就是将 docker-compose 的二进制可执行程序放在 Linux 特定的目录下,让 Linux 系统 “多” 出来一个命令可用。

  • step 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
    
  • step 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 重要命令

# 命令选项

命令选项 说明
-f <FILE> 指定使用的 Compose 模板文件,默认为 docker-compose.yml
-p <NAME> 指定项目名称,
默认将使用所在目录名称作为项目名
–verbose 输出更多调试信息
-v 打印版本并退出

# 常用 & 重要命令

docker-compose 等同于 docker-compose -f docker-compose.yml 命令,很显然,默认的编排文件的文件名是 docker-compose.yml 。如果你的编排文件的文件名不是 docker-compose.yml,那么你就需要使用 -f 选项给指定。

# 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 命令总结

  1. -d 在后台运行服务容器。
  2. --no-color 不使用颜色来区分不同的服务的控制台输出。
  3. --no-deps 不启动服务所链接的容器。
  4. --force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
  5. --no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
  6. --no-build 不自动构建缺失的服务镜像。
  7. -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 种设置方式都是可以持久化的。

对于上面使用卷标的写法,你可能需要使用下面的命令查看卷标信息: