docker-compose服务中没有互联网

我无法通过docker-compose容器访问外部networking。

考虑下面的docker-compose文件:

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

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

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

docker信息:

 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,build 878cff1

daemon.json文件:

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

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

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

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

这将迫使docker重新创build桥梁并重新创build所有的networking规则

你正在拉的image nginx默认没有安装ping 。 所以如果你真的使用ping来testing你的连接,你必须先安装它。

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

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

然后我在本地build立,并标记为mynginx

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

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

最后,我解雇了docker-compose up一个docker exec,并testing了ping。 所有的工作都很好。 我也做docker run -ti ...它的工作。

在你的问题上,什么错误的是, docker run可以给你一个不同的行为比由docker-compose up创build的容器docker-compose up

更清楚你如何检查互联网接入将有所帮助。

docker集装箱默认情况下可以访问互联网。 这里是我上周解决了这个问题: docker集装箱只能用networking主机访问互联网

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

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

但是@peedee在评论中指出,这个解决scheme将会丢失主机和容器之间的networking分离。