Docker 引擎安装故障排除

此页面包含对 Docker 引擎安装进行故障排除和诊断的说明。

内核兼容性

如果您的内核版本低于 3.10,或者缺少内核模块,Docker 将无法正常运行。要检查内核兼容性,您可以下载并运行该 check-config.sh 脚本。

$ curl https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh > check-config.sh

$ bash ./check-config.sh

该脚本仅适用于 Linux。

无法连接到 Docker 守护进程

Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?

该错误可能表明:

  • Docker 守护进程未在您的系统上运行。启动守护进程并尝试再次运行该命令。
  • 您的 Docker 客户端正在尝试连接到另一台主机上的 Docker 守护程序,但该主机无法访问。

DOCKER_HOST要查看客户端正在连接到哪个主机,请检查环境中变量的值 。

$ env | grep DOCKER_HOST

如果此命令返回一个值,则 Docker 客户端将设置为连接到该主机上运行的 Docker 守护程序。如果未设置,则 Docker 客户端将设置为连接到本地主机上运行的 Docker 守护程序。如果设置错误,请使用以下命令取消设置:

$ unset DOCKER_HOST

您可能需要编辑诸如~/.bashrc或 之 类的文件中的环境~/.profile,以防止DOCKER_HOST错误设置变量。

如果DOCKER_HOST按预期设置,请验证 Docker 守护程序是否正在远程主机上运行,​​并且防火墙或网络中断不会阻止您进行连接。

IP转发问题

如果您使用 systemd 版本 219 或更高版本手动配置网络systemd-network,Docker 容器可能无法访问您的网络。从 systemd 版本 220 开始,给定网络 ( ) 的转发设置net.ipv4.conf.<interface>.forwarding默认为关闭。此设置阻止 IP 转发。它还与 Docker net.ipv4.conf.all.forwarding在容器内启用该设置的行为相冲突。

要在 RHEL、CentOS 或 Fedora 上解决此问题,请在 Docker 主机上编辑文件<interface>.network/usr/lib/systemd/network/例如 /usr/lib/systemd/network/80-container-host0.network.

在该部分中添加以下块[Network]

[Network]
...
IPForward=kernel
# OR
IPForward=true

此配置允许按预期从容器进行 IP 转发。

DNS 解析器问题

DNS resolver found in resolv.conf and containers can't use it

Linux 桌面环境通常运行一个网络管理器程序,该程序dnsmasq通过将 DNS 请求添加到/etc/resolv.conf.该 dnsmasq实例在环回地址(例如127.0.0.1或 ) 上运行127.0.1.1。它加速 DNS 查找并提供 DHCP 服务。这样的配置在 Docker 容器中不起作用。 Docker 容器使用自己的网络命名空间,并解析诸如127.0.0.1 自身的环回地址,并且它不太可能在自己的环回地址上运行 DNS 服务器。

如果 Docker 检测到 中引用的 DNS 服务器不是/etc/resolv.conf功能齐全的 DNS 服务器,则会出现以下警告:

WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers
can't use it. Using default external servers : [8.8.8.8 8.8.4.4]

如果您看到此警告,请首先检查您是否使用dnsmasq

$ ps aux | grep dnsmasq

如果您的容器需要解析网络内部的主机,则公共名称服务器是不够的。你有两个选择:

  • 指定 Docker 使用的 DNS 服务器。

  • dnsmasq

    关闭dnsmasq会将实际 DNS 名称服务器的 IP 地址添加到 /etc/resolv.conf,并且您将失go 的好处dnsmasq

您只需使用其中一种方法即可。

为 Docker 指定 DNS 服务器

