我的码头集装箱没有网络

我让它正常工作,但现在它停了。我尝试了以下命令,但没有效果:

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版本

什么好主意吗?

P.S. ufw也被禁用

415954 次浏览

通过以下建议修复:

[…你能试着重置一切吗?

pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d

它将迫使docker重新创建网桥并重新执行所有网络规则

https://github.com/dotcloud/docker/issues/866#issuecomment-19218300

似乎界面以某种方式“挂起”。

更新docker的最新版本:

上面的答案可能仍然可以帮你完成工作,但自从这个答案发布以来已经有很长一段时间了,docker现在更加完善了,所以在使用iptables和所有东西之前,一定要先尝试这些。

sudo service docker restart或(如果你在一个不使用upstart的linux发行版中)sudo systemctl restart docker

重新启动docker的方法不是手动,而是使用servicesystemctl命令:

service docker restart

systemctl restart docker

对我来说,是主机的防火墙。我必须在主机的防火墙上允许DNS。并且在更改主机防火墙设置后不得不重新启动docker。

用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)

然后(至少在我的经验中),如果你从容器中ping google.com,一切都会很好。

如果你在OSX上,你可能需要在安装Docker后重新启动你的机器。这有时是一个问题。

你可能已经用dns选项--dns 172.x.x.x启动了docker

我有同样的错误,并从/etc/default/docker删除选项

行:

# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="--dns 172.x.x.x"

我正在使用DOCKER_OPTS="--dns 8.8.8.8",后来发现我的容器不能直接访问互联网,但可以访问我的公司内部网。我将DOCKER_OPTS更改为以下内容:

DOCKER_OPTS="--dns <internal_corporate_dns_address"

internal_corporate_dns_address替换为我们的DNS的IP地址或FQDN,并使用

sudo service docker restart

然后生成我的容器并检查它是否可以访问互联网。

对我来说,这是iptables的转发规则。由于某种原因,下面的规则,当与docker的iptables规则结合在一起时,导致所有来自容器的出站流量都命中localhost:8080:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

在windows(8.1)我杀死了virtualbox接口(通过任务管理),它解决了这个问题。

首先要检查的是在集装箱码头工人. xml文件中运行cat /etc/resolv.conf。如果它有一个无效的DNS服务器,比如nameserver 127.0.x.x,那么容器将无法将域名解析为ip地址,因此ping google.com将失败。

要检查的第二件事是在主机上运行cat /etc/resolv.conf。每次容器启动时,Docker基本上都会将主机的/etc/resolv.conf复制到容器中。因此,如果主机的/etc/resolv.conf是错误的,那么docker容器也是错误的。

如果你发现主机的/etc/resolv.conf是错误的,那么你有两个选择:

  1. 在daemon.json中硬编码DNS服务器。这很简单,但如果您希望DNS服务器更改,则不太理想。

  2. 修复主机的/etc/resolv.conf。这有点棘手,但它是动态生成的,并且您没有对DNS服务器进行硬编码。


