Docker Desktop 上的网络功能
Docker Desktop 提供了一系列网络功能,让用户更便捷地使用 Docker。
适用于所有平台的网络功能
VPN直通
Docker Desktop 的网络功能也可以在连接到 VPN 时正常工作。这是因为 Docker Desktop 会拦截来自容器的流量,并将其注入到主机中,就像这些流量是直接来自 Docker 应用程序一样。
端口映射
当你使用 -p
参数运行容器时,例如:
console
$ docker run -p 80:80 -d nginx
Docker Desktop 会将运行在容器的 80 端口上的服务映射到主机的 80 端口上,这样你就可以在 localhost 的 80 端口上访问到 nginx
服务。如果你的主机的 80 端口已经被占用,你也可以将容器的服务映射到主机的其他端口上:
console
$ docker run -p 8000:80 -d nginx
这样,访问 localhost:8000
的请求就会被转发到容器的 80 端口上。-p
参数的格式为 HOST_PORT:CONTAINER_PORT
。
HTTP/HTTPS 代理支持
Docker Desktop 支持 HTTP 和 HTTPS 代理。
详见下一篇博客
SOCKS5 代理支持
从 Docker Desktop 4.28.0 版本开始,Docker Desktop 支持 SOCKS5 代理。SOCKS 是一种网络协议,它可以通过代理服务器将网络数据包从客户端路由到服务器,从而为用户和应用程序提供了增强隐私、安全性和网络性能的方法。
你可以启用 SOCKS 代理支持,以允许传出请求(例如拉取镜像),并从主机访问 Linux 容器后端 IP。
要启用和设置 SOCKS 代理支持:
- 导航到 设置 中的 资源 选项卡。
- 从下拉框中选择 代理。
- 打开 手动代理配置 开关。
- 在 Secure Web Server HTTPS 框中,粘贴你的
socks5://host:port
URL。
socks代理需要Docker-Desktop
企业订阅
。
适用于 Mac 和 Linux 的网络功能
SSH 代理转发
Mac 和 Linux 上的 Docker Desktop 允许你在容器内使用主机的 SSH 代理。
-
通过向
docker run
命令添加以下参数来绑定挂载 SSH 代理套接字:console$--mount type=bind,src=/run/host-services/ssh-auth.sock,target=/run/host-services/ssh-auth.sock
-
在容器中添加
SSH_AUTH_SOCK
环境变量:console$ -e SSH_AUTH_SOCK="/run/host-services/ssh-auth.sock"
要在 Docker Compose 中启用 SSH 代理,请将以下标志添加到你的服务中:
yaml
services:
web:
image: nginx:alpine
volumes:
- type: bind
source: /run/host-services/ssh-auth.sock
target: /run/host-services/ssh-auth.sock
environment:
- SSH_AUTH_SOCK=/run/host-services/ssh-auth.sock
已知限制
更改内部 IP 地址
你可以在 设置 中更改 Docker 使用的内部 IP 地址。但是,更改 IP 后,你需要重置 Kubernetes 集群,并保留任何活动的 Swarm。
主机上没有 docker0 桥接口
由于 Docker Desktop 中实现网络的方式,你在主机上看不到 docker0
接口。这个接口实际上是在虚拟机中。
无法 ping 容器
Docker Desktop 无法将流量路由到 Linux 容器。但是,如果你是 Windows 用户,则可以访问 Windows 容器。
无法进行每个容器的 IP 寻址
这是因为无法从主机访问 Docker bridge
网络。但是,如果你是 Windows 用户,则可以使用 Windows 容器进行每个容器的 IP 寻址。
用例和解决方法
从容器连接到主机上的服务
主机有一个不断变化的 IP 地址,如果你没有网络访问权限,则无法访问。我们建议你连接到特殊的 DNS 名称 host.docker.internal
,它会解析为主机使用的内部 IP 地址。
你还可以使用 gateway.docker.internal
来访问网关。
如果你在机器上安装了 Python,你可以使用以下步骤从容器连接到主机上的服务:
-
运行以下命令以在端口 8000 上启动一个简单的 HTTP 服务器。
python -m http.server 8000
如果你已经安装了 Python 2.x,请运行
python -m SimpleHTTPServer 8000
。 -
现在,运行一个容器,安装
curl
,并尝试使用以下命令连接到主机:console$ docker run --rm -it alpine sh # apk add curl # curl http://host.docker.internal:8000 # exit
从主机连接到容器
端口转发适用于 localhost
。--publish
、-p
或 -P
都可以使用。从 Linux 暴露的端口会被转发到主机。
我们建议你发布一个端口,或者从另一个容器连接。这是你需要做的,即使在 Linux,如果容器在覆盖网络上,而不是桥接网络上,因为这些没有路由。
例如,要运行 nginx
网络服务器:
console
$ docker run -d -p 80:80 --name webserver nginx
为了阐明语法,以下两个命令都将容器的端口 80
发布到主机的端口 8000
:
console
$ docker run --publish 8000:80 --name webserver nginx
$ docker run -p 8000:80 --name webserver nginx
要发布所有端口,请使用 -P
标志。例如,以下命令启动一个容器(在分离模式下),-P
标志将容器的所有暴露端口发布到主机上的随机端口。
console
$ docker run -d -P --name webserver nginx
或者,你也可以使用主机网络,让容器直接访问主机的网络堆栈。
有关与 docker run
一起使用的发布选项的更多详细信息,请参阅 run 命令的文档。