配置文件的默认位置是/etc/docker/daemon.json.您可以使用守护程序标志更改配置文件的位置--config-file 。以下指令假设配置文件的位置是/etc/docker/daemon.json.

  1. 创建或编辑Docker守护进程配置文件,默认为 /etc/docker/daemon.jsonfile,它控制Docker守护进程配置。

    $ sudo nano /etc/docker/daemon.json
    
  2. 添加一个dns键,并将一个或多个 DNS 服务器 IP 地址作为值。

    {
      "dns": ["8.8.8.8", "8.8.4.4"]
    }

    如果文件已有内容,则只需添加或编辑该dns 行。如果您的内部 DNS 服务器无法解析公共 IP 地址,请至少包含一台可以解析的 DNS 服务器。这样做可以让您连接到 Docker Hub,并且您的容器可以解析互联网域名。

    保存并关闭文件。

  3. 重新启动 Docker 守护进程。

    $ sudo service docker restart
    
  4. 通过尝试拉取镜像来验证 Docker 是否可以解析外部 IP 地址:

    $ docker pull hello-world
    
  5. 如有必要,请验证 Docker 容器是否可以通过 ping 来解析内部主机名。

    $ docker run --rm -it alpine ping -c4 <my_internal_host>
    
    PING google.com (192.168.1.2): 56 data bytes
    64 bytes from 192.168.1.2: seq=0 ttl=41 time=7.597 ms
    64 bytes from 192.168.1.2: seq=1 ttl=41 time=7.635 ms
    64 bytes from 192.168.1.2: seq=2 ttl=41 time=7.660 ms
    64 bytes from 192.168.1.2: seq=3 ttl=41 time=7.677 ms
    

关闭 dnsmasq

乌班图

dnsmasq如果您不想更改 Docker 守护程序的配置以使用特定 IP 地址,请按照以下说明在 NetworkManager 中关闭。

  1. 编辑/etc/NetworkManager/NetworkManager.conf文件。

  2. 通过在行首dns=dnsmasq添加一个字符来注释掉该行。#

    # dns=dnsmasq

    保存并关闭文件。

  3. 重新启动 NetworkManager 和 Docker。作为替代方案,您可以重新启动系统。

    $ sudo systemctl restart network-manager
    $ sudo systemctl restart docker
    

RHEL、CentOS 或 Fedora

dnsmasq要在 RHEL、CentOS 或 Fedora 上关闭:

  1. 关闭dnsmasq服务:

    $ sudo systemctl stop dnsmasq
    $ sudo systemctl disable dnsmasq
    
  2. 使用Red Hat 文档手动配置 DNS 服务器 。

允许通过防火墙访问远程 API

如果您在运行 Docker 的同一主机上运行防火墙,并且想要从另一台远程主机访问 Docker Remote API,则必须将防火墙配置为允许 Docker 端口上的传入连接。默认端口是2376您使用 TLS 加密传输时的端口,否则为默认端口2375

两个常见的防火墙守护进程是:

请参阅您的操作系统和防火墙的文档。以下信息可能会帮助您入门。本说明中使用的设置是宽松的,您可能需要使用不同的配置来进一步锁定系统。

  • 对于 UFW,请DEFAULT_FORWARD_POLICY="ACCEPT"在您的配置中进行设置。

  • 对于firewalld,将类似于以下的规则添加到您的策略中。一种用于传入请求,一种用于传出请求。

    <direct>
      [ <rule ipv="ipv6" table="filter" chain="FORWARD_direct" priority="0"> -i zt0 -j ACCEPT </rule> ]
      [ <rule ipv="ipv6" table="filter" chain="FORWARD_direct" priority="0"> -o zt0 -j ACCEPT </rule> ]
    </direct>

    确保接口名称和链名称正确。

内核 cgroup 交换限制功能

在 Ubuntu 或 Debian 主机上,使用映像时您可能会看到类似以下内容的消息。

WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.

如果您不需要这些功能,可以忽略该警告。

您可以按照以下说明在 Ubuntu 或 Debian 上打开这些功能。即使 Docker 未运行,内存和交换计算也会产生约 1% 的总可用内存开销和 10% 的整体性能下降。

  1. 以具有权限的用户身份登录 Ubuntu 或 Debian 主机sudo

  2. 编辑/etc/default/grub文件。添加或编辑该GRUB_CMDLINE_LINUX行以添加以下两个键值对:

    GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

    保存并关闭文件。

  3. 更新 GRUB 引导加载程序。

    $ sudo update-grub
    

    如果 GRUB 配置文件的语法不正确,则会出现错误。在这种情况下,请重复步骤 2 和 3。

    当您重新引导系统时,更改就会生效。