docker compose服务中没有internet
我无法从docker compose容器访问外部网络。 考虑以下docker compose文件: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
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
}