LoginSignup
12
9

More than 5 years have passed since last update.

dockerの命名で落とし穴

Last updated at Posted at 2018-02-28

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できません。

NG
$ 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が面倒になってしまいます。

OK
$ docker inspect some-hoge | jq -r '.[].NetworkSettings.Networks | .["hoge-network"].IPAddress'

なお、'_'区切りの場合はOKです。下記はhoge_networkというネットワークの場合です。

OK
$ docker inspect some-hoge | jq -r '.[].NetworkSettings.Networks.hoge_network.IPAddress'

このため、dockerのnetwork名で単語を区切りたい場合はスネークケースとするのがよさそうです。

2. docker-composeのプロジェクト名

スケールアウトとコンテナ名

dockerやdocker-composeは、明示的に付与することができます。

docker-compose.yml
...
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と評価されるので存在せず、エラーになります :weary:
このプロジェクト名については、'_'もダメで、docker-compose -p hoge_project upとした場合もコンテナ名は hogeproject_hoge_1 となります。
したがって、docker-composeノプロジェクト名は、スネークケースでもケバブケースでもなく、区切らない名前にしたほうがよさそうです。

まとめ

  • dockerのnetwork名はスネークケースにする
  • docker-composeのプロジェクト名は区切らない

他ベストプラクティスを模索中ですが参考になれば幸いです。

12
9
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9