社内プロキシ環境でdockerコンテナ間の通信
社内環境でコンテナ間通信をしたかったのですが、全く通信が行えなくて困ったので備忘録です。
まずは簡単な結論から
ざっくり原因と対応策を示すと、
- コンテナ内からの通信がプロキシを経由していた
- no_proxyに各コンテナのIPアドレスを設定し解決
またいつも悩まされている社内プロキシ環境が原因であった。
経緯詳細
悩んだ問題は2つの自作したwebapiで動作するコンテナについて相互通信を行い、データ処理をさせたかったのだが、何故か通信ができなかった点である。
インターネットで検索してもピンポイントの解決策がヒットせず、「docker composeで立ち上げればネットワークが勝手に作られるから、ほら簡単に通信できる環境になるよね!」しかなかった。
開発環境
- os : Ubuntu:22.04.3 LTS
- docker : 25.0.2
事象
立ち上げたコンテナから隣のコンテナにアクセスしょうとしたが何も返ってこなかった。
$ docker exec -ti web1 curl http://web2/index.html
原因発覚
curlコマンドの詳細をログ出力してみると。。。
$ docker exec -ti web1 curl http://web2/index.html -v
*Uses proxy env variable http_proxy == '<address_to_proxy>'
.......
あれ?もしかして、プロキシサーバー経由してない?
これか!!
対処方法
ということで、docker-compose.ymlファイルに設定を記載して解決した。
version: "3"
networks:
route1:
ipam:
driver: default
config:
- subnet: 192.168.1.0/24
services:
web1:
image: nginx
# コンテナ名を明示的に指定
container_name: web1
# ビルドで使う設定
environment:
- HTTP_PROXY=$HTTP_PROXY
- HTTPS_PROXY=$HTTPS_PROXY
- http_proxy=$http_proxy
- https_proxy=$https_proxy
# プロキシサーバーを通さないアドレスにコンテナ名とIPアドレスを指定
- NO_PROXY="127.0.0.1,localhost,web1,192.168.1.2,web2,192.168.1.3"
- no_proxy="127.0.0.1,localhost,web1,192.168.1.2,web2,192.168.1.3"
# ネットワーク設定でIPアドレスを固定
networks:
route1:
ipv4_address: 192.168.1.2
web2:
image: nginx
# コンテナ名を明示的に指定
container_name: web2
# ビルドで使う設定
environment:
- HTTP_PROXY=$HTTP_PROXY
- HTTPS_PROXY=$HTTPS_PROXY
- http_proxy=$http_proxy
- https_proxy=$https_proxy
# プロキシサーバーを通さないアドレスにコンテナ名とIPアドレスを指定
- NO_PROXY="127.0.0.1,localhost,web1,192.168.1.2,web2,192.168.1.3"
- no_proxy="127.0.0.1,localhost,web1,192.168.1.2,web2,192.168.1.3"
# ネットワーク設定でIPアドレスを固定
networks:
route1:
ipv4_address: 192.168.1.3
これで立ち上げたコンテナで実行してみると!
$ docker exec -ti web1 curl http://web2/index.html -v
*Uses proxy env variable no_proxy == "127.0.0.1,localhost,web1,192.168.1.2,web2,192.168.1.3"
.......
<正常な出力結果!!!!やった!>
ここで躓いたのはコンテナ名だけでネットワークには通信ができるかと思ったが、IPアドレスも設定しなくてはいけなかったこと。
IPアドレスの設定のためにネットワークとIPアドレスの設定も必要であった。
結論
またもや、社内環境でやられた。。。
いつもこれ系統で時間を費やされるから本当に腹立たしい。
何度も悩まされてるのに忘れた頃にまたやってくるプロキシさん。
今後もうまく付き合っていかなければいけないと思うと悩ましいですね。
一応ソースコードをこちらにおいておきます。