【Docker】记录一个docker build时遇到的DNS问题

记录一个docker build时遇到的DNS问题

前言

今天心血来潮将之前写的一篇博客中的Dockerfile更新了一些依赖的版本再构建一次,谁知道遇到一个问题,死活都解决不了。
原博客地址,关于Ubuntu上安装GDAL环境和Java环境的。

问题

---> Running in d70a3f73928c
Err:1 http://security.ubuntu.com/ubuntu yakkety-security InRelease
  Temporary failure resolving 'security.ubuntu.com'
Err:2 http://archive.ubuntu.com/ubuntu yakkety InRelease
  Temporary failure resolving 'archive.ubuntu.com'

这个问题主要原因是DNS错误无法访问到服务器。在遇到这个问题的第一时间我就检查了宿主机的网络,发现是正常的,ping www.baidu.com 没问题,于是我又重新启动一个测试容器

docker run --rm --network=host alpine ping www.baidu.com

结果是正常的,这个时候我还没没意识到测试其他docker网络,于是便上网查,把查到的结果都试了一遍,无非就是改宿主机的DNS、使用 echo "nameserver 8.8.8.8" > /etc/resolv.conf 将镜像中的DNS地址改成谷歌的、阿里的等等,可是都不生效。改来改去怎么都不行,Dockerfile中的第一句:

apt update

就是无论如何都执行不了,也怪我对docker的知识掌握不够,不知道什么原因导致的。后来突然想起看看docker网络:

docker network ls

发现还有一个叫bridge的网络,遂想起docker网络如果不显式指定网络docker run --network ...的话,会默认使用桥接网络,于是我便测试这个桥接网络:

docker run --rm --network=bridge alpine ping www.baidu.com

我超?终于露出马脚了你,这个网络它不通!
于是又去网上找答案…
后来在不断寻找中终于发现了问题所在,找到 /etc/docker/daemon.json 这个文件,打开它,发现其中有配置:

{
  "registry-mirrors": ["https://{手动打码}.mirror.aliyuncs.com"],
  "iptables": false
}

… 破案了家人们,iptables被我干掉了,也不知道什么时候干掉的,一点印象都没得。
改为"iptables": true,再次构建,这次成功了…

原因

看看GPT哥的解释:

在大多数情况下,Docker 守护进程都需要配置 iptables 规则以确保容器网络的正常工作。因此,禁用 iptables 可能会导致一些网络相关的问题。
特别是,如果您的 Docker 构建问题与网络相关,并且之前遇到了 DNS 解析问题,那么禁用 iptables 可能会进一步加剧这个问题。因为 iptables 负责在主机上进行网络包的过滤和转发,而 Docker 容器也会受到 iptables 规则的影响。

好了,大概就酱~
多学习啊,同志们,不然遇到问题只能 百度 + GPT 了。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Docker中创建一个Alpine PXE服务器,您可以按照以下步骤操作: 1. 首先,从Docker Hub下载Alpine镜像: ``` docker pull alpine ``` 2. 然后,创建一个Dockerfile文件并将以下内容添加到文件中: ``` FROM alpine RUN apk update && \ apk add dnsmasq syslinux && \ rm -rf /var/cache/apk/* ADD ./dnsmasq.conf /etc/dnsmasq.conf ADD ./pxelinux.0 /var/lib/tftpboot/pxelinux.0 ADD ./menu.c32 /var/lib/tftpboot/menu.c32 ADD ./default /var/lib/tftpboot/default EXPOSE 67/udp CMD ["/usr/sbin/dnsmasq", "-d", "--dhcp-range=192.168.0.50,192.168.0.150", "--dhcp-boot=pxelinux.0"] ``` 这个Dockerfile文件创建一个基于Alpine的镜像,并且安装了dnsmasq和syslinux软件包。然后,它将dnsmasq.conf文件和其他必要文件添加到镜像中,并将DHCP服务器配置为在192.168.0.50到192.168.0.150之间分配IP地址。最后,它启动dnsmasq服务器。 3. 接下来,创建一个dnsmasq.conf文件,其中包含以下内容: ``` interface=eth0 dhcp-range=192.168.0.50,192.168.0.150,12h dhcp-option=3,192.168.0.1 dhcp-option=6,8.8.8.8,8.8.4.4 dhcp-boot=pxelinux.0 enable-tftp tftp-root=/var/lib/tftpboot ``` 这个dnsmasq.conf文件配置了DHCP服务器和TFTP服务器。它指定了分配IP地址的范围,指定了网关和DNS服务器的IP地址,指定了启动文件pxelinux.0,并启用了TFTP服务器。 4. 接下来,将pxelinux.0、menu.c32和default文件复制到/var/lib/tftpboot目录中。这些文件可以从syslinux软件包中获取。 5. 最后,使用以下命令构建Docker镜像: ``` docker build -t alpine-pxe . ``` 6. 运行Docker容器: ``` docker run -d --name pxe-server --net=host alpine-pxe ``` 这将在容器中启动PXE服务器,并将容器的网络设置为主机网络。现在,您可以通过在同一网络上的计算机上启动PXE客户端来测试PXE服务器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值