docker-composeでよく使うコマンド

![1_QVFjsW8gyIXeCUJucmK4XA.png](https://qiita-image-store.s3.amazonaws.com/0/258841/bd3c6f25-ff0a-59bf-8c17-3b26845ef8a0.png)

## 背景

docker-composeを雰囲気で使っているのでコマンドの意味を再確認する意味もかねて記事を作成

## docker-composeとは

yaml形式の設定ファイルで複数コンテナを実行を一括で管理できるツール
インストールなどは別記事をご参照ください。
[Docker Compose のインストール](http://docs.docker.jp/compose/install.html)

## 環境

``` console
$ docker --version
Docker version 18.09.1, build 4c52b90

$ docker-compose --version
docker-compose version 1.22.0, build f46880f
```

## とりあえずhelp

buildやup,down等の基本コマンド以外を打つときはまずhelp見ます。
これでもわからなければネットなどで調べてます。

``` console
$ sudo docker-compose help
Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file
                              (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name
                              (default: directory name)
  --verbose                   Show more output
  --log-level LEVEL           Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
  --no-ansi                   Do not print ANSI control characters
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the
                              name specified in the client certificate
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)
  --compatibility             If set, Compose will attempt to convert deploy
                              keys in v3 files to their non-Swarm equivalent

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information
```

## ビルド

サービスをビルドします。
サービス名を指定してビルドすることもできます。
「--no-cache」等も指定できます。

``` console
$ sudo docker-compose build

## サービスを指定してビルド
$ sudo docker-compose build nginx

## Usage
Usage: build [options] [--build-arg key=val...] [SERVICE...]

Options:
    --compress              Compress the build context using gzip.
    --force-rm              Always remove intermediate containers.
    --no-cache              Do not use cache when building the image.
    --pull                  Always attempt to pull a newer version of the image.
    -m, --memory MEM        Sets memory limit for the build container.
    --build-arg key=val     Set build-time variables for services.
```

## 起動/停止/再起動

up,downでサービスの起動停止を行います。

downとstopの違いは公式より下記のように記載されています。
downは「コンテナ・ネットワーク・イメージ・ボリュームの停止と削除」
stopは「サービスの停止」

``` console
# 起動
$ sudo docker-compose up
## バックグラウンド実行なら「-d」を付けてup
$ sudo docker-compose up -d
## サービスを指定して起動するなら
$ sudo docker-compose up nginx

# 停止
$ sudo docker-compose stop
## 停止かつコンテナを削除
$ sudo docker-compose down
## イメージも合わせて削除
$ sudo docker-compose down --rmi all

# 再起動
$ sudo docker-compose restart
```

## yamlの確認

docker-compose.ymlで書かれてる内容が表示されます。
どのようなサービスで構成されているか確認するオプション「--service」もあります。
書き方に誤りがあるときはエラーを出力してくれます。
up前に確認したりするのに使ってます。

``` console
$ sudo docker-compose config
services:
  db:
    image: postgres
  web:
    build:
      context: /root/work/docker-compose
    command: python manage.py runserver 0.0.0.0:8000
    depends_on:
    - db
    ports:
    - 8000:8000/tcp
    volumes:
    - /root/work/docker-compose:/code:rw
version: '2.0'

## サービス名だけ取得
$ docker-compose config --service
db
web

## エラーがあるとき
$ sudo docker-compose config
ERROR: yaml.scanner.ScannerError: while scanning a simple key
  in "./docker-compose.yml", line 14, column 3
could not find expected ':'
  in "./docker-compose.yml", line 15, column 1
```


## create

構築されたサービスを参考にそのコンテナを作ります。
ここで作られたコンテナは起動している状態ではありません。
これもまた引数にサービス名を指定して、特定のサービスだけのコンテナを作ることも可能です。

``` console
$ docker-compose create
Creating db_1
Creating web_1

## サービス名を指定
$ sudo docker-compose create db
```

## events

コンテナからのイベントを受信します。

``` console
$ docker-compose events

## Usage
Usage: exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]

Options:
    -d, --detach      Detached mode: Run command in the background.
    --privileged      Give extended privileges to the process.
    -u, --user USER   Run the command as this user.
    -T                Disable pseudo-tty allocation. By default `docker-compose exec`
                      allocates a TTY.
    --index=index     index of the container if there are multiple
                      instances of a service [default: 1]
    -e, --env KEY=VAL Set environment variables (can be used multiple times,
                      not supported in API < 1.25)
    -w, --workdir DIR Path to workdir directory for this command.
```

## exec
`docker exec`コマンドと同等のことができます。
引数にサービス名と実行するコマンドを指定して実行します。

``` console
$ docker-compose exec web /bin/bash
```

## images
対象のイメージの情報を表示します。

``` console
$ sudo docker-compose images
     Container             Repository        Tag       Image Id      Size
--------------------------------------------------------------------------
docker-compose_db_1    postgres             latest   5a02f920193b   298 MB
docker-compose_web_1   docker-compose_web   latest   1b7d48087d77   870 MB
```


## kill

コンテナを強制停止します。
シグナルを指定して送ることも可能です。

``` console
## usage
Force stop service containers.
Usage: kill [options] [SERVICE...]
Options:
    -s SIGNAL         SIGNAL to send to the container.
                      Default signal is SIGKILL.

$ sudo docker-compose kill
Killing rails5product_web_1 ... done
Killing rails5product_db_1 ... done
```

## logs
サービスのログを出力します。
また引数でサービス名を指定できるので、そうするとサービスごとにログを出力してくれます。

``` console
$ docker-compose logs

## ログをリアルタイム追跡(tailfのように出力「-t」で時間も)
$ sudo docker-compose logs -ft
db_1   | 2019-02-11T02:21:46.417460752Z The database cluster will be initialized with locale "en_US.utf8".
db_1   | 2019-02-11T02:21:46.417466610Z The default database encoding has accordingly been set to "UTF8".
db_1   | 2019-02-11T02:21:46.417487267Z The default text search configuration will be set to "english".
```

## pause

サービスを一旦停止します。
勿論サービスごとに一時停止も可能です。

``` console
$ docker-compose pause
Pausing db_1 ... done
Pausing web_1 ... done
```

## port

割り当てているポートを表示します。引数でサービス名とポート番号が必要になります。
tcp,udpでプロトコルの指定も可能です。

``` console 
## usage
Usage: port [options] SERVICE PRIVATE_PORT

Options:
    --protocol=proto  tcp or udp [default: tcp]
    --index=index     index of the container if there are multiple
                      instances of a service [default: 1]

$ sudo docker-compose port web 3000
0.0.0.0:3000
```

## ps

コンテナの一覧を表示します。

``` console
$ sudo docker-compose ps
        Name                      Command               State     Ports
-------------------------------------------------------------------------
docker-compose_db_1    docker-entrypoint.sh postgres    Up       5432/tcp
docker-compose_db_2    docker-entrypoint.sh postgres    Up       5432/tcp
docker-compose_web_1   python manage.py runserver ...   Exit 2

## サービス名でも確認できます
$ sudo docker-compose ps web
        Name                      Command               State    Ports
----------------------------------------------------------------------
docker-compose_web_1   python manage.py runserver ...   Exit 2
```

## pull
サービスのイメージをプルしてきます。

``` console
$ sudo docker-compose pull

## Usage
Usage: pull [options] [SERVICE...]

Options:
    --ignore-pull-failures  Pull what it can and ignores images with pull failures.
    --parallel              Deprecated, pull multiple images in parallel (enabled by default).
    --no-parallel           Disable parallel pulling.
    -q, --quiet             Pull without printing progress information
    --include-deps          Also pull services declared as dependencies
```

## rm

停止中のコンテナを削除します。
起動中のコンテナも削除するならば「-f」を指定してください

``` console
$ sudo docker-compose rm 

## 強制削除
$ sudo docker-compose rm -f
```

## scale

サービスを実行するコンテナ数を指定します

```console
$ sudo docker-compose scale db=2
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Starting docker-compose_db_1 ... done
Creating docker-compose_db_2 ... done
```

こちらは現在は非推奨とのこと。コメントありがとうございます。
[Docker Compose 1.13.0から「scale」が非推奨になり、「up --scale」に](https://kazuhira-r.hatenablog.com/entry/20170714/1500048645)

## top
各コンテナのプロセス情報を表示します。

``` console
$ sudo docker-compose top
docker-compose_db_1
  UID       PID    PPID    C   STIME   TTY     TIME                      CMD
----------------------------------------------------------------------------------------------
logstash   15251   14858   0   11:21   ?     00:00:00   postgres: stats collector
logstash   15252   14858   0   11:21   ?     00:00:00   postgres: logical replication launcher

docker-compose_db_2
  UID       PID    PPID    C   STIME   TTY     TIME                      CMD
----------------------------------------------------------------------------------------------
logstash   28206   28009   0   11:46   ?     00:00:00   postgres: stats collector
logstash   28207   28009   0   11:46   ?     00:00:00   postgres: logical replication launcher
```

## まとめ

とりあえずこれ使えれば問題あっても調査の足掛かりにはなると思う。

## 参考リンク

[公式リファレンス](https://docs.docker.com/compose/)
[docker-composeを使うと複数コンテナの管理が便利に](https://qiita.com/y_hokkey/items/d51e69c6ff4015e85fce)
[docker-compose コマンドまとめ](https://qiita.com/wasanx25/items/d47caf37b79e855af95f)