总结了一下平常Docker常见的错误处理,大概二十几个左右。
问题起因 由于公司最开始的服务器在/var/lib/docker
没有挂载存储,容量只有40G,导致服务器磁盘用满。现将原有的Docker目录数据进行迁移。
注意:请各位Kubernetes用户不要操作,因为容器编排不支持!
# 启动容器发现如下报错
ERROR:cannot create temporary directory!
# 1.停止docker服务
systemctl stop docker
# 2.开始迁移目录
mv /var/lib/docker /data/
# 使用cp命令也可以
cp -arv /var/lib/docker /data/docker
# 3.添加软链接
ln -s /data/docker /var/lib/docker
# 4.启动docker服务
systemctl start docker
vim /etc/docker/daemon.json
{
"graph": [ "/data/docker/" ] # 更改docker镜像的存储目录
}
问题描述:docker run
的时候系统提示No space left on device
!
这个问题无非就两种情况
因为 ext3
文件系统使用 inode table
存储 inode
信息,而 xfs
文件系统使用 B+ tree
来进行存储。考虑到性能问题,默认情况下这个 B+ tree
只会使用前 1TB
空间,当这 1TB
空间被写满后,就会导致无法写入 inode
信息,报磁盘空间不足的错误。我们可以在 mount
时,指定 inode64
即可将这个 B+ tree
使用的空间扩展到整个文件系统。
# 查看inde信息
df -i
# 删除过多的小文件即可
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 593344 56998 536346 10% /
tmpfs 238282 1 238281 1% /dev/shm
/dev/sda1 51200 39 51161 1% /boot
/tmp/1m 128 128 0 100% /app/logs
如果不知道小文件如何查找
# 查找系统中 目录大小大于1M(目录一般大小为4K,所以目录要是大了那么文件必然很多)
find / -size +4k -type d |xargs ls -ldhi
如果是硬盘空间满了的话
# 查看磁盘使用容量
df -h
# 查看到具体哪个目录满了,然后配合 du -sh命令解决即可
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 8.8G 0 100% /
tmpfs 931M 0 931M 0% /dev/shm
/dev/sda1 190M 40M 141M 22% /boot
不停止重启,重启docker是一件多么美妙的事情!
当 Docker
守护程序终止时,它会关闭正在运行的容器。从 Docker-ce 1.12
开始,可以在配置文件中添加 live-restore
参数,以便在守护程序变得不可用时容器保持运行。需要注意的是 Windows
平台暂时还是不支持该参数的配置。
vim /etc/docker/daemon.json
{
"live-restore": true
}
在守护进程关闭的时候保持容器运行
# 重载docker服务
systemctl reload docker.service
[root@VM-0-9-centos ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e58a220f03c3 nginx "/docker-entrypoint.…" 5 minutes ago Up 15 seconds 80/tcp web
# 这个时候重启docker服务,web服务并没有停止工作
[root@VM-0-9-centos ~]# systemctl restart docker
[root@VM-0-9-centos ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e58a220f03c3 nginx "/docker-entrypoint.…" 7 minutes ago Up About a minute 80/tcp web
当前的Live Restore特性可以在进行Daemon维护,或者在Daemon发生问题导致不可用的情况,减少容器的停机时间,不过其也有一定的限制。
问题描述: 容器内部中文乱码、无法正常显示中文、
--------���
# 查看容器内部编码
root@e58a220f03c3:/# locale -a
C
C.UTF-8
POSIX
然而 POSIX
字符集是不支持中文的,而 C.UTF-8
是支持中文的只要把系统中的环境 LANG
改为 "C.UTF-8"
格式即可解决问题。同理,在 K8S
进入 pod
不能输入中文也可用此方法解决。
export LANG=zh_CN.UTF-8