久しぶりに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を使う用に習慣づけるほうが良い。
Dockerfileのベストプラクティス
RUNコマンドでapt-get updateをするときはapt-get install -yも一緒にすることで
キャッシュ問題に巻き込まれることがなくなる。
またこのとき、インストールパッケージには
必要なパッケージの予期しない変更によって引き起こされる問題を避けるために
特定バーションを設定するほうが良い。
RUNとCMDの違い
RUN:ビルド時にコンテナ内で実行される
CMD:完成したイメージからコンテナを作成するときに実行される
なのでnginx, apacheやmysqlの起動などをDockerfileに書く際は、CMDを使用する。
ボリュームとバインドマウントの違い
ボリューム
Dockerが管理する領域にデータ保存領域が作成され、ホスタ側では意識せずに使用することができる。複数の異なるコンテナで同じデータを共有したい場合に便利。データベース等。
バインドマウント
ホスト側のディレクトリを直接コンテナ側と同期することができる。
またこのときファイルを直接バインドしないようにする。
Dockerでファイルをbind mountしたら同期されなかった話
[参考]
Docker Composeでボリュームとバインドマウントを使ってみる | amateur engineer's blog
バインドマウントの利用 | Docker ドキュメント
docker-compose の bind mount を1行で書くな
Docker の Volume バックアップ(Docker v19.03, macOS/Windows10) - Qiita