dockerの命名で落とし穴

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.
```

これについて[議論](https://github.com/docker/compose/issues/3722)されていますが、scaleとコンテナ名は正反対なものだと言われています。また、[composeのドキュメント](https://docs.docker.com/compose/compose-file/#container_name)にも記載されています。
container_nameを削除すると、コンテナ名は、`<COMPOSE_PROJECT_NAME>_<service名>_<ID>`とdocker-composeにより命名されます。[ドキュメント](https://docs.docker.com/compose/reference/envvars/#compose_project_name)にも記載があります。
下記の例では、プロジェクト名を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のプロジェクト名は区切らない

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