こんにちは!トビログ管理人のとびうおです!今回、コンテナの中から外に通信ができないという事件が発生したので対処方法を書きます。
再起動でなおりました。
結論、サーバーを再起動させたら直りました。
↑にいたるまで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のコンテナの通信について調べ以下のリファレンスに到達しました。
コンテナが世界と通信できるかどうかは、2つの要素が左右します。1つめの要素は、ホストマシンが IP パケットを転送できるかどうかです。2つめはホスト側の
iptables
が特定の接続を許可するかどうかです。IP パケット転送(ip packet forwarding)は、
https://docs.docker.jp/v1.12/engine/userguide/networking/default_network/container-communication.htmlip_forward
システム・パラメータで管理します。このパラメータが1
の時のみ、パケットは通信できます。通常、Docker サーバはデフォルトの設定のままでも--ip-forward=true
であり、Docker はサーバの起動時にip_forward
を1
にします。もし--ip-forward=false
をセットし、システム・カーネルが有効な場合は、この--ip-forward=false
オプションは無効です。カーネル設定の確認は、手動で行います。
そこで、以下のコマンドで設定をしようとしました。
sysctl net.ipv4.conf.all.forwarding
が、そもそも「sysctl」がコンテナの中に入っていないことが発覚し、apt installしようとしてもネットに繋がらないからできない…という状態に。
そこでビルド時にsysctlを入れることに
そこでappコンテナのビルド時にsysctlをいれてしまえ!ということでDocker.flieに以下の記述を追加しました。
RUN apt-get -y install procps
そして無事、sysctlを入れて、以下のコマンドを実行!
$ sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 1
ここから沼が始まりました
ここから色々なことを試して、最終的にサーバーを再起動させたろと思い、させたら動きました。
まとめ
最終的になぜ動かなかったのかはわからないですが、1時間くらい粘ったら再起動をしたりキャッシュをクリアしたりしてみるということを忘れないようにしていきたいと思いました。
Docker初心者ですが、少し理解できた気がします。
コメント