在docker-compose服务中没有互联网

ors*_*har 27 docker docker-compose docker-networking

我无法通过docker-compose容器访问外部网络.

考虑以下docker-compose文件:

version: '2'
services:
    nginx:
      image: nginx
Run Code Online (Sandbox Code Playgroud)

使用简单的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
Run Code Online (Sandbox Code Playgroud)

docker-compose 1.8.1,build 878cff1

daemon.json文件:

{
  "iptables" : false,
  "dns" : ["8.8.8.8","8.8.4.4"]
}
Run Code Online (Sandbox Code Playgroud)

cor*_*ote 7

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

DOCKER_OPTS="--iptables=false"
Run Code Online (Sandbox Code Playgroud)

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

{
"iptables":false
}
Run Code Online (Sandbox Code Playgroud)

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


pee*_*dee 5

我最后一次遇到这样的问题,我解决了这个问题:

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

pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d
Run Code Online (Sandbox Code Playgroud)

它将强制docker重新创建网桥并重新启动所有网络规则.

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

编辑根据docker -d您使用的docker版本,该命令可能不适合您,但不要担心,您可以省略该命令.

  • `ip link del docker0` 如果你不使用 ifconfig,你可能不会在 2020 年使用 ifconfig。 (3认同)

Gao*_*han 0

Docker 容器默认具有访问互联网的能力。这是我上周解决问题的方法:docker容器只能通过net主机访问互联网

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

version: '2'
service:
  nginx:
    image: nginx
    network_mode: host
Run Code Online (Sandbox Code Playgroud)

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

  • 来自 Docker 文档:“注意:--network=”host” 使容器能够完全访问本地系统服务(例如 D-bus),因此被认为是不安全的。” (4认同)