我让它工作正常,但现在停止了.我尝试了以下命令但无济于事:
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 次 |
| 最近记录: |