Dockerでまとまった何かをする時は docker-compose.yml を用いるのが便利です。docker-compose.ymlを使うと複数のコンテナ、イメージ、ネットワーク、ボリュームの設定を1ファイルにまとめることができ環境構築や管理が簡単になります。
Dockerをプログラム上から動作させる時は docker run や docker exec あたりをよく使います。docker run --rm イメージ名 xxx yyyy
などです。これを使う時のイメージ名やコンテナ名はいつでも決まった値の方が楽です。変わるにしても環境ごとでわかりやすい法則性のある名前にすべきです。
docker-compose.yml をなんとなく使うとイメージ名やコンテナ名の衝突を避けるためか、自動で名前が振られます。これは普段は便利なのですが docker run, docker exec と混ぜる場合には不便です。これの対策として docker-compose.yml 上でイメージ名やコンテナ名を決まった値にする方法を紹介します。
docker-compose.yml に名前を決定するフィールドがあり、これを使えばOKです。これは例えば次のように使えます。
services: app: container_name: my_project_app" image: my_project_app build: context: ./docker/php pull_policy: never
container_name はシンプルです。単純に docker compose で生成されるコンテナ名がこれになるだけです。
Services top-level elements | Docker Docs#container_name
image はイメージ名を定義しています。これは build, pull_policyによって振る舞いを変えます。とりあえず image と build を定義し pull_policy を never とすれば「常に build で定義したイメージをビルドして image で定義した名前にする」と動作します。これは次リンクがリファレンスで採用したい運用方法に合わせて適宜変えることができます。
Services top-level elements | Docker Docs#image
Services top-level elements | Docker Docs#pull_policy
Services top-level elements | Docker Docs#build
環境変数を使うと何か個別で柔軟に変えたい時にも通用します。
container_name: "${DOCKER_CONTAINER_PREFIX:-my_project}_app" image: "${DOCKER_IMAGE_PREFIX:-my_project}_app"
この辺りの制御ができると Docker の中から Docker を使うなどといったプログラムも安定して扱えます。