[Docker]
Dockerのトラブルシュート
dockerの保持するデータが増えたとき
- dockerで/var/lib/docker/overlay2 が肥大化した時の対処
- 不要なデータが溜まってきたらやる
ただし使っているデータも消えたりするので、やる前に消えてもいいか覚悟が必要。
+ | 作業ログ |
- 消す対象を絞り、シェル+docker-composeで一気に消す場合
docker-compose stop yes | docker-compose rm docker volume ls -q | grep {プロジェクト名称} | xargs docker volume rm
Linuxでdockerをやるときにcgroupがどうとかで起動できない
理由は詳しく調べてないが、以下で解決する
sudo mkdir /sys/fs/cgroup/systemd sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
docker-desktopがLinuxで動かない
- v4.9.0で動かないのはバグっぽい、v4.8.2にダウングレードしたら動いた
dockerコンテナ上のCentOSでのsystemctlの問題
dockerは基本1プロセスで動かすことを想定されているので、systemctlを使うようにするには/sbin/initをDockerfileのCMDで指定してあげる必要がある。
- /sbin/initとはなんぞやという話は以下
そして、そのあたりの話はCentosの公式リポジトリで解決されているので、ドキュメント通りにDockerfileを使えばよい。
FROM centos:7 ENV container docker RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \ systemd-tmpfiles-setup.service ] || rm -f $i; done); \ rm -f /lib/systemd/system/multi-user.target.wants/*;\ rm -f /etc/systemd/system/*.wants/*;\ rm -f /lib/systemd/system/local-fs.target.wants/*; \ rm -f /lib/systemd/system/sockets.target.wants/*udev*; \ rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \ rm -f /lib/systemd/system/basic.target.wants/*;\ rm -f /lib/systemd/system/anaconda.target.wants/*; VOLUME [ "/sys/fs/cgroup" ] CMD ["/usr/sbin/init"]
https://hub.docker.com/_/centos より
何でもいいのでとりあえず最後に/user/sbin/initを起動しとけばコンテナ起動後にsystemctlが操作できるはず。
dockerコンテナ上のCentOSでのsystemctl実行時D-Busでエラーになる問題
で、上の流れでCentosのコンテナを起動すると
Failed to get D-Bus connection: Operation not permitted
とか
Failed to get D-Bus connection: No such file or directory
のエラーメッセージが出て起動できない。
これはリンク先とか他のQiitaの記事でもかなり書かれている。
docker-desktopを使った状態で、"deprecatedCgroupv1": trueにすれば解決します。
cgroupの(おそらくファイルシステム的なもの)バージョンが異なるためのエラーのようです。Centosのコンテナ側のcgroupとホスト側のcgroupに差異がある。
docker-desktopを使ってない場合、dockerdのランタイム用のオプションを使って制御できるのかもしれませんが、そういった情報は見つかりませんでした。