使用Compose运行时Dockerfile中的网络不可访问

使用Compose运行时Dockerfile中的网络不可访问,docker,docker-compose,apt-get,Docker,Docker Compose,Apt Get,在我的项目中,当我使用docker compose启动它时,apt get无法从Dockerfile工作。但当我用--network选项直接调用docker时,它确实可以工作 以下是配置: docker compose.yml: version: '3' services: main: build: main network_mode: host main/dockfile: FROM osrm/osrm-backend:v5.22.0 RUN apt-get updat

在我的项目中,当我使用
docker compose
启动它时,apt get无法从Dockerfile工作。但当我用
--network
选项直接调用docker时,它确实可以工作

以下是配置:

docker compose.yml

version: '3'

services:
  main:
    build: main
    network_mode: host
main/dockfile

FROM osrm/osrm-backend:v5.22.0
RUN apt-get update && apt-get install -y wget nodejs npm osmium-tool
FROM osrm/osrm-backend:v5.22.0
RUN echo 123321 && cat /etc/resolv.conf  # echo $number to prevent caching
RUN apt-get update && apt-get install osmium-tool
此操作失败(apt get无法查找域):

这确实有效:

sudo docker build main --network=host
原因是什么,如何修复

主机系统是Ubuntu 20.04

编辑:已自行修复。嗯,不是它本身,但我不能指出我到底做了什么来修复它。我在来回更改
/etc/docker/daemon.conf
并重新启动

Docker撰写内容如下:

version: '3'

services:
  main: 
    build: main
就这样<代码>主/Dockerfile:

FROM osrm/osrm-backend:v5.22.0
RUN apt-get update && apt-get install -y wget nodejs npm osmium-tool
FROM osrm/osrm-backend:v5.22.0
RUN echo 123321 && cat /etc/resolv.conf  # echo $number to prevent caching
RUN apt-get update && apt-get install osmium-tool
/etc/docker/daemon.conf

{}
...
# FirewallBackend
# Selects the firewall backend implementation.
# Choices are:
#       - nftables (default)
#       - iptables (iptables, ip6tables, ebtables and ipset)
##FirewallBackend=nftables
FirewallBackend=iptables
...
/etc/default/docker

...
DOCKER_OPTS=" --dns 127.0.0.53"
...
127.0.0.53是Ubuntu自己的DNS转发守护程序,如果我理解正确的话

运行
$docker compose build main
打印我:

Building main
Step 1/5 : FROM osrm/osrm-backend:v5.22.0
 ---> daceec677b86
Step 2/5 : RUN echo 32231 && cat /etc/resolv.conf
 ---> Running in d8c54a39faee
32231
# This file is managed by man:systemd-resolved(8). Do not edit.
...
# operation for /etc/resolv.conf.

nameserver <provider dns ip>
nameserver 8.8.8.8
nameserver 192.168.0.1
search <my wifi router>
Removing intermediate container d8c54a39faee
 ---> 4b07a0fcc889
Step 3/5 : RUN apt-get update && apt-get install osmium-tool
 ---> Running in 71a7c887af04
Get:1 http://security.debian.org/debian-security stretch/updates InRelease [53.0 kB]
Ign:2 http://deb.debian.org/debian stretch InRelease
建筑主管道
步骤1/5:从osrm/osrm后端:v5.22.0
--->daceec677b86
步骤2/5:运行echo 32231&&cat/etc/resolv.conf
--->在d8c54a39faee中运行
32231
#此文件由man管理:systemd resolved(8)。不要编辑。
...
#/etc/resolv.conf的操作。
名称服务器
名称服务器8.8.8.8
名称服务器192.168.0.1
搜寻
拆卸中间容器d8c54a39faee
--->4b07a0fcc889
步骤3/5:运行apt-get-update和apt-get-install-osmium工具
--->在71a7c887af04中运行
获得:1http://security.debian.org/debian-security 在Release中进行拉伸/更新[53.0 kB]
Ign:2http://deb.debian.org/debian 拉伸松弛
一切正常。

更新答案:

sudo firewall cmd--zone=public--add masquerade--permanent

sudo防火墙cmd——重新加载

sudo systemctl重启docker

这似乎从CentOS8的“新安装”中解决了这个问题。这个IP表规则有很多细微差别,但是如果需要高度敏感的安全问题和设置,您可能需要

原始答案:我在CentOS主机上找到了解决此问题的方法:

/etc/firewalld/firewalld.conf
中修改以下部分:

{}
...
# FirewallBackend
# Selects the firewall backend implementation.
# Choices are:
#       - nftables (default)
#       - iptables (iptables, ip6tables, ebtables and ipset)
##FirewallBackend=nftables
FirewallBackend=iptables
...
然后:
服务防火墙重新启动


之后,当我在docker-compose.yml上运行
docker compose up…
时,世界又恢复了正常。

我也遇到了同样的问题。我怀疑这与Dockerfile构建的容器的网络DNS有关,但我还没有找到解决方法。我看到Github上有一个关于我收到的特定错误消息的公开问题。您的错误消息是什么?我的错误:
fetchhttp://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz 错误:http://dl-cdn.alpinelinux.org/alpine/v3.12/main: 临时错误(请稍后重试)警告:忽略APKINDEX.2c4ac24e.tar.gz:没有这样的文件或目录获取http://dl-cdn.alpinelinux.org/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
错误:http://dl-cdn.alpinelinux.org/alpine/v3.12/community: 临时错误(稍后重试)警告:忽略APKINDEX.40a3604f.tar.gz:没有此类文件或目录2错误;14个不同的可用软件包错误:服务“apache_php-fpm_backend”无法生成:命令“/bin/sh-c apk update&&apk add--update git&&apk add--update openssh”返回一个非零代码:2
@kanidrive我看到它与应该的resolv.conf相同(由一些docker配置定义),但没有发生任何事情,DNS在apt update上失败。我添加并更新了这个问题的答案。如果
firewall cmd
规则调整未提供所需的修复,请尝试将FirewallBackend值设置为=iptables,然后重新加载/重新启动防火墙并重新启动docker服务,然后重试。我不得不对此大惊小怪,但我现在似乎已经在CentOS8上实现了一致性(在基于Debian的Linux版本上通过docker-composer.yml构建基于Dockerfile的容器,我似乎没有这个问题。)嗯,在我的情况下,主操作系统是Ubuntu,没有firewalld这样的服务。我找不到任何关于ubuntu防火墙的建议,如果这可能是原因的话。啊,当
docker build…
命令失败时,你看到了什么错误?你能和我们分享输出吗?令人惊讶的是,当我试图为你生成一个错误输出时,它成功了。似乎修补docker配置和重新启动使其工作正常
/etc/docker/daemon.json
只是一个空对象
{}
,容器中的
/etc/resolv.conf
读取
nameserver
nameserver 8.8.8
nameserver 192.168.0.1
search
。我认为另一个可以修复这个问题的编辑是
/etc/default/docker
docker\u OPTS=“--dns 127.0.53”#--dns 8.8.8.8--dns 8.8.4.4--dns 192.168.0.1“
(我记得那天这些设置没有改变任何东西,但今天重新启动后它开始工作。)