37

我无法从 docker-compose 容器访问外部网络。

考虑以下 docker-compose 文件:

version: '2'
services:
    nginx:
      image: nginx

使用简单的docker run -it nginx bash我设法访问外部 IP 或 Internet IP ( ping www.google.com)。

另一方面,如果我使用 docker-compose 并附加到容器,我无法访问外部 IP 地址/DNS。

码头工人信息:

Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 1
Server Version: 1.12.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 7
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge null host overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-38-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.859 GiB
Name: ***
ID: ****
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
Insecure Registries:
 127.0.0.0/8

docker-compose 1.8.1,构建 878cff1

daemon.json 文件:

{
  "iptables" : false,
  "dns" : ["8.8.8.8","8.8.4.4"]
}
4

6 回答 6

9

上次我遇到这样的问题时,我是这样解决的:

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

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

它将强制 docker 重新创建网桥并重新初始化所有网络规则。

至于发生这种情况的原因,我没有很好的答案。但我最近确实将问题追溯到journald. 当我重新启动时journald(例如,因为我更改了它的配置),docker-compose 容器内的 DNS 解析始终/可重复地中断。我不知道究竟是为什么,我只能说这是我在 RHEL 上重现它的可靠方式。

编辑根据您使用的 docker 版本,该docker -d命令可能对您不起作用,但不用担心,您可以省略该命令。

于 2017-05-04T01:34:42.083 回答
8

检查/etc/default/docker以确保它没有以下行:

DOCKER_OPTS="--iptables=false"

还要检查/etc/docker/daemon.json以确保它没有以下密钥:

{
"iptables":false
}

我们在一台服务器上添加了这个,让 UFW 与 docker 一起工作。然后我们改为外部防火墙。花了很长时间寻找外部网络无法正常工作的原因,因为它已从我们的部署指南中删除。希望这对其他人有帮助。

于 2018-04-25T02:20:07.550 回答
1

我刚碰到这个。使用 运行任何容器docker run -it <image> bash,我可以做任何我需要的与网络相关的事情,但是附加到通过 docker-compose 启动的容器docker exec -it <conatiner> bash无法运行。甚至apt-get会因“名称解析错误暂时失败”而失败。

我发现添加network_mode: "bridge"到每个服务将启用每个容器中的外部网络,但代价是将所有内容附加到默认的 docker 网络。不过,我想保持堆栈隔离,所以开始寻找替代解决方案。

我跑去docker inspect network bridge查看默认网络,我的堆栈网络也是如此。我发现的唯一显着差异是子网/网关的差异(我相信这是意料之中的,但是列出的 IP 差异很大,192.* vs 172.*),并且默认网络有几个不存在的选项在堆栈网络中:

"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"

我能够将它隔离到"com.docker.network.bridge.default_bridge": "true",但这破坏了堆栈外容器的网络,以至于我最终不得不完全删除并重新安装 docker。我假设 docker 守护进程与标记为默认的两个网络混淆并且无法解决它,即使在删除堆栈网络之后也是如此。

这样做后我注意到的一件事是子网和 getway 与默认适配器相差一个。我确认删除上述选项会将子网和网关恢复为我最初看到的内容,它确实做到了。然后我在撰写文件中使用了这个网络配置:

networks:
  default:
    driver: "bridge"
    ipam:
      driver: default
      config:
        - subnet: X.X.0.0/16

其中子网的第一个值与默认网桥适配器相同,第二个值加一。这至少让一切正常,没有默认适配器仍然被破坏。

有趣的是,当我去重新安装 docker 尝试修复默认网络时,在查看docker compose network documentation for external networking后,我基本上运行了以下内容。

sudo snap remove docker
sudo sysctl net.ipv4.conf.all.forwarding=1
sudo iptables -P FORWARD ACCEPT
sudo snap install docker

随后docker-compose up -d删除网络设置会导致我之前定义的相同子网 IP 没有为其提供配置。我相信根本问题只是某些东西阻止了 docker 守护进程正确找到可用的有效子网,一旦解决了,一切都应该再次开箱即用。

于 2021-06-22T16:53:13.940 回答
0

您正在拉取的图像默认情况下nginx没有ping安装。所以如果你真的用ping来测试你的连接,你必须先安装它。

我创建了一个自定义 Dockerfile 来安装它:

FROM nginx:latest
RUN apt update && apt -y install iputils-ping

然后我在本地构建它并标记为mynginx.

然后我改为docker-compose.yml使用自定义图像mynginx

version: '2'
services:
  nginx:
    image: mynginx

最后,我解雇了docker-compose up,并在其中执行了 docker exec,并测试了 ping。一切都很好。我也这样做了docker run -ti ...,它奏效了。

我对您的问题感到困惑的是,如何docker run为您提供一个行为与由docker-compose up.

不过,更清楚地了解如何检查互联网访问会有所帮助。

于 2017-07-10T10:15:19.490 回答
0

Docker 容器默认具有访问 Internet 的能力。这是我上周解决问题的方法:docker container can only access internet with net host

或者你只是让容器处于主机模式:

version: '2'
service:
  nginx:
    image: nginx
    network_mode: host

但正如@peedee 在评论中指出的那样,这种解决方案将失去主机和容器之间的网络分离。

于 2017-05-03T22:50:36.257 回答
0

就我而言,我通过 docker 安装了 docker ,在按照官方网站上snap的说明删除并安装后,它开始正常工作。

于 2021-07-19T05:06:20.283 回答