docker问题记录
# docker问题记录
# docker容器无法联网
- 问题情况描述
在利用docker容器搭建服务时候,遇到了个棘手的问题,大概情况是docker网络是通的,能够正常访问网络拉取镜像,但是在运行容器后,发现网络有问题。
具体表现在我根据 ubuntu:22.04镜像启动的容器无法使用apt-get 命令,报错:Temporary failure resolving 'archive.ubuntu.com'
。
根据报错信息,我猜想是apt源的问题,然后网上搜索了对应的问题,发现别人解决的经验也是更换源就可以了。然后我顺着这个思路走,把对应的源先后换了阿里、网易、中科大等的源地址,发现还是问题没有解决,还是一样会出现。然后又试着用vpn连接,也不行。然后刚好本地还布有另一台虚拟机,然后我又在那台虚拟机上折腾安装了docker,接着拉取镜像、启动容器。唉,结果发现在这台虚拟机上能够访问到源,无论是ubuntu、还是阿里的都没有问题。
此时,虽然能够用这台主机搭建服务了,但是我还是很奇怪,为什么这两台虚拟机会产生不同的结果。显然它们都是在vmware上面安装的,网络都是桥接的,配置、linux版本都没有差异,还有docker版本都相差不大。
第一次碰到这种问题,没有具体思路。所以疯狂提问chatgpt和搜索引擎。然而,费了好大功夫,依然没能找到问题所在。chatgpt的回答也是引导我向apt源、dns解析的方向走。
期间是折腾/etc/resolv.conf
、/etc/sysconfig/network-script/...
等,发现宿主机与docker容器的/etc/resolv.conf
对应的dns地址总是改变,即使我已经设定好了,它还是会变更成我不需要的。大概陷入了这样的困境。
我在/etc/resolv.conf 中配置了nameserver 为114.114.114.114,但是每次我启动容器或重启network就会使得这个文件的配置更改,NetworkManager 会将他变成我不需要的nameserver :8.8.8.8 ,这影响了我的使用,该怎么禁止它
然后根据这个思路走,不行,又开始琢磨尝试ping/nslookup/traceroute等命令,因apt-get不能用,这些网络命令都会报错"command not found!",故而当时只试了宿主机的命令,发现外网是通的。因我之前部署的docker容器都为本地服务,且网络通信都正常,怀疑是系统网络设置或是docker配置(因这两天才对docker主目录进行了迁移)/docker镜像的差异影响的结果,于是对它们这部分的差异进行了比较。根本没有注意到是docker内网通,但外网不通的问题。
到后面,用那台能正常访问外网的机器陆续拉了几个相同的镜像测试,终于发觉应该是docker本身的原因:正常的机器ping、traceroute命令都是通的,反之都不通。然后排除了镜像版本的问题,因为相同的镜像放到问题机上仍然会不通。于是问题方向就基本确定了。
- 解决办法:
docker有三种默认的网络模式,分别是:bridge、host、none。默认的Bridge网络只能提供在同一个Bridge容器内的容器间相互访问,无法连接外网
- 方法一(有效):
在创建容器时加上参数 --net host,令容器创建时共享主机的network namespace,即容器可以访问主机上所有的网络信息,这样容器内的网络配置就会和主机一模一样。
docker run --name DeepLearning --net host -it deeplearning:v1 bash
# 扩展
# 检查容器的网络模式
docker inspect <容器名称或ID> | grep NetworkMode
2
3
4
5
6
- 方法二(有效)
# 为容器暴露端口 或 做端口映射
docker run -it -p 5555:80 --name xxxxx image_Name /bin/bash
2
3
4
- 方法二(待测):
#说明:用linux开启ip转发
sysctl net.ipv4.conf.all.forwarding=1
# 防火墙设置
iptables -P FORWARD ACCEPT
2
3
4
5
6
7
# 参考链接
- https://www.jianshu.com/p/205c6ece019b