我让它工作正常,但现在停止了.我尝试了以下命令但无济于事:
docker run -dns 8.8.8.8 base ping google.com
docker run base ping google.com
sysctl -w net.ipv4.ip_forward=1
- 在主机和容器上
我得到的只是unknown host google.com
.Docker版本0.7.0
有任何想法吗?
PS也被ufw
禁用了
wis*_*cky 83
要检查的第一件事是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复制到容器中.
Rom*_*cea 76
通过遵循以下建议修复:
[...]你能尝试重置一切吗?
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d
Run Code Online (Sandbox Code Playgroud)
它将强制docker重新创建网桥并重新启动所有网络规则
https://github.com/dotcloud/docker/issues/866#issuecomment-19218300
似乎接口被某种方式"绞死"了.
更新最新版本的docker:
上面的答案可能仍然可以为你完成工作,但是已经有很长一段时间了,因为这个答案已经发布了,并且docker现在更加精致,所以一定要先尝试这些,然后再进行修改iptables
.
sudo service docker restart
或者(如果您使用的是不使用暴发版的Linux发行版) sudo systemctl restart docker
bit*_*ask 57
重启docker的预期方法不是手动执行,而是使用service
或init命令:
service docker restart
Run Code Online (Sandbox Code Playgroud)
Mau*_*uro 34
尝试了所有答案,没有一个对我有用。
在尝试了我能找到的所有其他方法之后,这成功了:
reboot
Run Code Online (Sandbox Code Playgroud)
小智 21
使用OSX的答案更新此问题(使用Docker Machine)
如果您使用Docker Machine在OSX上运行Docker,那么以下内容对我有用:
docker-machine restart
<...wait for it to restart, which takes up to a minute...>
docker-machine env
eval $(docker-machine env)
Run Code Online (Sandbox Code Playgroud)
然后(至少根据我的经验),如果你从一个容器ping google.com一切都会好的.
小智 13
我不知道我在做什么,但这对我有用:
OTHER_BRIDGE=br-xxxxx # this is the other random docker bridge (`ip addr` to find)
service docker stop
ip link set dev $OTHER_BRIDGE down
ip link set dev docker0 down
ip link delete $OTHER_BRIDGE type bridge
ip link delete docker0 type bridge
service docker start && service docker stop
iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING ! -o docker0 -s 172.18.0.0/16 -j MASQUERADE
service docker start
Run Code Online (Sandbox Code Playgroud)
我正在使用DOCKER_OPTS="--dns 8.8.8.8"
并后来发现,我的容器没有直接访问互联网,但可以访问我的企业内部网.我改为DOCKER_OPTS
以下内容:
DOCKER_OPTS="--dns <internal_corporate_dns_address"
Run Code Online (Sandbox Code Playgroud)
替换internal_corporate_dns_address
我们的DNS的IP地址或FQDN并使用重新启动的docker
sudo service docker restart
Run Code Online (Sandbox Code Playgroud)
然后生成我的容器并检查它是否可以访问互联网.
缺少代理设置也可能导致无法访问互联网。在这种情况下,--network host
也可能不起作用。代理可以通过设置环境变量来配置http_proxy
和https_proxy
:
docker run -e "http_proxy=YOUR-PROXY" \
-e "https_proxy=YOUR-PROXY"\
-e "no_proxy=localhost,127.0.0.1" ...
Run Code Online (Sandbox Code Playgroud)
不要忘记设置 no_proxy ,否则所有请求(包括对 localhost 的请求)都将通过代理。
更多信息:Archlinux Wiki 中的代理设置。
当我的一个容器随机发生这种情况时,我被难住了,而其他容器则很好。容器至少连接到一个非内部网络,因此Compose
定义没有任何问题。重新启动 VM / docker 守护进程没有帮助。这也不是 DNS 问题,因为容器甚至无法ping
获得外部 IP。为我解决的是重新创建docker网络。在我的情况下,docker-compose down && docker-compose up
工作。
这会强制重新创建所有容器的所有网络:
docker-compose down
&& docker-compose up
我想你只是删除并重新创建服务,重新创建服务的网络:
docker service rm some-service
docker service create ...
只需删除并重新创建该服务的外部网络:
docker network rm some-external-network
docker network create some-external-network
其他答案指出docker0
接口(网桥)可能是问题的根源。在 Ubuntu 20.04 上,我观察到该接口缺少其 IP 地址(可使用 检查ip addr show dev docker0
)。单独重新启动 Docker 并没有帮助。我必须手动删除桥接口。
sudo ip link delete docker0
sudo systemctl restart docker
Run Code Online (Sandbox Code Playgroud)
它帮助我:
sudo ip link delete docker0
sudo systemctl stop docker.socket
sudo systemctl stop docker.service
sudo systemctl start docker.socket
sudo systemctl start docker.service
Run Code Online (Sandbox Code Playgroud)
注意:在此之后,接口 docker0 必须具有如下 IP 地址:
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
Run Code Online (Sandbox Code Playgroud)
小智 5
对我来说,我的问题是因为没有安装 iptables-services,这对我有用(CentOS):
sudo yum install iptables-services
sudo service docker restart
Run Code Online (Sandbox Code Playgroud)
为后代分享一个简单且有效的解决方案。当我们在没有明确提及该标志的情况下运行 docker 容器时--network
,它会连接到其默认桥接网络,该网络禁止连接到外部世界。为了解决这个问题,我们必须创建自己的桥接网络(用户定义的桥接),并且必须使用 docker run 命令明确提及它。
docker network create --driver bridge mynetwork
docker run -it --network mynetwork image:version
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
157265 次 |
最近记录: |