docker的存儲目錄遷移
(轉載的文章,親測有效)
docker的默認存儲目錄是/var/lib/docker
,目錄結構如下:
[root@ztscshop docker]# cd /var/lib/docker
[root@ztscshop docker]# ll
total 64
drwx------ 2 root root 4096 Jan 24 2019 builder
drwx------ 4 root root 4096 Jan 24 2019 buildkit
drwx--x--x 3 root root 4096 Jan 24 2019 containerd
drwx------ 4 root root 4096 Oct 24 15:05 containers
drwx------ 3 root root 4096 Jan 24 2019 image
drwxr-x--- 3 root root 4096 Jan 24 2019 network
drwx------ 80 root root 16384 Oct 24 15:25 overlay2
drwx------ 4 root root 4096 Jan 24 2019 plugins
drwx------ 2 root root 4096 Oct 22 11:57 runtimes
drwx------ 2 root root 4096 Jan 24 2019 swarm
drwx------ 2 root root 4096 Oct 24 15:13 tmp
drwx------ 2 root root 4096 Jan 24 2019 trust
drwx------ 15 root root 4096 Feb 7 2019 volumes
[root@ztscshop docker]#
docker所有自身的東西都會存在這些文件夾下面包括鏡像文件和容器,所以會占用越來越多的磁盤空間。
如果docker所在的磁盤空間比較小,磁盤空間被占滿沒有空間的時候,顯然會導致docker容器運行失敗,此時必然要遷移docker的存儲目錄到一個更大的磁盤下面。
1.查看磁盤占用情況:df -h
[root@ecs-8f49 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs 7.8G 73M 7.7G 1% /run
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/vda1 40G 13G 25G 33% /
tmpfs 1.6G 0 1.6G 0% /run/user/0
overlay 40G 13G 25G 33% /var/lib/docker/overlay2/53eb033fae8fadc98df74b118e743092fcd0ee68b579c2b771288c3c023b0b8b/merged
shm 64M 0 64M 0% /var/lib/docker/containers/8ecb90f024c08468c5f32e7c8b8b0d1ff87616536e6c2155cfb58447bded3071/shm
2.查看docker自身的內存占用:docker system df
[root@ecs-8f49 ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 16 12 2.893 GB 1.535 GB (53%)
Containers 12 1 155.6 MB 155.6 MB (100%)
Local Volumes 1 1 4.212 GB 0 B (0%)
3.docker system prune
命令可以用於清理磁盤,刪除關閉的容器、無用的數據卷和網絡,以及dangling鏡像(即無tag的鏡像)。
[root@ecs-8f49 ~]# docker system prune
WARNING! This will remove:
- all stopped containers
- all volumes not used by at least one container
- all networks not used by at least one container
- all dangling images
Are you sure you want to continue? [y/N] y
Deleted Containers:
9bd48276fcd28b3882605fd67a156a7ea848f8fbfe16c3588b630955dfda253d
74af4504bdefbc58b83a476c12d6ce10260f91349eed0e5bfca5e51b86fb8474
d405d43eeb7908472b4b8712f668ca3b97f3796f6afc1c1d19a15879140ddf64
9f645670de22840d04249351d07b2f68f77754e4dfebdb4b39c56d827d6b6805
79d32c6b3c34bb359cbbf8309d7be34074da391d3b48083f456a5911259a5213
ad7137d7e018144e17790a3c86a8217a95faecd07a39003bc4df275c8c8d351d
b02eb42677a52663e50fc4a2b1344d37a8d2a2cca445fe5eae49648a0ca54b13
0813454a5421cf380b72265c2e6832411a590479424dbc3470e47e1cc9cdd740
a58b5f545ce1cd03a2899ba277641b5f52203802d9672c72f281f2d5a31fc219
936e65f72c60d754cb2a1441d0cdeb18f9a7ebde353f091fc44a034733fed52c
ad86565bd85af04f5847703ba213d226c7d7b69e5210211e4170671d3ea4051c
Deleted Volumes:
37620879ca58c052c47e7677a1851f45c25cbc0437c8883cc2fe8e70e1cb921a
Total reclaimed space: 4.368 GB
4.docker system prune -a
命令清理得更加徹底,可以將沒有容器使用Docker鏡像都刪掉。注意,這兩個命令會把你暫時關閉的容器,以及暫時沒有用到的Docker鏡像都刪掉了…所以使用之前一定要想清楚.。我沒用過,因為會清理 沒有開啟的 Docker 鏡像。
5.遷移/var/lib/docker
目錄。
5.1 停止docker服務
systemctl stop docker
5.2 創建新的docker目錄,執行命令df -h,找一個大的磁盤。 我在 /home目錄下面建了 /home/docker/lib
目錄,執行的命令是:
mkdir -p /home/docker/lib
5.3 遷移/var/lib/docker
目錄下面的文件到 /home/docker/lib
:
(rsync是linux文件夾同步的命令,參數要加一個-r,因為文件夾要遞歸copy,如果在同一台服務器上面,直接cp也是可以的)
rsync -r -avz /var/lib/docker /home/docker/lib/
5.4 配置 /etc/systemd/system/docker.service.d/devicemapper.conf
。查看 devicemapper.conf
是否存在。如果不存在,就新建。
mkdir -p /etc/systemd/system/docker.service.d/
vi /etc/systemd/system/docker.service.d/devicemapper.conf
5.5 然后在 devicemapper.conf
寫入:(同步的時候把父文件夾一並同步過來,實際上的目錄應在 /home/docker/lib/docker )
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --graph=/home/docker/lib/docker
5.6 重新加載 docker
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
5.7 為了確認一切順利,運行
docker info
命令檢查Docker 的根目錄.它將被更改為 /home/docker/lib/docker
...
Docker Root Dir: /home/docker/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
...
5.8 啟動成功后,再確認之前的鏡像還在:
root@nn0:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
AAA/AAA v2 7331b8651bcc 27 hours ago 3.85GB
BBB/BBB v1 da4a80dd8424 28 hours ago 3.47GB
5.9 確定容器沒問題后刪除/var/lib/docker/
目錄中的文件。
6.遷移/var/lib/docker
目錄后,Docker無法啟動 (error initializing graphdriver: driver not supported)
啟動信息
[root@nn0 ~]# 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.
啟動詳情
8月 31 01:47:25 localhost.localdomain systemd[1]: Starting Docker Application Container Engine...
-- Subject: Unit docker.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit docker.service has begun starting up.
8月 31 01:47:25 localhost.localdomain dockerd[2390]: time="2018-08-31T01:47:25.197015872+08:00" level=info msg="libcontainerd: new containerd process, pid: 2393"
8月 31 01:47:26 localhost.localdomain dockerd[2390]: time="2018-08-31T01:47:26.204103195+08:00" level=error msg="[graphdriver] prior storage driver overlay2 failed: driver not supported"
8月 31 01:47:26 localhost.localdomain dockerd[2390]: Error starting daemon: error initializing graphdriver: driver not supported
8月 31 01:47:26 localhost.localdomain systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
8月 31 01:47:26 localhost.localdomain systemd[1]: Failed to start Docker Application Container Engine.
錯誤原因:error initializing graphdriver: driver not supported
解決辦法:在 /etc/docker
目錄下創建daemon.json文件,並且加入以下配置
touch daemon.json
vi daemon.json
{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
再次啟動:systemctl start docker
7. docker-runc not installed on system 問題
問題描述
docker運行鏡像的時候,報錯如下:
(如果報錯端口映射的錯誤,那就先不映射端口直接啟動鏡像,試一下是不是這個錯誤,因為如果直接映射端口啟動鏡像的話,這個錯誤導致容器啟動失敗,但是報錯是端口映射失敗)
[root@nn0 k8s]# docker run -it registry.helloworld.com/test/atsd:latest bash
WARNING: IPv4 forwarding is disabled. Networking will not work.
/usr/bin/docker-current: Error response from daemon: shim error: docker-runc not installed on system.
問題解決:
[root@nn0 k8s]# cd /usr/libexec/docker/
[root@nn0 docker]# ln -s docker-runc-current docker-runc