一、关于

Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用。

Compose 定位是“defining and running complex applications with Docker”,前身是 Fig,兼容 Fig 的模板文件。

Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。

该项目由 Python 编写,实际上调用了 Docker 提供的 API 来实现。

Compose 面向项目进行管理,一个项目可以由多个服务(容器)关联而成。

  • 服务(service):一个应用容器,实际上可以运行多个相同镜像的实例。
  • 项目(project):由一组关联的应用容器组成的一个完整业务单元。

二、安装

运行下面的命令去下载 Docker Compose 的最新稳定版。

curl -SL https://github.com/docker/compose/releases/download/v2.13.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

添加可执行权限

sudo chmod +x /usr/local/bin/docker-compose

添加软链接

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

测试安装

$ docker-compose --version

三、Compose 命令

基本的使用格式是

docker-compose [options] [COMMAND] [ARGS...]

支持以下选项:

  • –verbose 输出更多调试信息。
  • –version 打印版本并退出。
  • -f, –file FILE 使用特定的 compose 模板文件,默认为 docker-compose.yml。
  • -p, –project-name NAME 指定项目名称,默认使用目录名称。

支持以下命令

  • build:构建或重新构建服务。
  • kill:通过发送 SIGKILL 信号来强制停止服务容器。
  • logs:查看服务的输出。
  • port:打印绑定的公共端口。
  • ps:列出所有容器。
  • pull:拉取服务镜像。
  • rm:删除停止的服务容器。
  • run:在一个服务上执行一个命令。
  • scale:设置同一个服务运行的容器个数。
  • start:启动一个已经存在的服务容器。
  • stop:停止一个已经运行的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。
  • restart:重新启动一个已经存在的服务容器。
  • up:构建,(重新)创建,启动,链接一个服务相关的容器。
  • down:停止并删除一个服务相关的容器。
  • config:检查配置,添加-q参数只输出错误。
  • exec [服务ID]:进入容器示例内部

如果使用 docker-compose up -d ,将会在后台启动并运行所有的容器。默认情况,如果该服务的容器已经存在, docker-compose up 将会停止并尝试重新创建他们(保持使用volumes-from 挂载的卷),以保证 docker-compose.yml 的修改生效。如果你不想容器被停止并重新创建,可以使用 docker-compose up –no-recreate。如果需要的话,这样将会启动已经停止的容器。

四、YAML 模板文件

默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建。其它大部分指令都跟 docker run 中的类似。

如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中再次设置。

常用指令如下:

  • image:指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉去这个镜像
  • build:指定 Dockerfile 所在文件夹的路径。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
  • command:覆盖容器启动后默认执行的命令。
  • links:链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 (SERVICE:ALIAS) 格式都可以。
  • external_links:链接到 docker-compose.yml 外部的容器,甚至 并非 Compose 管理的容器。参数格式跟 links 类似。
  • ports:暴露端口信息。
  • expose:暴露端口,但不映射到宿主机,只被连接的服务访问。
  • volumes:卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。
  • volumes_from:从另一个服务或容器挂载它的所有卷。
  • environment:设置环境变量。
  • env_file:从文件中获取环境变量,可以为单独的文件路径或列表。
  • extends:基于已有的服务进行扩展。
  • net:设置网络模式。
  • dns:配置 DNS 服务器。

五、部署一个springboot服务

创建docker-compose.yml文件

version: '3'
services:
  mysql:
    image: mysql:5.7
    container_name: mysql
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/init:/docker-entrypoint-initdb.d/
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    ports:
      - "3306:3306"
    restart: always
    networks:
      - rabb_net
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
  redis:
    image: redis:6.0.8
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - ./redis/data:/data
      - ./redis/conf/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    restart: always
    networks:
      - rabb_net
  springboot:
    image: rabb-springboot-test:2.0
    container_name: springboot
    ports:
      - "12345:12345"
    restart: always
    command: --spring.data.redis.host=redis --spring.datasource.url=jdbc:mysql://mysql:3306/test?useSSL=false&charsetEncoding=utf8
    depends_on:
      - redis
      - mysql
    networks:
      - rabb_net
networks:
  rabb_net: 

启动

docker-compose build --no-cache
docker-compose up -d

另外,上边的docker-compose.yml文件需要先构建出rabb-springboot-test:2.0镜像,我们也可以直接在中定义build指令来直接从Dockerfile文件中构建出对应镜像

...
  springboot:
    image: rabb-springboot-test:3.0
    build: ./springboot
    container_name: springboot
    ports:
      - "12345:12345"
    restart: always
    command: --spring.data.redis.host=redis --spring.datasource.url=jdbc:mysql://mysql:3306/test?useSSL=false&charsetEncoding=utf8
    depends_on:
      - redis
      - mysql
    networks:
      - rabb_net
...