1. 在docker daemon.json中硬编码DNS服务器

  • < p >编辑/etc/docker/daemon.json

    {
    "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • Restart the docker daemon for those changes to take effect:
    sudo systemctl restart docker

  • Now when you run/start a container, docker will populate /etc/resolv.conf with the values from daemon.json.


2. Fix the hosts's /etc/resolv.conf

A. Ubuntu 16.04 and earlier

  • For Ubuntu 16.04 and earlier, /etc/resolv.conf was dynamically generated by NetworkManager.

  • Comment out the line dns=dnsmasq (with a #) in /etc/NetworkManager/NetworkManager.conf

  • Restart the NetworkManager to regenerate /etc/resolv.conf :
    sudo systemctl restart network-manager

  • Verify on the host: cat /etc/resolv.conf

B. Ubuntu 18.04 and later

  • Ubuntu 18.04 changed to use systemd-resolved to generate /etc/resolv.conf. Now by default it uses a local DNS cache 127.0.0.53. That will not work inside a container, so Docker will default to Google's 8.8.8.8 DNS server, which may break for people behind a firewall.

  • /etc/resolv.conf is actually a symlink (ls -l /etc/resolv.conf) which points to /run/systemd/resolve/stub-resolv.conf (127.0.0.53) by default in Ubuntu 18.04.

  • Just change the symlink to point to /run/systemd/resolve/resolv.conf, which lists the real DNS servers:
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • Verify on the host: cat /etc/resolv.conf

Now you should have a valid /etc/resolv.conf on the host for docker to copy into the containers.

缺少代理设置也可能导致没有互联网访问。在这种情况下,--network host也可能不起作用。代理可以通过设置环境变量http_proxyhttps_proxy来配置:

docker run -e "http_proxy=YOUR-PROXY" \
-e "https_proxy=YOUR-PROXY"\
-e "no_proxy=localhost,127.0.0.1" ...

不要忘记设置no_proxy,否则所有请求(包括对localhost的请求)将通过代理。

更多信息:Archlinux Wiki中的代理设置

最初我的docker容器能够连接到外部互联网(这是一个运行在Amazon EC2上的docker服务/容器)。

由于我的应用程序是一个API,我随后创建了我的容器(它成功地拉出了所需的所有包),更新了我的IP表,将所有流量从端口80路由到端口,我的API(在docker上运行)正在监听。

后来,当我试图重建容器时,它失败了。经过一番努力,我发现我的上一个步骤(设置IPTable端口转发规则)搞乱了docker的外部网络功能。

解决方案:停止IPTable服务:

sudo service iptables stop

重启Docker守护进程:

sudo service docker restart

然后,尝试重新构建容器。希望这能有所帮助。


跟进

我完全忽略了一点,我不需要打乱IP表,就可以将进入的流量转发到80,到运行在docker上的API正在运行的端口。相反,我只是将端口80别名为docker中API正在运行的端口:

docker run -d -p 80:<api_port> <image>:<tag> <command to start api>

我在Ubuntu 18.04上遇到了这个问题。然而问题出在DNS上。我所在的公司网络有自己的DNS服务器,并阻止其他DNS服务器。这是为了阻止一些网站(色情,种子,…等等)

解决你的问题

  1. 找到你的DNS在主机上
  2. use——dns your_dns as suggest @jobin

    docker run——dns < em > your_dns < / em > -it——name cowsay——hostname cowsay debian bash

只是在这里添加这个,以防有人在运行docker的virtualbox容器中遇到这个问题。我将virtualbox网络重新配置为桥接而不是nat,问题就消失了。

当我的一个容器随机发生这种情况,而其他容器都很好时,我被难住了。容器被连接到至少一个non-internal网络,所以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

我不知道我在做什么,但这对我很有用:

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

对于Ubuntu 19.04使用openconnect 8.3进行VPN,我必须将/etc/resolve.conf符号链接到systemd中的文件(与answerby wisbucky相反)

sudo ln -sf /etc/resolv.conf /run/systemd/resolve/resolv.conf

调试步骤

  1. 连接到公司VPN
  2. 在/etc/resolv.conf或/run/systemd/resolve/resolv.conf中查找正确的VPN设置
  3. 无论哪个有正确的DNS设置,我们都会将其符号链接到另一个文件 (提示:在赋值的左边放置一个正确的设置)

Docker版本:Docker版本19.03.0-rc2,构建f97efcc

当我尝试在Ubuntu上使用Docker-Compose建立一个项目时,也遇到了这样的问题。

Docker根本无法访问互联网,当我试图ping任何IP地址或nslookup一些URL时,它总是失败。

我尝试了上面描述的所有可能的DNS解析解决方案,但都无济于事。

我花了一整天的时间试图找出到底发生了什么,最后发现所有问题的原因都是防病毒软件,尤其是它的防火墙,出于某种原因阻止了Docker获取IP地址和端口。

当我禁用它时,一切都很好。

所以,如果你安装了防病毒软件,但没有任何帮助解决这个问题-问题可能是防病毒软件的防火墙。

最近几天我也遇到了类似的问题。对我来说,原因是systemd、docker和我的托管提供商的组合。我正在运行最新的CentOS(7.7.1908)。

我的主机提供程序自动为systemd-network生成配置文件。从CentOS 7的当前版本systemd 219开始,systemd-network控制了与网络相关的sysctl参数。Docker似乎与这个版本不兼容,并且每次容器启动时都会重置IP-Forwarding标志。

我的解决方案是在我的提供者生成的配置文件的__abc1部分中添加IPForward=true。这个文件可能在几个地方,最有可能在/etc/systemd/network中。

这个过程在docker官方文档中也有描述:https://docs.docker.com/v17.09/engine/installation/linux/linux-postinstall/#ip-forwarding-problems

对我来说,我的问题是没有安装iptables-services,这对我来说是有效的(CentOS):

sudo yum install iptables-services
sudo service docker restart

对我来说,使用centos 7.4,这不是/etc/resolve.conf, iptables, iptables NAT规则或docker本身的问题。问题是主机缺少包bridge-utils, docker需要使用brctl命令来构建桥。Yum安装-y bridge-utils并重新启动docker,解决问题。

在centos 8上, 我的问题是我没有安装&启动docker服务前先启动iptables。在启动docker服务之前,请确保iptables服务已经启动并运行

为子孙后代分享一个简单而有效的解决方案。当我们运行一个docker容器而没有显式地提到--network标志时,它连接到它的默认网桥网络,这禁止连接到外部世界。为了解决这个问题,我们必须创建自己的网桥网络(用户定义的网桥),并且必须使用docker run命令显式地提到它。

docker network create --driver bridge mynetwork
docker run -it --network mynetwork image:version

已经有很多好的答案了。我最近在我的橙色pi pc运行armbian时遇到了类似的问题。Docker容器无法连接互联网。这个命令解决了我的问题。所以我喜欢分享它

docker run --security-opt seccomp=unconfined imageName

我试了所有的答案,没有一个对我有效。

在尝试了几个小时后,我找到了这个方法:

reboot

_ -

其他答案指出,docker0接口(桥接)可能是问题的根源。在Ubuntu 20.04上,我观察到接口缺少它的IP地址(用ip addr show dev docker0检查)。仅仅重新启动Docker并没有帮助。我不得不手动删除桥接接口。

sudo ip link delete docker0
sudo systemctl restart docker

我在这里尝试了大部分答案,但唯一有效的是重新创建网络:

$ docker network rm the-network
$ docker network create --driver=bridge the-network

我还需要重新创建使用它的docker容器:

$ sudo docker create --name the-name --network the-network

然后是互联网接入。

经过几个小时的努力,我终于解决了问题

问题是linux使用旧版本的libseccomp2

获取签名密钥以验证新包,否则将无法安装

rpi ~$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 04EE7237B7D453EC 648ACFD622F3D138

将Buster后台端口存储库添加到apt sources.list

rpi ~$ echo 'deb http://httpredir.debian.org/debian buster-backports main contrib non-free' | sudo tee -a /etc/apt/sources.list.d/debian-backports.list


rpi ~$ sudo apt update
rpi ~$ sudo apt install libseccomp2 -t buster-backports

在这次尝试之后

rpi ~$ docker run -it --rm alpine:3.15.0
(alpine shell)# apk update

apk update将获取,因此您连接到互联网

我在用

Linux raspberrypi 5.10.63-v7l+ #1496 SMP Wed Dec 1 15:58:56 GMT 2021 armv7l GNU/Linux

你可以使用uname -a检查

我在Arch Linux上,在尝试了上面所有的答案后,我意识到我的机器上有一个防火墙,nftables,禁用它就管用了。我说:

sudo systemctl disable nftables
sudo systemctl stop nftables
sudo reboot

我的网卡:

➜  ~ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp1s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
link/ether 68:f7:28:84:e7:fe brd ff:ff:ff:ff:ff:ff
3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DORMANT group default qlen 1000
link/ether d0:7e:35:d2:42:6d brd ff:ff:ff:ff:ff:ff
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
link/ether 02:42:43:3f:ff:94 brd ff:ff:ff:ff:ff:ff
5: br-c51881f83e32: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:ae:34:49:c3 brd ff:ff:ff:ff:ff:ff
6: br-c5b2a1d25a86: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:72:d3:6f:4d brd ff:ff:ff:ff:ff:ff
8: veth56f42a2@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default
link/ether 8e:70:36:10:4e:83 brd ff:ff:ff:ff:ff:ff link-netnsid 0

以及我的防火墙配置/etc/nftables.conf,我现在禁用了它,将来会尝试改进它,这样我就可以正确地设置docker0网卡规则:

#!/usr/bin/nft -f
# vim:set ts=2 sw=2 et:


# IPv4/IPv6 Simple & Safe firewall ruleset.
# More examples in /usr/share/nftables/ and /usr/share/doc/nftables/examples/.


table inet filter
delete table inet filter
table inet filter {
chain input {
type filter hook input priority filter
policy drop


ct state invalid drop comment "early drop of invalid connections"
ct state {established, related} accept comment "allow tracked connections"
iifname lo accept comment "allow from loopback"
ip protocol icmp accept comment "allow icmp"
meta l4proto ipv6-icmp accept comment "allow icmp v6"
#tcp dport ssh accept comment "allow sshd"
pkttype host limit rate 5/second counter reject with icmpx type admin-prohibited
counter
}
chain forward {
type filter hook forward priority filter
policy drop
}

它帮助我:

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

注意:在此之后,接口docker0的ip地址必须是smth,如下所示:

inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0

在我的例子中,由于一些未知的原因,docker被配置为不生成网络所需的iptables规则容器。docker容器只能ping主机,没有其他功能。这里的大多数答案都没有帮助;重新创建桥或重新启动服务改变了任何东西。

但后来,在一次偶然的机会下,我发现了以下内容:

$ cat /etc/docker/daemon.json
{"iptables": false}

我删除了文件/etc/docker/daemon.json并重新启动守护进程(默认是创建iptables规则)。这解决了网络问题。

下面是修复前的iptables规则:

$ iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination


Chain FORWARD (policy DROP)
target     prot opt source               destination


Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

现在,iptables规则修复后:

$ iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination


Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER-USER  all  --  0.0.0.0/0            0.0.0.0/0
DOCKER-ISOLATION-STAGE-1  all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0


Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


Chain DOCKER (2 references)
target     prot opt source               destination
ACCEPT     tcp  --  0.0.0.0/0            172.17.0.2           tcp dpt:8443


Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination
DOCKER-ISOLATION-STAGE-2  all  --  0.0.0.0/0            0.0.0.0/0
DOCKER-ISOLATION-STAGE-2  all  --  0.0.0.0/0            0.0.0.0/0
RETURN     all  --  0.0.0.0/0            0.0.0.0/0


Chain DOCKER-ISOLATION-STAGE-2 (2 references)
target     prot opt source               destination
DROP       all  --  0.0.0.0/0            0.0.0.0/0
DROP       all  --  0.0.0.0/0            0.0.0.0/0
RETURN     all  --  0.0.0.0/0            0.0.0.0/0


Chain DOCKER-USER (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

唯一能在我的电脑上工作的东西(8.8.8.8不起作用)

  1. 找出本地机器中使用的DNS:
$ netstat -ntpl | grep :53
tcp        0      0 10.194.128.1:53         0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.2.1:53            0.0.0.0:*               LISTEN      -
  1. 在你自己的计算机上根据上面的信息修改docker配置sudo vim /etc/docker/daemon.json
{
"dns": ["192.168.122.1","10.194.128.1"]
}
  1. 重启码头工人
sudo ip link delete docker0
sudo systemctl restart docker

如果你运行的Docker是无根的,并面临这个问题,在安装过程中,iptables可能无法正确配置,主要是因为在Docker抱怨iptables时使用了--skip-iptables选项:

[ERROR] Missing system requirements. Run the following commands to
[ERROR] install the requirements and run this tool again.
[ERROR] Alternatively iptables checks can be disabled with --skip-iptables .


########## BEGIN ##########
sudo sh -eux <<EOF
# Load ip_tables module
modprobe ip_tables
EOF
########## END ##########

让我们检查一下这是否是问题所在:是否加载了ip_tables内核模块?

sudo modprobe ip_tables

如果没有输出,这个答案可能对您没有帮助(无论如何您都可以尝试)。否则,输出如下所示:

modprobe: FATAL: Module ip_tables not found in directory /lib/modules/5.18.9-200.fc36.x86_64

让我们来解决它!

首先,卸载Docker无根(不需要通过systemctl停止服务,脚本处理):

dockerd-rootless-setuptool.sh uninstall --skip-iptables

确保安装了iptables包,尽管它在默认情况下由主要发行版提供。

现在,让ip_tables模块对modprobe可见并安装它(感谢):

sudo depmod
sudo modprobe ip_tables

现在,重新安装Docker rootless:

dockerd-rootless-setuptool.sh install

如果它不打扰iptables,你就完成了,问题应该得到解决。不要忘记启用服务(即systemctl enable --user --now docker)!

对我来说,我面临着与使用podmanredhat / centos / fedora用户相同的问题

firewall-cmd --zone=public --add-masquerade
firewall-cmd --permanent --zone=public --add-masquerade

for more 防火墙和podman(或docker) -容器中没有互联网,无法解析主机 < / > < / p >