ubuntu - Docker容器无法解析网站名称,但可以ping通其ip

标签 ubuntu docker dns iptables resolve

当我尝试

apt-get 更新

在基于 ubuntu 的容器中。

我遇到了这样的错误。

Temporary failure resolving 'archive.ubuntu.com'.

当我尝试 ping 'archive.ubuntu.com' 的 ip 时,没问题。

但是当我尝试 ping 'archive.ubuntu.com' 时,它显示了

uknown host archive.ubuntu.com

所以我尝试了几种在互联网上可以找到的方法,比如这个。

echo "91.189.92.201 archive.ubuntu.com" >> /etc/hosts

然后我可以 ping 'archive.ubuntu.com'

但是其他网站仍然无法通过名称进行链接。

我试着在/etc/default/docker 添加一行,像这样

DOCKER_OPTS="--dns 8.8.8.8 --dns 114.114.114.114 --dns 8.8.4.4"

然后我重新启动 docker 服务,并附加到容器,看看这个

cat /etc/resolv.conf

结果

root@d9d5bbdb11de:/# cat /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

nameserver 8.8.8.8 
nameserver 8.8.4.4

我不知道这是否适用。

ps,我可以ping通8.8.8.8、114.114.114.114、8.8.4.4

出于某些原因,我试图找出是哪里的防火墙问题,所以我在容器外使用了 iptables。

iptables-save.

这是我从容器中 iptables-save 时的结果。

wjy@wjy-VirtualBox:~$ sudo iptables-save [sudo] wjy 的密码: 

# Generated by iptables-save v1.6.0 on Sat Mar  4 16:06:53 2017

*nat :PREROUTING ACCEPT [28:1772] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [253:15867] :POSTROUTING ACCEPT [253:15867] :DOCKER - [0:0]

-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER

-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

-A DOCKER -i docker0 -j RETURN COMMIT

# Completed on Sat Mar  4 16:06:53 2017

# Generated by iptables-save v1.6.0 on Sat Mar  4 16:06:53 2017

*filter :INPUT ACCEPT [1211:567114] :FORWARD DROP [0:0] :OUTPUT ACCEPT [1254:152567] :DOCKER - [0:0] :DOCKER-ISOLATION - [0:0]

-A FORWARD -j DOCKER-ISOLATION

-A FORWARD -o docker0 -j DOCKER

-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-A FORWARD -i docker0 ! -o docker0 -j ACCEPT

-A FORWARD -i docker0 -o docker0 -j ACCEPT

-A DOCKER-ISOLATION -j RETURN COMMIT

# Completed on Sat Mar  4 16:06:53 2017

可能是host、dns或iptable的问题。但我不知道如何让我的所有容器解析网站名称并链接到互联网。 如果您遇到类似情况或知道如何解决,请帮我一个忙。 非常感谢。

最佳答案

我在主机上的代理后面测试了这个错误。我的意思是,如果您的 docker 主机设置了代理设置。我将解释我是如何解决它的,如果是您的情况或对其他人有用,也许对您有用。

有 3 个地方可以配置代理设置:

  • 在操作系统层面:

这取决于操作系统,通常你可以把http_proxy=http://yourproxy:port/放在/etc/environment

  • 在 Docker 引擎级别:

您必须在 /etc/systemd/system/docker.service.d/http-proxy.conf 中创建包含以下内容的文件夹和文件:

[Service]
Environment="HTTP_PROXY=http://yourproxy:port/"
  • 最后一个(不要忘记在最后两个步骤后重新启动),您必须将它也作为环境变量放在 Dockerfile 上以构建它!!

Dockerfile 示例:

FROM ubuntu:latest
ENV HTTP_PROXY http://yourproxy:port/
RUN apt-get update

也许这是你和我一样的问题。

我的建议是不要接触 iptables,也不要接触 DNS。重新创建容器 docker 自动完成所需的工作。如果你需要触摸那里,那就是出了问题。仅确保在 docker 主机上完全可以访问互联网。

祝你好运。

关于ubuntu - Docker容器无法解析网站名称,但可以ping通其ip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42593745/

相关文章:

docker - Bitbucket管道。无法指定WindowsServerCore Docker镜像

spring-boot - docker 的 spring boot 教程不起作用?

python - 如何刷新 socket.gethostbyname 响应的缓存?

android - Strava "Problem with Authorization Callback Domain"

linux - Amazon S3 HTTPS 无法在 Linux 上使用 Chrome 和 wget 加载

ubuntu - 无法通过 SSH ubuntu 终端运行 Chrome 远程桌面

php - 即使在 ubuntu 中安装 curl 后,curl 扩展也没有显示在 php.ini 中

windows -/var/run/docker.sock 如何适用于 Windows Docker?

logging - 如何启用命名/绑定(bind)/DNS 完整日志记录?

ubuntu - Artifactory + 18.04 artifactoryManage.sh 不创建 PID 文件