本稿では、icc (Inter-Container Communication) を誤って設定してしまった場合に、icc 設定を削除し、ネットワーク設定を変更する方法を記載します。
以前、「docker のネットワーク (docker0) 設定変更 - Qiita」で docker ネットワーク(範囲)変更の方法を書きましたが、Raspbian (buster) の docker-ce
では動作が異なり、変更ができませんでした (最悪、systemd による dockerd の起動が失敗し、立ち上がらなくなります)。
調べたところ、これは Raspbian によるものではなく、テストで一時的に icc を設定していたものが残っていたためでした。
しかし、docker で icc=false に設定しても systemd 側にネットワーク設定が残っており、これを削除する必要がありました。
現象
systemctl start docker
で起動させようとすると以下のメッセージを出力し、エラー終了する。
Job for docker.service failed because the control process exited with error code.
See “systemctl status docker.service” and “journalctl -xe” for details.
systemctl status docker.service
と journalctl -xe
で参照しても、よくわからず、システムログを参照しました。
/var/log/daemon.log
に以下のような記録が出ていました。
failed to start daemon: Error initializing network controller: Error creating default "bridge" network: Poo
l overlaps with other one on this address space
各プラットフォームのログの場所とファイル名は「Read the logs - Configure and troubleshoot the Docker daemon | Docker Documentation] に記載があります。
1. dockerd の停止
dockerd を停止します。(念のため、container は事前にすべて停止してください)
systemctl stop docker
2. link デバイスの削除
docker_gwbridge
インタフェース(ブリッジ)を削除します。
- ブリッジインタフェースを確認します。
ip link show
- ブリッジインタフェースを削除します。
ip link del docker_gwbridge
3. systemd の kv ファイルを削除と systemd のリロード
systemd に残っている Key-Value store の db を削除して、systemd のリロードを行います。
rm /var/lib/docker/network/files/local-kv.db
systemctl daemon-reload
4. dockerd の起動
dockerd の stop から 60秒以上経過していることを確認してください1。
必要に応じて、icc や bip などを設定します。
{
"icc": false,
"bip": "172.17.1.254/24"
}
dockerd を起動します。
systemctl start docker
docker_gwbridge
が作成されていないことを確認します。
ip addr
または
ip link show
docker 側のネットワークデバイスを確認します。
docker network ls
または
docker network inspect bridge
終了。
さいごに
-
/var/lib/docker/network/files/local-kv.db
を削除するのが正しいオペレーションなのかどうか、わかっていません。 - docker のドキュメントを調べてもなかなか正解が見当たらず、systemd 側を調べて KV store に思い当たり、削除を試みました。
- systemd の dockerd のインターバル設定に気づかず、すぐに start させてしまうと設定が正しくてもエラーになり、これで時間を費やしました。
-
dockerd の起動インターバルが 60s に設定されているため、すぐに起動すると、設定が正しくてもエラーになります。 ↩