docker周りの命名規則はスネークケースを使用してますか?ケバブケースを使用してますか?(ケバブケースとはダッシュ'-'で区切る命名規則のことらしいです)
docker周りのネーミングで2つ困ったことがあったので共有したい。
1.dockerのnetwork名
dockerではコンテナが属するnetworkを作成できます。
// hogeネットワークを作成
$ docker network create hoge
$ docker network ls
...
62936e1a893e hoge bridge local
...
// hogeネットワークに属するsome-hogeコンテナをrun
$ docker run -d --name some-hoge --network hoge busybox tail -f /dev/null
docker inspectでこのsome-hogeコンテナのIPを取得したい時がありますが、--format
だと大変なのでjqを使うと、下のようになります。
$ docker inspect some-hoge | jq -r '.[].NetworkSettings.Networks.hoge.IPAddress'
172.20.0.2
また、hoge-networkという名前のnetworkを作成した場合、hogeと同じようにはinspectできません。
$ docker inspect some-hoge | jq -r '.[].NetworkSettings.Networks.hoge-network.IPAddress'
jq: error: network/0 is not defined at <top-level>, line 1:
.[].NetworkSettings.Networks.hoge-network.IPAddress
jq: 1 compile error
これは、dockerではなくjqの都合です。'-'を含んでいる場合、parseが面倒になってしまいます。
$ docker inspect some-hoge | jq -r '.[].NetworkSettings.Networks | .["hoge-network"].IPAddress'
なお、'_'区切りの場合はOKです。下記はhoge_networkというネットワークの場合です。
$ docker inspect some-hoge | jq -r '.[].NetworkSettings.Networks.hoge_network.IPAddress'
このため、dockerのnetwork名で単語を区切りたい場合はスネークケースとするのがよさそうです。
2. docker-composeのプロジェクト名
スケールアウトとコンテナ名
dockerやdocker-composeは、明示的に付与することができます。
...
services:
app:
image: busybox
container_name: hoge
...
しかし、サービスのスケールアウト時にコンテナ名を意識しないといけない設計は、コンテナとコンテナ名を紐づけないといけないという管理上の問題がでてしまい、スケールと相反するものとなってしまいます。
docker-composeのコンテナ名
docker-composeは、サービスをscaleされる機能を持ちますが、前述のcontainer_nameと併用はできません。
$ docker-compose up --scale app=2
WARNING: The "app" service is using the custom container name "hoge". Docker requires each container to have a unique name. Remove the custom name to scale the service.
Recreating hoge-aa ... done
Creating hoge ... error
ERROR: for hoge Cannot create container for service app: Conflict. The container name "/hoge" is already in use by container "038a23c5a5b3ea920b070e700c9d90186364db263ed95b1788c91729f3aae791". You have to remove (or rename) that container to be able to reuse that name.
ERROR: for app Cannot create container for service app: Conflict. The container name "/hoge" is already in use by container "038a23c5a5b3ea920b070e700c9d90186364db263ed95b1788c91729f3aae791". You have to remove (or rename) that container to be able to reuse that name.
ERROR: Encountered errors while bringing up the project.
これについて議論されていますが、scaleとコンテナ名は正反対なものだと言われています。また、composeのドキュメントにも記載されています。
container_nameを削除すると、コンテナ名は、<COMPOSE_PROJECT_NAME>_<service名>_<ID>
とdocker-composeにより命名されます。ドキュメントにも記載があります。
下記の例では、プロジェクト名をhoge-projectとすると、コンテナ名は、hogeproject_app_1、 hogeproject_app_2となっています。
$ docker-compose -p hoge-project up --scale app=2
Creating network "hogeproject_default" with the default driver
Creating hogeproject_app_1 ... done
Creating hogeproject_app_2 ... done
Attaching to hogeproject_app_2, hogeproject_app_1
hoge-project_app_1
と命名されると思いきや、なぜかコンテナ名から'-'が消え、hogeproject_app_1
となっています。
これが厄介で、特に開発時に、コンテナを操作したい場合に困ります。
$ docker logs -f hoge-project_app_1
のように、コンテナ名を指定して操作たいときがあります。これがスクリプト化されていると、
$ docker logs ${COMPOSE_PROJECT_NAME}_hoge_1
みたいに書きたいです。でもこれがhoge-project_hoge_1
と評価されるので存在せず、エラーになります
このプロジェクト名については、'_'もダメで、docker-compose -p hoge_project up
とした場合もコンテナ名は hogeproject_hoge_1
となります。
したがって、docker-composeノプロジェクト名は、スネークケースでもケバブケースでもなく、区切らない名前にしたほうがよさそうです。
まとめ
- dockerのnetwork名はスネークケースにする
- docker-composeのプロジェクト名は区切らない
他ベストプラクティスを模索中ですが参考になれば幸いです。