概要
私は、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
のデフォルトで配置されるネットワークにコンテナを配置する方法でもいいのではないかと色々試行錯誤してみたのですが、こちらはうまくいきませんでした。
さいごに
おそらく、このようにネットワークが分けられるのは、コンテナの見通しをよくしたり、セキュリティを向上させたりなどの理由だと思います。