ポートをLISTENしているコンテナのdocker-composeプロジェクトを特定する

docker psおよびdocker inspectを使って特定のポートで起動しているコンテナのdocker-composeプロジェクトを特定します。
2020.07.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

docker-composeでミドルウェアやモックのAPIをローカルで起動する開発を複数プロジェクトで行っていると「コンテナを起動しようとしたけど既に別のプロセスがLISTENしていて起動できない」なんてことがよくあります。たいていの場合数日前に起動した別プロジェクトのコンテナが原因なのですがさっぱり思い出せません。という時にどのプロジェクトのコンテナなのかを調査する方法をいくつか見つけたのでメモしておきます。

Dashboardを使う

コンテナが少ない場合はDockerDesktopに含まれるDashboardが便利です。

Dashboardにはdocker-composeのプロジェクト単位でコンテナ(群)の起動状態を確認できるので、ここで起動しているコンテナにあたりをつけ、さらに詳細を確認することでどのプロジェクトのコンテナが目的のポートを使っているか確認できます。

docker psとinspectを使う

コンテナが多い場合や、GUIで詳細を確認していく場合はdocker psとdocker inspectによってプロジェクトを特定することができます。

ここでは例として以下のコンテナが動いているとします。

$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                                                            NAMES
30ba66683977        mysql:5.7.19            "docker-entrypoint.s…"   24 hours ago        Up 24 hours         0.0.0.0:3306->3306/tcp                                           iggy-v2_mysql_1
c86a50ccbd7b        localstack/localstack   "docker-entrypoint.sh"   4 months ago        Up 14 seconds       4567-4568/tcp, 4570-4584/tcp, 8080/tcp, 0.0.0.0:4569->4569/tcp   facilitator-rotate-bot_localstack_1

ポート4569で動いているコンテナのプロジェクトを特定するため、まずはdocker psで目的のポートを使っているコンテナを特定します。

$ docker ps | grep 4569
c86a50ccbd7b        localstack/localstack   "docker-entrypoint.sh"   4 months ago        Up 3 minutes        4567-4568/tcp, 4570-4584/tcp, 8080/tcp, 0.0.0.0:4569->4569/tcp   facilitator-rotate-bot_localstack_1

次にコンテナID c86a50ccbd7b を指定してコンテナのタグを表示します。

docker inspect c86a50ccbd7b | jq .[0].Config.Labels
{
  "authors": "Waldemar Hummer (waldemar.hummer@gmail.com), Gianluca Bortoli (giallogiallo93@gmail.com)",
  "com.docker.compose.config-hash": "6bc6d7bab70ac8506563e0cf12124cd2541cc1d953de979aae53dd89f60fd74b",
  "com.docker.compose.container-number": "1",
  "com.docker.compose.oneoff": "False",
  "com.docker.compose.project": "facilitator-rotate-bot",
  "com.docker.compose.project.config_files": "docker-compose.yml",
  "com.docker.compose.project.working_dir": "/Users/sasaki.kazuhiro/src/github.com/cm-kazup0n/facilitator-rotate-bot",
  "com.docker.compose.service": "localstack",
  "com.docker.compose.version": "1.25.4"
}

出力されるタグの中のcom.docker.composeで始まるタグを見るとコンテナのプロジェクト名、ディレクトリがわかります。あとは当該プロジェクトのディレクトリに移動してdocker-compose stopするなり、Dashboardで停止するなりしてコンテナを停止します。

まとめ

docker-composeのポート番号は環境変数とdirenvで管理しましょう・・・。