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分离。