记录一个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 了。