jba*_*dua 30 dns ubuntu-12.04 docker
有人可以帮助我在我的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
Run Code Online (Sandbox Code Playgroud)
我说错了
无法解析'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两台服务器,所以我很确定防火墙不只是丢弃我的数据包.
任何帮助都将不胜感激!
谢谢!
jba*_*dua 27
感谢你的帮助!我发现这是一个dns问题而且是因为防火墙.在搜索了一些之后我发现了一个我在搜索'docker apt-get fail'时无法找到的问题
他的问题与我的问题类似,解决方案帮助我解决了问题.我已经为将来发现这个问题的任何人复制了他的解决方案.
我们的防火墙后面无法访问这些Google服务器,这就是我们无法解析任何网址的原因.
解决方法是告诉Docker使用哪些DNS服务器.此修复程序取决于您如何安装Docker:Ubuntu Package
如果安装了Ubuntu软件包,请编辑/ etc/default/docker并添加以下行:
DOCKER_OPTS =" - dns <your_dns_server_1> --dns <your_dns_server_2>"
您可以根据需要为此配置添加任意数量的DNS服务器.编辑完此文件后,您将需要重新启动Docker服务:
sudo服务码头重启
二进制
如果你已经通过二进制方法安装了Docker(即没有包),那么在启动Docker守护进程时设置DNS服务器:
sudo docker -d -D --dns --dns&
Hen*_*nke 11
$ sudo docker run -i -t --net=host ubuntu /bin/bash\n# apt-get update\nRun Code Online (Sandbox Code Playgroud)\n没有错误!- 注意添加的--net=host.
下面我将展示如何重现该错误。
\n我在一台干净的机器上执行了以下操作,除了 Ubuntu 18.04 \n安装了其他任何东西。
首先安装docker。一次复制粘贴一行,并\n在每行后面\n敲击:Enter
\nsudo apt update # took 11 seconds for me\nsudo apt install -y apt-transport-https ca-certificates \\\ncurl software-properties-common\nRun Code Online (Sandbox Code Playgroud)\n上面两个命令中的第二个(一个命令分成两行)\ 是可选的,对我来说大约需要 20 秒。
\necho "cacert=/etc/ssl/certs/ca-certificates.crt" >> ~/.curlrc\ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg \\\n| sudo apt-key add -\nRun Code Online (Sandbox Code Playgroud)\nsudo add-apt-repository "deb [arch=amd64] https://\\\ndownload.docker.com/linux/ubuntu $(lsb_release -cs) stable"\nRun Code Online (Sandbox Code Playgroud)\n上面的命令对我来说花了大约 7 秒。
\nsudo apt update # ~3 seconds this time\nsudo apt install -y docker-ce # ~1 minute for me\nRun Code Online (Sandbox Code Playgroud)\n可选- 如果您不喜欢每次都docker添加前缀:sudo
sudo usermod -aG docker ${USER}\nRun Code Online (Sandbox Code Playgroud)\n注销并重新登录。
\n确认docker现在已添加到您的组中:
id -nG\nRun Code Online (Sandbox Code Playgroud)\n现在到感兴趣的核心部分:
\n$ sudo docker run -it ubuntu /bin/bash # ~10 seconds for me\n# apt update # first Err after ~1 minute\nErr:1 http://archive.ubuntu.com/ubuntu focal InRelease\n Connection failed [IP: 91.189.88.152 80]\nErr:2 http://security.ubuntu.com/ubuntu focal-security InRelease\n Connection failed [IP: 91.189.88.152 80]\nErr:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease\n Connection failed [IP: 91.189.88.152 80]\nErr:4 http://archive.ubuntu.com/ubuntu focal-backports InRelease\n Connection failed [IP: 91.189.88.152 80]\n...\nW: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal/InRelease [...]\n...\nW: Some index files failed to download. They have been ignored, [...]\nRun Code Online (Sandbox Code Playgroud)\n请注意我刚刚如何重新创建了 OP 描述的错误!
\nOP 得到了Could not resolve \'archive.ubuntu.com\',
\n而我得到了Failed to fetch http://archive.ubuntu.com。
\n但根本原因是相同的:docker 容器无法访问\n互联网。
我不想留在这个糟糕的 docker 容器中,所以我点击了Ctrl + D。
\n也不想保留它,所以我这样做:
sudo docker container ps -a\nRun Code Online (Sandbox Code Playgroud)\n这告诉我,CONTAINER ID在我的例子中是c05ec98236f0.
我删除这个容器:
\nsudo docker container rm c05ec98236f0\nRun Code Online (Sandbox Code Playgroud)\n注意一些不会给我错误的东西。
\n$ sudo docker run -it --net=host ubuntu bash\n# apt update # ~7 seconds\nGet:1 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]\n...\nFetched 16.4 MB in 4s (4332 kB/s)\nReading package lists... Done\nBuilding dependency tree\nReading state information... Done\n3 packages can be upgraded. Run \'apt list --upgradable\' to see them.\nRun Code Online (Sandbox Code Playgroud)\n瞧\xc3\xa0!没有错误!
\n参考文献:\
n https://askubuntu.com/questions/1162163#1162198\n
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-18 -04
\n /sf/ask/221263661/#31424970
\n /sf/ask/3032146351/#43317607
如果您看到类似的错误Could not resolve ...,则可能是DNS配置.
要检查的第一件事是cat /etc/resolv.conf在docker容器中运行.如果它具有无效的DNS服务器,例如nameserver 127.0.x.x,则容器将无法将域名解析为IP地址,因此ping google.com将失败.
要检查的第二件事是cat /etc/resolv.conf在主机上运行./etc/resolv.conf每次启动容器时,Docker基本上都会将主机复制到容器中.因此,如果主机/etc/resolv.conf是错误的,那么docker容器也是如此.
如果您发现主机/etc/resolv.conf错误,那么您有两个选择:
在daemon.json中对DNS服务器进行硬编码.这很容易,但如果您希望更改DNS服务器,则不理想.
修复主机/etc/resolv.conf.这有点棘手,但它是动态生成的,并且您不会对DNS服务器进行硬编码.
1.在docker daemon.json中硬编码DNS服务器
编辑 /etc/docker/daemon.json
{
"dns": ["10.1.2.3", "8.8.8.8"]
}
Run Code Online (Sandbox Code Playgroud)重新启动docker守护程序以使这些更改生效:
sudo systemctl restart docker
现在,当您运行/启动容器时,docker将填充/etc/resolv.conf来自的值daemon.json.
2.修复主机 /etc/resolv.conf
A. Ubuntu 16.04及更早版本
对于Ubuntu 16.04及更早版本,/etc/resolv.conf由NetworkManager动态生成.
注释掉dns=dnsmasq(用a #) 行/etc/NetworkManager/NetworkManager.conf
重新启动NetworkManager以重新生成/etc/resolv.conf:
sudo systemctl restart network-manager
在主机上验证: cat /etc/resolv.conf
B. Ubuntu 18.04及更高版本
Ubuntu 18.04改为使用systemd-resolved生成/etc/resolv.conf.现在默认情况下它使用本地DNS缓存127.0.0.53.这在集装箱内不起作用,因此Docker将默认使用Google的8.8.8.8 DNS服务器,这可能会破坏防火墙后面的人.
/etc/resolv.conf实际上是一个符号链接(ls -l /etc/resolv.conf),/run/systemd/resolve/stub-resolv.conf在Ubuntu 18.04中默认指向(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复制到容器中.
| 归档时间: |
|
| 查看次数: |
58930 次 |
| 最近记录: |