首页 文章

Docker apt-get更新失败

提问于
浏览
27

有人可以帮助我在我的docker容器中使用apt-get工作吗?每当我尝试在docker容器中运行任何apt-get命令时,该命令都会失败 . 我正在运行Docker 1.1.1版,在ubuntu 12.04上构建bd609d2 .

当我做

$ sudo docker run -i -t ubuntu:14.04 /bin/bash
# apt-get update

我说错了

无法解析'archive.ubuntu.com'

我尝试在/ etc / default / docker中取消注释下面的行

DOCKER_OPTS =“ - dns 8.8.8.8 --dns 8.8.4.4”

但我仍然无法ping google.com

ping:未知主机

我确认容器正在使用dns服务器8.8.8.8和8.8.4.4

root @ 0baa87fc6322:/ #cat /etc/resolv.conf nameserver 8.8.8.8 nameserver 8.8.4.4

我能够ping两台服务器,所以我很确定防火墙不只是丢弃我的数据包 .

任何帮助都将不胜感激!

谢谢!

5 回答

  • 26

    感谢你的帮助!我发现这是一个dns问题而且是因为防火墙 . 在搜索了一些之后我发现了一个我在搜索'docker apt-get fail'时无法找到的问题

    Docker - Network calls fail during image build on corporate network

    他的问题与我的问题类似,解决方案帮助我解决了问题 . 我已经为将来发现这个问题的任何人复制了他的解决方案 .

    我们的防火墙后面无法访问那些Google服务器,这就是我们无法解析任何网址的原因 . 解决方法是告诉Docker使用哪些DNS服务器 . 此修复程序取决于您安装Docker的方式:Ubuntu软件包如果您安装了Ubuntu软件包,请编辑/ etc / default / docker并添加以下行:DOCKER_OPTS =“ - dns <your_dns_server_1> --dns <your_dns_server_2>”您可以为此配置添加任意数量的DNS服务器 . 编辑完这个文件后,你需要重启你的Docker服务:sudo service docker restart Binaries如果你通过二进制方法安装了Docker(即没有包),那么你在启动Docker守护进程时设置DNS服务器:sudo docker -d -D --dns --dns&

  • 2

    如果您看到类似 Could not resolve ... 的错误,则可能是DNS配置 .

    首先要检查的是在 docker container 中运行 cat /etc/resolv.conf . 如果它具有无效的DNS服务器,例如 nameserver 127.0.x.x ,则容器将无法将域名解析为IP地址,因此 ping google.com 将失败 .

    要检查的第二件事是在 host machine 上运行 cat /etc/resolv.conf . 每次启动容器时,Docker基本上都会将主机的 /etc/resolv.conf 复制到容器中 . 因此,如果主机的 /etc/resolv.conf 错误,那么docker容器也是如此 .

    如果您发现主机的 /etc/resolv.conf 错误,那么您有2个选项:

    • 在daemon.json中对DNS服务器进行硬编码 . 这很容易,但如果您希望更改DNS服务器,则不理想 .

    • 修复主机的 /etc/resolv.conf . 这有点棘手,但它是动态生成的,并且您不会对DNS服务器进行硬编码 .


    1. Hardcode DNS server in docker daemon.json

    • 编辑 /etc/docker/daemon.json
    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
    • 重新启动docker守护程序以使这些更改生效:
      sudo systemctl restart docker

    • 现在,当您运行/启动容器时,docker将使用 daemon.json 中的值填充 /etc/resolv.conf .


    2. Fix the hosts's /etc/resolv.conf

    A. Ubuntu 16.04 and earlier

    • 对于Ubuntu 16.04及更早版本, /etc/resolv.conf 由NetworkManager动态生成 .

    • /etc/NetworkManager/NetworkManager.conf 注释掉 dns=dnsmasq (带 # )行

    • 重新启动NetworkManager以重新生成 /etc/resolv.conf
      sudo systemctl restart network-manager

    • 在主机上验证: cat /etc/resolv.conf

    B. Ubuntu 18.04 and later

    • Ubuntu 18.04更改为使用systemd-resolved to generate /etc/resolv.conf . 现在默认情况下它使用本地DNS缓存127.0.0.53 . 这在集装箱内不起作用,因此Docker将默认使用Google的8.8.8.8 DNS服务器,这可能会破坏防火墙后面的人 .

    • /etc/resolv.conf 实际上是一个符号链接( ls -l /etc/resolv.conf ),在Ubuntu 18.04中默认指向 /run/systemd/resolve/stub-resolv.conf (127.0.0.53) .

    • 只需将符号链接更改为指向 /run/systemd/resolve/resolv.conf ,其中列出了真实的DNS服务器:
      sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

    • 在主机上验证: cat /etc/resolv.conf

    现在,您应该在主机上有一个有效的 /etc/resolv.conf ,以便将docker复制到容器中 .

  • 8

    首先检查你是否有连接,直接ping到指向 archive.ubuntu.com 的ip 91.189.92.201

    ping 91.189.92.201

    如果你仍然无法访问主机,那不是dns问题 .

    此外,如果你有互联网连接,你可以做一个黑客 . 只需在 /etc/hosts 文件中输入一行并解决问题:

    91.189.92.201 archive.ubuntu.com

  • 1

    我在两个不同的案例中遇到了这个问题,而且决议是不同的......

    First one with Win7 + virtualbox(Xubuntu 16.04) 此评论完成了这项工作:https://stackoverflow.com/a/29659783/2260796

    我修改文件/ etc / default / docker:

    DOCKER-OPTS =“ - ip-masq = true --dns my_ip_dns_win --dns 8.8.8.8 --dns 8.8.4.4”并运行sudo service docker restart

    Second one on a Xubuntu OS (ubuntu 16.04) 先前的决议还不够 . 这条评论完成了这项工作:https://github.com/docker/docker/issues/1809我必须在文件/etc/NetworkManager/NetworkManager.conf中注释一行:

    dns = dnsmasq

    然后跑

    sudo重启网络管理员

  • 4

    我正在使用Mint的版本并在安装Docker并尝试创建Ubuntu的映像以执行apt-get update命令无法识别,为了解决问题,我确实下台了

    docker run -it -p 8080:80  ubuntu /bin/bash
    echo "91.189.92.201 archive.ubuntu.com" >> /etc/hosts
    cat /etc/hosts
    apt-get update
    

相关问题