docker compose服务中没有internet

docker compose服务中没有internet,docker,docker-compose,docker-networking,Docker,Docker Compose,Docker Networking,我无法从docker compose容器访问外部网络。 考虑以下docker compose文件: version: '2' services: nginx: image: nginx 使用简单的docker run-it nginx bash我设法访问外部IP或互联网IP(ping www.google.com) 另一方面,如果使用docker compose并附加到容器,则无法访问外部IP地址/DNS 码头工人信息: Containers: 0 Running: 0

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

考虑以下docker compose文件:

version: '2'
services:
    nginx:
      image: nginx
使用简单的
docker run-it nginx bash
我设法访问外部IP或互联网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"]
}

默认情况下,Docker容器可以访问internet。 以下是我上周如何解决这个问题的:

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

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

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

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

这将迫使docker重新创建网桥并重新设置所有网络规则

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


编辑根据您正在使用的docker版本,
docker-d
命令可能不适用于您,但不要担心,您可以忽略该命令。

您正在拖动的图像
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
创建的容器不同的容器


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

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

DOCKER_OPTS="--iptables=false"
还要检查
/etc/docker/daemon.json
,确保它没有以下键:

{
"iptables":false
}

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

您是否使用了
docker exec-it ping google.com
?这应该行得通。这正是我做的。你调查过网络吗?docker网络检查桥显示什么?假设“网桥”是默认网络。您能为两个容器显示
docker inspect
吗?这样做会失去主机和容器之间的所有分离。@peedee是的,我必须承认这一点。我检查了[faas](get faas.com)项目的撰写文件,它只是使用覆盖网络,似乎应该能够访问互联网。但我无法在我的计算机上执行此操作。从Docker文档中可以看出:“注意:--network=“host”使容器能够完全访问本地系统服务,如D-bus,因此被认为是不安全的。”感谢这对我的帮助。不久前,我注意到docker在主机上保持端口打开,并覆盖ufw。我禁用了iptables,如下所示:再次反转启用的容器网络。
ip link del docker0
如果您不使用ifconfig,您可能在2020年不会使用ifconfig。
{
"iptables":false
}