[appendix]
= Docker Compose

Compose 项目是 Docker 官方的开源项目，负责实现对 Docker 容器集群的快速编排。
使用 Dockerfile 我们很容易定义一个单独的应用容器。
然而在日常开发工作中，经常会碰到需要多个容器相互配合来完成某项任务的情况。
例如要实现一个 Web 项目，除了 Web 服务容器本身，往往还需要再加上后端的数据库服务容器；
再比如在分布式应用一般包含若干个服务，每个服务一般都会部署多个实例。
如果每个服务都要手动启停，那么效率之低、维护量之大可想而知。
这时候就需要一个工具能够管理一组相关联的的应用容器，这就是 Docker Compose。

Compose有2个重要的概念：
* 项目（Project）: 由一组关联的应用容器组成的一个完整业务单元，在 docker-compose.yml 文件中定义。
* 服务（Service）: 一个应用的容器，实际上可以包括若干运行相同镜像的容器实例。

== 模版文件
模板文件是使用 Compose 的核心, 涉及到的指令关键字也比较多, 默认的模板文件名称为 docker-compose.yml，格式为 YAML 格式。

[source,bash]
----
version: '3'
services:
  elasticsearch:
    image: elasticsearch:6.8.5
    container_name: elasticsearch
    restart: always
    depends_on:
      - db
      - redis
    volumes:
      - /app/skywalking/elasticsearch/data:/usr/share/elasticsearch/data:rw
      - /app/skywalking/elasticsearch/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - /app/skywalking/elasticsearch/conf/jvm.options:/usr/share/elasticsearch/config/jvm.options
      - /app/skywalking/elasticsearch/logs:/usr/share/elasticsearch/logs:rw
    environment:
      - TZ=Asia/Shanghai
      - xpack.monitoring.enabled=false
      - xpack.watcher.enabled=false
    ports:
      - "9200:9200"
      - "9300:9300"

    ulimits:
      nproc: 65535
        nofile:
          soft: 20000
          hard: 40000
----

== 常用命令
=== 列出 Compose 文件中包含的镜像
[source,bash]
----
# 列出 Compose 文件中包含的镜像
docker-compose -f docker-compose.yml images
----

=== 列出项目中目前的所有容器
[source,bash]
----
# 列出项目中目前的所有容器
docker-compose -f docker-compose.yml ps
----

=== 构建（重新构建）项目中的服务容器
[source,bash]
----
# 构建（重新构建）项目中的服务容器
# 一般搭配自定义镜像, 比如编写的 Dockfile, 功能类似于 docker build
docker-compose -f docker-compose.yml build
----

=== up
[source,bash]
----
# 构建（重新构建）项目中的服务容器
# 一般搭配自定义镜像, 比如编写的 Dockfile, 功能类似于 docker build
# 参数说明:
#     -d 在后台运行服务容器, 默认前台运行,控制台将会同时打印所有容器的输出信息，可以很方便进行调试
#     --no-color 不使用颜色来区分不同的服务的控制台输出
#     --no-deps 不启动服务所链接的容器
#     --force-recreate 强制重新创建容器，不能与 --no-recreate 同时使用
#     --no-recreate 如果容器已经存在了，则不重新创建，不能与 --force-recreate 同时使用,默认先停止容器，然后重新创建
#     --no-build 不自动构建缺失的服务镜像
#     -t, --timeout TIMEOUT 停止容器时候的超时（默认为 10 秒）
docker-compose -f docker-compose.yml up
----

=== down
[source,bash]
----
# 停止用up命令所启动的容器并移除网络
docker-compose -f docker-compose.yml down
----

=== stop
[source,bash]
----
# 停止已经处于运行状态的容器，但不删除它
# 停止所有服务
docker-compose -f docker-compose.yml stop

# 停止指定的名为 xxx 的服务
docker-compose -f docker-compose.yml stop xxx
----

=== restart
----
# 重启项目中的服务
docker-compose -f docker-compose.yml restart
----

=== logs
----
# 查看服务容器的输出
# 默认情况下, docker-compose 将对不同的服务输出使用不同的颜色来区分, 可以通过 --no-color 来关闭颜色

# 查看整体的日志
docker-compose -f docker-compose.yml logs

# 查看名为 xxx 的服务的日志
docker-compose -f docker-compose.yml logs xxx
----

=== rm
----
# 移除容器
docker-compose -f docker-compose.yml rm
----

