とーますメモ

Ruby on Rails / Goなどの学習メモ

【Docker】docker-composeの超基本な使い方

久しぶりにdocker-composeを使おうとすると、
コマンドをよく忘れているので自分用にメモ。

1)docker-compose.ymlファイルの作成

例)WordPress(+MySQL)を稼働させる

wordpress:
  image: wordpress
  links:
    - dbms:mysql
  ports:
    - 8080:80
dbms:
  image: mysql
  environment:
    - MYSQL_ROOT_PASSWORD=password

2)docker-compose.ymlがあるディレクトリへ移動

省略

3)docker-compose.ymlの記述に基づき、コンテナを一度に起動

$ docker-compose up -d

これで、ホストTCP8080ポート(localhost:8080)にアクセスするとWordPressインストールの画面が表示される。

"-d" オプション

デタッチモードを意味し、このオプションを付けずにdocker-compose upすると、別の作業ができないが、-dをつけると、バックグラウンドでコンテナを起動してくれるため、同ターミナルで作業ができる。

4)よく使用するコマンド

サービスのコンテナ一覧を表示

$ docker-compose stop

サービスのコンテナを停止し、そのコンテナとネットワークを削除。
オプションで[--rmi all]をつけることでイメージも削除可能。
またオプションで[-v]をつけることでdata volumeも削除可能。

$ docker-compose down
$ docker-compose down -v
$ docker-compose down --rmi all -v

サービスを停止

$ docker-compose stop

サービスコンテナを強制的に停止

$ docker-compose kill

停止中のコンテナを削除
※[-f]オプションを付けると、確認なしでコンテナを削除

$ docker-compose rm -f

コンテナからの出力(ログ)を表示

$ docker-compose logs

指定したコンテナからの出力(ログ)を表示

$ docker-compose logs mysql

サービスを起動(コンテナが既に存在する前提)

$ docker-compose start

サービスを再起動

$ docker-compose restart

追記

tty:true

tty:tureをymlに入れると、コンテナが通常が正常終了(exited(0))するのを防ぐことができる。

version: "3"
services:
  webserver:
    build: node
    image: node-express-dev:1.0
    tty: true
    volumes:
      - ./node/app:/app
    ports:
      - "9080:3000"

tty:true設定をすることで、コンテナが正常終了するのを防ぐことができます。
例えば最初にGoコンテナを起動したら正常終了しましたが、あれはGoコンテナにフォアグラウンドで実行するプロセスが無いため、そのままDockerがコンテナを終了させています。
そこでttyです、これを設定することでコンテナ側に仮想端末を置いて実行しているプロセスを用意してあげることによってコンテナを持続させることができます。
正常終了してしまうと、コンテナの中に入ってサーバーを立てたりすることができないので、なんらかのフォアグラウンドで実行するプロセスが必要になります。
その役割がDockerのTTYということです。

[参考]
DockerのTTYって何?

docker execとdocker attachの違い。

どちらのコマンドでもコンテナ内の操作が可能になるが、
attachを使用後、exitするとコンテナが停止してしまう。
execの場合は、コンテナを停止させることがないため、
execを使う用に習慣づけるほうが良い。

[参考]
Dockerコンテナ内で操作 attachとexecの違い - Qiita

Dockerfileのベストプラクティス

RUNコマンドでapt-get updateをするときはapt-get install -yも一緒にすることで

キャッシュ問題に巻き込まれることがなくなる。
またこのとき、インストールパッケージには
必要なパッケージの予期しない変更によって引き起こされる問題を避けるために
特定バーションを設定するほうが良い。

[参考]
Dockerfile のベストプラクティス — Docker-docs-ja 1.9.0b ドキュメント

RUNとCMDの違い

RUN:ビルド時にコンテナ内で実行される

CMD:完成したイメージからコンテナを作成するときに実行される

DockerのRUNとCMDの違い - Qiita

なのでnginx, apacheやmysqlの起動などをDockerfileに書く際は、CMDを使用する。

ボリュームとバインドマウントの違い

ボリューム

Dockerが管理する領域にデータ保存領域が作成され、ホスタ側では意識せずに使用することができる。複数の異なるコンテナで同じデータを共有したい場合に便利。データベース等。