Dockerのコンテナから外に通信ができない問題

こんにちは!トビログ管理人のとびうおです!今回、コンテナの中から外に通信ができないという事件が発生したので対処方法を書きます。

再起動でなおりました。

結論、サーバーを再起動させたら直りました。

管理人
管理人

↑にいたるまで3時間格闘しました

それ以外に試したこと

サーバーを再起動するまでにそれまでに試したことを記述していきます。

初めに症状としては、appコンテナ(phpを中で動かしている)の中でcomposer installをしようとしたところ、通信ができなくてエラーがでてしまうという状態に陥っていました。

具体的には以下のエラーがずっとでていました。

Failed to download symfony/polyfill-php80 from dist: curl error 28 while downloading

そもそも、このエラーがなんででているのかを確かめるために、curlを使ってgoogle.com等に接続できるか確認しました。

curl -v google.com
管理人
管理人

ここで通信ができていないことが発覚しました

Dockerの通信について調べる

Dockerのコンテナの通信について調べ以下のリファレンスに到達しました。

コンテナ通信の理解 — Docker-docs-ja 1.12.RC2 ドキュメント

コンテナが世界と通信できるかどうかは、2つの要素が左右します。1つめの要素は、ホストマシンが IP パケットを転送できるかどうかです。2つめはホスト側の iptables が特定の接続を許可するかどうかです。

IP パケット転送(ip packet forwarding)は、 ip_forward システム・パラメータで管理します。このパラメータが 1 の時のみ、パケットは通信できます。通常、Docker サーバはデフォルトの設定のままでも --ip-forward=true であり、Docker はサーバの起動時に ip_forward を 1 にします。もし --ip-forward=false をセットし、システム・カーネルが有効な場合は、この --ip-forward=false オプションは無効です。カーネル設定の確認は、手動で行います。

https://docs.docker.jp/v1.12/engine/userguide/networking/default_network/container-communication.html

そこで、以下のコマンドで設定をしようとしました。

sysctl net.ipv4.conf.all.forwarding

が、そもそも「sysctl」がコンテナの中に入っていないことが発覚し、apt installしようとしてもネットに繋がらないからできない…という状態に。

そこでビルド時にsysctlを入れることに

そこでappコンテナのビルド時にsysctlをいれてしまえ!ということでDocker.flieに以下の記述を追加しました。

RUN apt-get -y install procps
command-not-found.com - sysctl
Install sysctl command on any operating system and in Docker.

そして無事、sysctlを入れて、以下のコマンドを実行!

$ sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 1
管理人
管理人

ここから沼が始まりました

ここから色々なことを試して、最終的にサーバーを再起動させたろと思い、させたら動きました。

ブログ運営日記

まとめ

最終的になぜ動かなかったのかはわからないですが、1時間くらい粘ったら再起動をしたりキャッシュをクリアしたりしてみるということを忘れないようにしていきたいと思いました。

管理人
管理人

Docker初心者ですが、少し理解できた気がします。

とびうお
ブログ管理人です!
swimaneというアプリをリリースしました!

コメント

タイトルとURLをコピーしました