概要

私は、docker-composeで作成したコンテナと通信したいと思ったのですが、うまくできずに通信ができるようになるまで時間がかかってしまいました。

なので、解決方法を書いておきます。

原因

なぜ、普通に通信をしようとしてできなかったのかというと、docker-composeコマンドなどで作成したコンテナは、docker runコマンドで作成したコンテナとは違い、別のネットワークにコンテナがあるため、簡単には通信できないというのが原因でした。

解決方法

普段、docker runコマンドでコンテナを作るとき、何も設定しなければ、bridgeという名前のネットワークにコンテナを配置します。

そのため、同じネットワークにあるコンテナであれば簡単にコンテナ同士で通信できるのですが、docker-composeは何も設定しなければユニークな名前のネットワークを作成して、そこにコンテナを配置します。

そこで考えられるのが、docker runの時に、docker-composeで作成したネットワークに配置する方法です。

その場合、docker runコマンドの実行時に --netオプションでネットワークを設定します。

docker-composeで作成されるネットワークはdocker-compose upなどの実行時にCreating network "*******" with the default driverのようにネットワーク名が表示されます。

それ以外にも、docker network lsで、dockerで作られたネットワークの一覧を見ることができるので、そこでそれっぽいネットワーク名があれば、それが作成されたネットワークです。

それでも、ネットワーク名がわからない場合は、docker network inspect ネットワーク名で、そのネットワークに属しているコンテナなどを調べることができるので、そこにdocker-composeで作成したコンテナがあれば、それがdocker-composeで作成されたネットワークであると言えます。

ネットワーク名が分かったら、このようにdocker runコマンドを実行して、ネットワークを指定してコンテナを起動します。

docker run --rm -it --net ネットワーク名 busybox /bin/bash

このコンテナは、busyboxイメージを利用して、bashを立ち上げています。

--rmとしているので、bashをexitなどで閉じると自動的にコンテナを削除します。

ほかにも、docker-composeの方で、bridgeネットワークでコンテナを作るようにして、docker runのデフォルトで配置されるネットワークにコンテナを配置する方法でもいいのではないかと色々試行錯誤してみたのですが、こちらはうまくいきませんでした。

さいごに

おそらく、このようにネットワークが分けられるのは、コンテナの見通しをよくしたり、セキュリティを向上させたりなどの理由だと思います。