dockerのiptablesエラーとやけになって死んだ秘書

うちの研究室のシステムの中枢を担っていると言っても過言ではないのがDockerコンテナで運用されているNode-Redなのだが(あらゆるIn/Outが全てNode-Redに飛び相互に変換される)、そろそろ年度も変わるということでちょっと追加の機能でもつけようと思ってみたらまずNode-Red上で新しいノードがインストールできない。いま振り返ると、ここでやけになったのが完全に失敗だった。

npm ERR! code EAI_AGAIN
npm ERR! errno EAI_AGAIN
npm ERR! request to https://registry.npmjs.org/npm failed, reason: getaddrinfo EAI_AGAIN registry.npmjs.org:443

Node-Red上でもDockerコンテナ内のbash環境でも同じエラーが出る。これを適当に調べて対処しようとしたのが間違いだった。調べると

rm -rf node_modules
npm cache clean --force

してキャッシュ周りなどを潰してからインストールし直すと走ると書いてあって、ただこのコンテナ内のnode_modulesフォルダといえば主要なノードが入っているフォルダであって、これを本当に消してもいいのだろうかとか思いながらもやった。やった俺が悪い。

問題は解決しないまま、そもそも docker restartしようとしたコンテナが立ち上がらなくなったり、全く関係ない新規コンテナを立ち上げようとしてもDockerのiptablesエラーが出て既存のコンテナも全て死んだ。エラーの内容は

$ docker run -it -p 1880:1880 -v ~/myNodeRed:/data --name jarvis nodered/node-red:latest
docker: Error response from daemon: driver failed programming external connectivity on endpoint jarvis (16ede8ed37111994224c95880384944119527ae89d4a75bd00f32138c37601b8):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 1880 -j DNAT --to-destination 172.17.0.3:1880 ! -i docker0: iptables: No chain/target/match by that name.

Node-Redではなく元からこいつが悪かったのだ。iptablesが死んでコンテナと外のネットワークの接続がぐちゃぐちゃになっちゃって外部に接続できないから必然的にnpmしてもインストールができなかったのだ。

気づけばJupyter含め全てのコンテナが死んだので、激しく動揺しながら調べると、3年以上前とずいぶん古い記事ではあるもののQiitaにあった Docker 管理のネットワークファイルの再構成 でできることがわかり、

$ mv /var/lib/docker/network/files /tmp/docker-iptables-err
$ systemctl restart docker

つまるところ今あるネットワーク関係のファイルを一旦全部退避させてからDockerを再起動することでその辺のファイルを作り直しているんだろうと思う。これで一瞬で直って、解析用のJupyterやMySQLのコンテナ復活した。

Node-Redのコンテナは node_modules フォルダを消したので立ち上がらなくなった。ふはは。試験期間中で少し時間もあることだしこれを機に秘書を組みなおそう。