Docker:临时解析“deb.debian.org”失败

85
我有一个Rails应用程序,我想使用Docker在Ubuntu服务器上部署它。我已经设置了应用程序的Dockerfile,现在我想在其容器中查看nginx配置。
我运行了以下命令以交互模式启动nginx容器:
docker run -i -t nginx:latest /bin/bash

我现在正在尝试安装nano编辑器,以便使用以下命令查看nginx.conf配置文件中的nginx配置:

apt-get update
apt-get install nano
export TERM=xterm

然而,当我运行第一个命令apt-get update时,我会遇到以下错误:
Err:1 http://security.debian.org/debian-security buster/updates InRelease
  Temporary failure resolving 'security.debian.org'
Err:2 http://deb.debian.org/debian buster InRelease                  
  Temporary failure resolving 'deb.debian.org'
Err:3 http://deb.debian.org/debian buster-updates InRelease
  Temporary failure resolving 'deb.debian.org'
Reading package lists... Done    
W: Failed to fetch http://deb.debian.org/debian/dists/buster/InRelease  Temporary failure resolving 'deb.debian.org'
W: Failed to fetch http://security.debian.org/debian-security/dists/buster/updates/InRelease  Temporary failure resolving 'security.debian.org'
W: Failed to fetch http://deb.debian.org/debian/dists/buster-updates/InRelease  Temporary failure resolving 'deb.debian.org'
W: Some index files failed to download. They have been ignored, or old ones used instead.

我已经仔细检查了,这与网络连接无关。我需要一些帮助。谢谢。


1
边缘情况(不是你的问题,但我在这里包括它):我遇到了同样的问题,并在docker主机上运行BIND9服务器。它允许局域网解析(192.168.0.0/24),但容器从172 docker网络连接,因此无法解析。将172.0.0.0/8添加到BIND ACL以进行访问解决了这个问题。 - Dave
18个回答

138

尝试重新启动Docker。

其中一个应该有效:

sudo service docker restart
sudo /etc/init.d/docker restart
sudo snap restart docker

即使在以前Docker从未工作过的情况下,一些评论者表示这很有帮助。然而,你可能遇到了不同的问题。

1
通常重启服务对我来说就可以了,但有时候我需要重新启动我的虚拟机才能让它再次工作。 - maja
1
重启无法解决我的问题。 - Harun-Ur-Rashid
3
Docker服务重启对我很有效。 - Sushil
2
重启服务对我没有用,但是重启机器可以解决问题(Ubuntu 22.04)。 - web
重启docker安装后,使用sudo snap restart docker可以解决问题。建议首先尝试重新启动,因为这个过程非常快速和简单,即使过去没有出现问题也是如此。 - Nagev

109

6
这也让我的容器中的apt速度提升了大约10倍! - applemonkey496
3
不幸的是,这对我没有解决问题。我已经重新启动了服务。 - Asclepius
1
2022年10月,@j-kluseczka帮我解决了这个问题!非常感谢! - Goon Nguyen
对我来说起作用了。在WSL2中使用Docker。 - Gabriel Silva
2023年8月开始工作 - Amir Kaftari
显示剩余3条评论

75
也许虚拟机上的网络与 Docker 构建期间创建的默认网络(桥接)无法通信,因此请尝试使用“主机”网络:
docker build --network host -t [image_name]

对于docker-compose:

service_name:
    container_name: name
    build: 
      context: .
      network: host

5
2021年9月份时,你为我解决了这个问题!需要注意的是,我不确定是否有必要在运行该命令之前断开 VPN。 - Frederick Haug
2
2022 年解决了我的问题 :) - EvgenyKolyakov
2
2022年8月,问题已经被我解决了 :D - davyzhang
1
2023年1月份已经为我解决了这个问题,谢谢! - ADV-IT
1
2023年2月已经为我解决了这个问题:D - Sina KH
显示剩余8条评论

29

如果您正在运行VPN,请停止它并重试。这对我有用!


2
谢谢!这解决了我的问题,我可能永远都不会想到。 - ossys

10

执行以下命令:

echo -e "nameserver 8.8.8.8\nnameserver 8.8.4.4" |sudo tee -a /etc/resolv.conf

之后输入-

sudo apt-get update

这对我起了作用。


2
head --lines 2 /etc/resolv.conf # -> # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN请勿手动编辑此文件——您的更改将被覆盖。这是由resolvconf(8)生成的glibc解析器(3)的动态resolv.conf(5)文件。 - Richard

8
sudo vi /etc/docker/daemon.json

检查iptables的标志,并添加DNS(如果未添加)

{...., "iptables":true,"dns": ["8.8.8.8", "8.8.4.4"]}

那么
sudo service docker restart

解决了我的问题


8

以下是我的解决方法:

以交互模式启动应用程序的Docker容器,在我的情况下,它是一个nginx容器:

docker run -i -t nginx:latest /bin/bash

运行以下命令,将resolv.conf文件的read权限授予others角色:
chmod o+r /etc/resolv.conf

注意:如果您在主机上遇到此问题(Ubuntu Linux操作系统),而不是Docker容器,请在主机终端中添加sudo运行相同的命令:

sudo chmod o+r /etc/resolv.conf

运行此命令后,请努力退出您的Bash交互式终端:

exit

接着打开一个新的交互式Bash终端,再次运行命令:

apt-get update
apt-get install nano
export TERM=xterm

现在一切应该正常了。

关于此问题在数字海洋上的参考链接:Apt错误:无法解析 'deb.debian.org'

就这些。


1
我遇到这种问题的次数越多,就越讨厌Docker。 - sunew

5

我曾经遇到相同的问题,我的情况是文件访问控制引起的。

我在docker根目录上使用了扩展acl,但没有意识到这一点,因为它们是从上面的文件夹继承而来的(在“临时”目录中测试docker的愚蠢想法,权限通过扩展acl设置)。

这导致在运行的docker容器中,"/etc/resolv.conf" 的设置为 "640",并带有扩展acl的"+"标记,但镜像没有安装扩展acl并且无法处理它。

奇怪的是,就我所知,所有其他网络工具都可以正常工作(例如ping),但只有apt无法访问DNS解析器。

删除docker根目录中的扩展acl并设置通常的acl后,运行容器中的一切都正常工作。

类似于“Promise Prestion”的答案,但也对新容器永久解决了该问题。


这是一个噩梦般的调试过程,但是从Docker数据文件夹中删除ACLS解决了我的问题。这也是许多奇怪错误的源头,比如Docker容器内的https://askubuntu.com/questions/771936/permission-error-when-installing-ttf-mscorefonts-installer-cant-drop-privileges。 - skd

3

在Debian下,以root用户身份,我运行了以下命令:

/etc/init.d/docker restart

这对我解决了问题。然后再次构建和运行容器。

2

我很容易地解决了这个问题:

- docker exec -it nginx bash (Go inside container)
- ping google.com (if not working)
- exit (Exit from container)
- sudo service docker restart

请确认 /etc/sysctl.conf 文件。
- net.ipv4.ip_forward = 1

sudo sysctl -p /etc/sysctl.conf


第二步不可行:bash: ping: 命令未找到 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接