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)
检查/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 一起工作。然后我们改为外部防火墙。花了很长时间寻找外部网络无法工作的原因,因为它已从我们的部署指南中删除。希望这对其他人有帮助。
我最后一次遇到这样的问题,我解决了这个问题:
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版本,该命令可能不适合您,但不要担心,您可以省略该命令.
Docker 容器默认具有访问互联网的能力。这是我上周解决问题的方法:docker容器只能通过net主机访问互联网
或者你只是让容器处于主机模式:
version: '2'
service:
nginx:
image: nginx
network_mode: host
Run Code Online (Sandbox Code Playgroud)
但正如 @peedee 在评论中指出的那样,该解决方案将失去主机和容器之间的网络隔离。
| 归档时间: |
|
| 查看次数: |
9350 次 |
| 最近记录: |