docker常用错误及解决办法

docker常用错误及解决办法

  1. dial unix /var/run/docker.sock: connect: permission denied
docker: Got permission denied while trying to connect to the Docker daemon socket at
unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.29/containers/create:
dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.
  • 原因
    当前用户不能访问/var/run/docker.sock。
    例如你在终端访问 ls /var/run/docker.sock就会返回permission denied的错误信息。
  • 解法方案
    把用户加入到docker的组里面。
    $ sudo usermod -a -G docker $USER
    然后退出当前用户,重新登录,或者干脆重启系统。
  1. docker: Error response from daemon: error creating overlay mount to
docker: Error response from daemon: error creating overlay mount to 
/var/lib/docker/overlay2/479e27801f39279709b5ad025a5f74f79df773d1ea98630cb06b5a4487b51e14-init/merged: invalid argument.
See 'docker run --help'.
  • 原因
    docker缺省使用overlay storage driver
  • 解决方案
    把overlay改成devicemapper storage driver
# check storage driver
$ docker info | grep "Storage Driver"
Storage Driver: overlay2

# stop docker
$ systemctl stop docker

# edit configure file
$ vim /etc/docker/daemon.json
{
  "storage-driver": "devicemapper"
}
# start docker
$ systemctl start docker

# check storage driver
$ docker info | grep "Storage Driver"
Storage Driver: devicemapper

然后你会碰到如下提示:

$ docker info
...
WARNING: devicemapper: usage of loopback devices is strongly discouraged for production use.
Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.

紧接着你会遇到docker的性能特别差, top命令会发现loop0 device特别忙。
解决办法:
第一步:添加一个disk device,参考virtualbox如何给VM增加设备。
第二步:参考docker的官方文档,设置devicemapper
https://docs.docker.com/storage/storagedriver/device-mapper-driver/

  1. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
  • 原因
    这个问题通常出现在你需要通过proxy访问外网的情况。

  • 办法
    给docker设置一下proxy。(参考: https://docs.docker.com/config/daemon/systemd/)

# step 1: edit configure file
$ sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://proxy-server.com:80"
# step 2: reload configure
$ sudo systemctl daemon-reload
# step 3: restart docker
$ sudo systemctl restart docker
# step 4: verify configure value
$ systemctl show --property=Environment docker
  1. docker: Error response from daemon: devmapper: Thin Pool has 9922 free data blocks which is less than minimum required 10083 free data blocks. Create more free space in thin pool or use dm.min_free_space option to change behavior.
  • 原因
    是device-mapper在删除镜像时没有回收,这是一个内核bug。

  • 解决办法
    标准的解决办法是打Linux的补丁,使得在内核层面解决问题。如果不想打补丁,或者不知道怎么打补丁,也不想去倒腾了,那么可以使用下面的手工临时释放空间的办法。

下面的办法是一个临时办法,就是手工清理空间。

# 清理dangling volumes:
docker volume rm $(docker volume ls -qf dangling=true)

# 或者
# docker volume ls -f dangling=true   # 列出所有dangling的volume
# docker volume prune                 # 删除dangling的volume

 
# 清理dangling image:
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)

# 或者
# docker images -f dangling=true    # 列出所有dangling的image
# docker images purge               # 删除dangling的image

# 其他相关的删除命令
# - 根据自定义规则删除image
# docker images -a | grep "pattern" | awk '{print $1":"$2}' | xargs docker rmi

# - 一次删除所有dangling状态的资源,包括image, container, volume, network
# docker system prune

#- 一次删除所有stopped的container,和未使用的image(不只限于dangling的image)
# docker system prune -a

你可能感兴趣的:(docker常用错误及解决办法)