Docker-compose.ymlについて
Docker-composeは、複数のdockerイメージをビルドしてコンテナを作成できる。
コマンド一つで複数のコンテナを起動できる。
Docker-compose.ymlといいファイルに、コンテナの中身をサービスとして定義する。dockerイメージなどを指定する感じ。
詳しい中身
実際何を定義してるの?って話
version:
- Dockerエンジンが1.13.1+以上がverison3.0に対応してる。
- バージョン指定しない場合は、レガシーフォーマット である
1.0
となる - マイナーバージョンを指定しない
version: '3'
とかの場合はマイナーバージョン0version: '3.0'
になる。 - 3と2で結構違うぽい。特別な理由がなければ3を使うので良いと思われる。
対応表
https://docs.docker.com/compose/compose-file/
service:
起動するコンテナに相当する。
サービス名は自分で決めて良い。
例えば公式から拝借した↓の定義だと、db
となっている部分は自分で決めることができる。
version: "3.9"
services:
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
max_replicas_per_node: 1
constraints:
- "node.role==manager"
image:
Dockerイメージを使用する場合はここでイメージを指定する。
resart:
再起動設定
デフォルトはno
コンテナが終了してても再起動をするかどうか
英語↓
日本語↓
depends_on:
サービス間(コンテナ間)の依存関係を記述できる。
コンテナを起動したときは 依存されているやつ → 依存しているやつ
終了する時は 依存しているやつ → 依存されてるやつ
の順番になる
links:
コンテナ同士を連携させる。でもこれを使うのは古い。
docker-composeを使うと、自動的に連携されているので記述は不要。
ports:
ホストとコンテナのポートを対応づける。
ホスト側の値がキーで、コンテナ側の値はバリューになる。
volumes:
コンテナ内にデータをおいてもコンテナを破棄すると消えてしまうので、コンテナの外(ボリューム)におく。
やり方は、主に2種類ある。
バインドマウント
- https://matsuand.github.io/docs.docker.jp.onthefly/storage/bind-mounts/
- ホスト側のディレクトリをコンテナ内のディレクトリと共有する。
- ボリュームと違って既存のディレクトリをマウントするので、ホストマシンのファイルシステムに依存することになる。従って、ボリュームを使うことが推奨されている。
ボリューム
-
https://matsuand.github.io/docs.docker.jp.onthefly/storage/volumes/
-
ホスト上(macのdockerはVMで動いてるのでVM)に新規でディレクトリが作成されて、保存領域を確保してくれる。Linux なら
/var/lib/docker/volumes/
以下になる。 -
名前付きボリュームと匿名ボリュームがあり、名前付きの場合は Docker ホスト内で名前解決できるのでアクセスしやすい。匿名ボリュームは適当にハッシュ値が振られる。他のプロセスからは触ることができないので安全。基本はこれを使うのがよい。
-
docker volume ls
でボリューム一覧を見ることができる。実態を見るには↓がわかりやすかった。
マウントオプション
マウントオプションというものがある。
https://docs.docker.jp/docker-for-mac/osxfs-caching.html](https://docs.docker.jp/docker-for-mac/osxfs-caching.html
-
consistent
:完全な一貫性(常にホストとコンテナが完全に同じ表示) -
cached
:ホストの表示が信頼できる(ホスト上の更新がコンテナ上に反映するまで、遅延が発生するのを許容) -
delegated
:コンテナの表示が信頼できる(コンテナ上の更新がホスト上に反映するまで、遅延が発生するのを許容)
environment:
環境変数。ホストじゃなくてコンテナに割り当てられる。
以下、pypmyadminとMySQLを使ったので個人的なまとめ
pypmyadminの環境変数
- PMA_ARBITRARY:1にすると、任意のサーバーに接続できる。
- PMA_HOST:MySQLのホスト(サービス)の名前
- PMA_USER and PMA_PASSWORD:ユーザー名とパスワード
- PMA_PORT:MySQLのポートを指定する
MySQLの環境変数
- MYSQL_ROOT_PASSWORD:rootアカウントのパスワード
- MYSQL_DATABASE:データベース名
Build:
content:
dockerfileがあるディレクトリ
dockerfile:
dockerfileの名前
args:
dockerfile内で使用する環境変数
参考
https://blog1.mammb.com/entry/2020/05/19/090000
https://qiita.com/aki_55p/items/63c47214cab7bcb027e0
https://qiita.com/gounx2/items/23b0dc8b8b95cc629f32
https://qiita.com/nacika_ins/items/cf8ceb20711bd077f770