Try   HackMD

Change docker root on Ubuntu

因為 Docker 的資料很佔空間,預設的位置空間不太夠,需要把相關資料都移到另外一個位置,所以把搬運過程記錄下來。[1]

Change Root Dir

Check root dir

$ docker info
...
Root Dir: /var/lib/docker 

Check systemd

$ systemctl status docker
...
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)

可以看到 systemd 是從哪個 config 檔案開啟 docker 服務。比如上面就是 /lib/systemd/system/docker.service

那麼,啟動 dockerd 自訂的 config 就應該放在 /lib/systemd/system/docker.service.d/docker.root.conf

Modify config

確認 docker.service.d/docker.root.confdocker.service:

[Service]
ExecStart=/usr/bin/docker -H fd://

docker.root.conf 裡,修改 ExecStart,在原本的指令下加上 argument: -g /new/docker/root

不應該直接改 docker.service,因為這個檔案是程式自動生成,只要更新 docker 就會被改掉。docker.service.d/docker.root.conf 是不會隨著更新消失的 user config,如果原本沒有就建一個。

所以修改後 docker.root.conf 大概會長得像這樣:

[Service]
ExecStart=/usr/bin/docker -g /new/docker/root -H fd://

Move files

改完 root dir 之後應該會需要把之前 root dir 裡的檔案都移到新的 root dir,可以用 rsync:

rsync -a /var/lib/docker/* /path/to/new/root

-a 的意思是原封不動的複製過去,包括 permission、create time、modified time 等等。都複製完之後就可以 rm -r /var/lib/docker 把他刪掉了。

Restart Deamon

改好 config 之後要重開 deamon 才會生效。

$ systemctl daemon-reload
$ systemctl restart docker
$ docker info
...
Root Dir: /path/to/new/root

Problem: failed to update store for object type libnetwork.network

重開 docker 後要起 container 遇到 failed to update store for object type libnetwork.network,解法如下(似乎 private networks 都會被刪掉,需要再一一重開):[2]

rm /var/lib/docker/network/files/*
systemctl restart docker

  1. Change Docker Root, Github: IronicBadger/til ↩︎

  2. Issue: failed to update store for object type *libnetwork.network: json: cannot unmarshal bool into Go value of type string, Github: moby/moby ↩︎