Docker Root Dir は docker pull などでダウンロードしたコンテナイメージが保管される場所です。デフォルトでは /var/lib/docker と設定されているため、人によってはディスクの空き容量があっという間に足りなくなってしまう可能性があります。
変え方はいろいろある
Linux 界隈のあるあるですが、何かをしたい場合の手段が必ずと言っていいほど複数存在しています。これが一般人に難解さを感じさせる原因なのではないかと思います。
それはさておき、まずは dockerd の起動オプションで場所を指定する方式です。
$ cat /lib/systemd/system/docker.service [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target docker.socket firewalld.service containerd.service time-set.target Wants=network-online.target containerd.service Requires=docker.socket [Service] Type=notify # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not support the cgroup feature set required # for containers run by docker ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ExecReload=/bin/kill -s HUP $MAINPID TimeoutStartSec=0 RestartSec=2 Restart=always
ExecStart= の部分が dockerd の起動オプションの指定です。ここに -g /home/〜 みたいな感じで起動オプションを追加してあげれば Docker Root Dir を変更できます。
同じ方式の派生版ですが /etc/systemd/system/docker.service.d/docker.conf というファイルを作成し、ここに ExecStart= を記載しても変更できます。
もう一つは daemon.json を用意するパターンです。
/etc/docker/daemon.json
{
"graph": "/home/xxxxxxxx/docker-image"
}
結論としてはこちらの daemon.json で変更する方式を採用しました。
最初の docker.service を編集した場合、Docker CE のアップデートで内容が更新されてしまい、再編集しないといけなくなりそうだったからです。
その次の docker.conf を用意する方式も似たような理由です。アップデートで docker.service が変更された時に docker.conf を追い上げないといけないからです。
daemon.json を使うとアップデートによる変更の影響を受けず、起動オプションの中でも自分が変更したい部分をピンポイントで変更できそうです。
いざ変更
daemon.json の用意ができたので、dockerd に反映してみます。まずは停止からです。
$ systemctl stop docker.service Warning: Stopping docker.service, but it can still be activated by: docker.socket
おっと、docker.socket も停止しないといけないようですね。
$ systemctl stop docker.socket
docker.socket も停止しました。
$ systemctl daemon-reload $ systemctl start docker.service docker.socket Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xeu docker.service" for details.
なんと!docker の起動エラーになってしまいました。systemctl status で確認しろとのことです。はい、確認してみます。
$ systemctl status docker.service
× docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; preset: enabled)
Active: failed (Result: exit-code) since Sun 2024-05-26 11:08:24 JST; 20s ago
Duration: 1d 16min 55.917s
TriggeredBy: × docker.socket
Docs: https://docs.docker.com
Process: 72220 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, statu>
Main PID: 72220 (code=exited, status=1/FAILURE)
CPU: 52ms
5月 26 11:08:24 xxxxx systemd[1]: docker.service: Scheduled restart job, restart counter is at 3.
5月 26 11:08:24 xxxxx systemd[1]: Stopped docker.service - Docker Application Container Engine.
5月 26 11:08:24 xxxxx systemd[1]: docker.service: Start request repeated too quickly.
5月 26 11:08:24 xxxxx systemd[1]: docker.service: Failed with result 'exit-code'.
5月 26 11:08:24 xxxxx systemd[1]: Failed to start docker.service - Docker Application Container Engine.
「Start request repeated too quickly.」とあります。 docker.service と docker.socket を同時に start したのがいけなかったんでしょうか?
docker.socket の方も確認してみます。
$ systemctl status docker.socket
× docker.socket - Docker Socket for the API
Loaded: loaded (/lib/systemd/system/docker.socket; enabled; preset: enabled)
Active: failed (Result: service-start-limit-hit) since Sun 2024-05-26 11:08:24 JST; 1min 15s ago
Duration: 6.544s
Triggers: ● docker.service
Listen: /run/docker.sock (Stream)
CPU: 818us
5月 26 11:08:17 xxxxx systemd[1]: Starting docker.socket - Docker Socket for the API...
5月 26 11:08:17 xxxxx systemd[1]: Listening on docker.socket - Docker Socket for the API.
5月 26 11:08:24 xxxxx systemd[1]: docker.socket: Failed with result 'service-start-limit-hit'.
「service-start-limit-hit」とあります。もしや一度でもこの状態になると何かしらリセットしないと二度と起動できなくなってしまうのでしょうか?
という訳で、ステータスのリセットコマンドを発見したので投入してみます。
$ systemctl reset-failed docker.service $ systemctl reset-failed docker.socket
うん、ステータスはリセットされました。
この状態でもう一度 docker.socket と docker.service を順番に起動してみたのですが、状況は変わらずでエラーになってしまいます。
ちょっと作戦を変更
なんかこれは起動のタイミングの問題ではなさそうだ、という勘が働きました。試しに追加で作成した daemon.json をリネームして無効化してみました。
そして docker を起動させてみると、キレイに起動されます。
なるほど、追加した daemon.json に問題があるようです。
先ほど用意していた daemon.json の見た感じは問題なさそうだったのですが、調べてみると原因が見つかりました。Docker のバージョンによって指定するパラメーター名が違うそうです!!!
Docker 23 未満は graph で、Docker 23 以降は data-root で指定するという違いがあるそうです。
ここまで来れば勝ったも同然です。daemon.json を再編集して docker を再起動させます。
$ sudo docker info
Client: Docker Engine - Community
Version: 26.1.3
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.14.0
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.27.0
Path: /usr/libexec/docker/cli-plugins/docker-compose
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 26.1.3
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: systemd
Cgroup Version: 2
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
Swarm: inactive
Runtimes: runc io.containerd.runc.v2
Default Runtime: runc
Init Binary: docker-init
containerd version: 8b3b7ca2e5ce38e8f31a34f35b2b68ceb8470d89
runc version: v1.1.12-0-g51d5e94
init version: de40ad0
Security Options:
apparmor
seccomp
Profile: builtin
cgroupns
Kernel Version: 6.7.12-zen3
Operating System: LMDE 6 (faye)
OSType: linux
Architecture: x86_64
CPUs: 12
Total Memory: 23.35GiB
Name:
ID:
Docker Root Dir: /home/xxxxxxxx/docker-image
Debug Mode: false
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
いやぁ、長い戦いでした。