在实际开发中,经常需要使用 Docker 容器搭建开发环境。但是,在容器内部访问外网是一件比较麻烦的事情。本文将介绍 Docker 容器内部访问外网的方法,并带有详细步骤和示例代码。
为什么容器内部无法访问外网
默认情况下,Docker 容器无法访问外网,这是因为 Docker 默认使用的网络模式是桥接模式(bridge)。这种模式下,容器只能和同一个网桥内的其他容器或本地主机进行通信,无法直接访问外网。
解决容器内部访问外网问题
修改 Docker 网络模式
要解决容器内部访问外网的问题,需要修改 Docker 网络模式为 host 模式。具体步骤如下:
- 停止所有运行中的容器
docker stop $(docker ps -q)
- 启动 Docker 使用 host 模式
sudo dockerd --iptables=false --ip-masq=false --bridge=none --pidfile=/run/docker.pid --host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:2375 --insecure-registry 你的docker registry地址 --exec-driver=native --userland-proxy=false --add-runtime=nvidia=/usr/bin/nvidia-container-runtime --default-runtime=nvidia --storage-driver=overlay2 --log-level=error --log-opt max-size=20m --log-opt max-file=5 --tlsverify --tlscacert=/data/docker/ca.pem --tlscert=/data/docker/server-cert.pem --tlskey=/data/docker/server-key.pem -H=0.0.0.0:2375
- 新建一个容器,并在其中运行 ping 命令测试网络是否已经可以访问外网
docker run -it --rm busybox ping www.baidu.com
如果能够正常 ping 到外网,则说明 Docker 容器内部访问外网问题已经解决。
使用代理服务器
如果修改 Docker 网络模式无法解决问题,可以考虑使用代理服务器。具体步骤如下:
- 在本地主机或者 Docker 容器中安装代理服务器,例如 Squid
docker run -d --name=squid -e USERNAME=myusername -e PASSWORD=mypassword -p 3128:3128 saturnism/squid
- 设置代理服务器环境变量
将以下环境变量添加到 Dockerfile 或者使用 docker run 命令时设置。
http_proxy=http://proxy_ip_or_name:proxy_port/ https_proxy=https://proxy_ip_or_name:proxy_port/ no_proxy=localhost,127.0.0.1
- 启动新的容器,并在其中运行 curl 命令测试网络是否已经可以访问外网
docker run -it --rm -e http_proxy=http://proxy_ip_or_name:proxy_port/ -e https_proxy=https://proxy_ip_or_name:proxy_port/ busybox curl www.baidu.com
如果能够正常 curl 到外网,则说明 Docker 容器内部访问外网问题已经解决。
总结
本文介绍了 Docker 容器内部访问外网的两种解决方法:修改 Docker 网络模式,使用代理服务器。实际使用时,应该根据具体情况选择适合的方法。希望本文内容对大家解决 Docker 容器内部访问外网问题有所帮助。
示例代码
修改 Docker 网络模式
# Dockerfile FROM busybox ENTRYPOINT ["ping"] CMD ["www.baidu.com"]
# 构建镜像 docker build -t ping . # 运行容器 docker run -it --rm --net=host ping
使用代理服务器
# Dockerfile FROM busybox RUN echo "http_proxy=http://proxy_ip_or_name:proxy_port/" >> /etc/profile RUN echo "https_proxy=https://proxy_ip_or_name:proxy_port/" >> /etc/profile RUN echo "no_proxy=localhost,127.0.0.1" >> /etc/profile CMD ["curl", "www.baidu.com"]
# 构建镜像 docker build -t curl . # 运行容器 docker run -it --rm curl
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a4c45848841e98941252ce