Dockerを普通に使う分には問題ないのだけれど、例えばDockerホストがダウンしたあととか、普通に docker run
したり docker rm
したりするとエラーになる。そんなときに対応したときのメモです。
docker run時にエラー
ネットワークのエンドポイントを削除する
docker run
実行時に以下のメッセージが出てエラーとなる場合
docker: Error response from daemon: service endpoint with name <container name> already exists.
古いコンテナが残っているのかなと思ってdocker ps -a
とかを実行しても出てこない。メッセージの通り、古いコンテナのNetworkのEndpointが残っています。
所属するであろうnetowrk名を調べます。
docker network inspect <network name>
(略)
"dd73bf98b2299a631581f16c9a159602e125b5f588a0a64a5bc64587cf08334f": {
"Name": "<container name>",
"EndpointID": "57f4826689a57238f0630b648d81abd20b7e01371bbcd9884dc6d96200bc7091",
"MacAddress": "02:42:ac:12:00:07",
"IPv4Address": "172.18.0.7/16",
"IPv6Address": ""
},
これが残っているせいで新しい同名のコンテナを作ることができません。以下のコマンドで削除することができます。
docker network disconnect -f <network name> <container name>
後はコンテナを作り直せるはず。
docker rm 時にエラー
ボリュームをアンマウントする
docker rm -f
などでコンテナを削除しようとしても、やたらと時間がかかり(タイムアウトまで待っている)、結果的にコンテナが削除できていないとき。
syslogに以下のようなメッセージが出ている場合です。
Mar 22 01:55:16 host dockerd[32048]: time="2017-03-22T01:55:16.803688411+09:00" level=info msg="Container dd73bf98b229 failed to exit within 10 seconds of kill - trying direct SIGKILL"
Mar 22 01:55:16 host dockerd[32048]: time="2017-03-22T01:55:16.832892540+09:00" level=error msg="Handler for DELETE /v1.25/containers/<container name> returned error: Unable to remove filesystem for dd73bf98b2299a631581f16c9a159602e125b5f588a0a64a5bc64587cf08334f: remove /var/lib/docker/containers/dd73bf98b2299a631581f16c9a159602e125b5f588a0a64a5bc64587cf08334f/shm: device or resource busy"
デバイスがbusyでアンマウントできていません。普通に mount
コマンドを実行するとマウントが見えているので、 umount
します。
umount /var/lib/docker/containers/dd73bf98b2299a631581f16c9a159602e125b5f588a0a64a5bc64587cf08334f/shm
後はコンテナを消せるはず。
多分他にもいろいろハマりどころがあるんだろうなぁ…。