探索 Docker Desktop 上的网络功能
Docker Desktop 包含内置网络功能,可帮助您将容器与主机上的服务、跨容器连接,或通过代理和 VPN 连接。
所有平台的网络功能
VPN 直通
连接到 VPN 时,Docker Desktop 网络可以工作。为此,Docker Desktop 会拦截来自容器的流量,并将其注入到主机中,就像流量来自 Docker 应用程序一样。
端口映射
当您使用 -p
参数运行容器时,例如
$ docker run -p 80:80 -d nginx
Docker Desktop 会将容器中端口 80
上运行的任何内容(在本例中为 nginx
)映射到 localhost
的端口 80
上。在此示例中,主机端口和容器端口相同。
为了避免与主机上已使用端口 80
的服务发生冲突
$ docker run -p 8000:80 -d nginx
现在,连接到 localhost:8000
的流量将发送到容器中的端口 80
。
提示
-p
参数的语法是HOST_PORT:CLIENT_PORT
。
HTTP/HTTPS 代理支持
请参阅 Proxies
SOCKS5 代理支持
SOCKS (Socket Secure) 是一种通过代理服务器在客户端和服务器之间路由网络数据包的协议。它提供了一种增强用户和应用程序隐私、安全性和网络性能的方法。
您可以启用 SOCKS 代理支持以允许传出请求(例如拉取镜像),并从主机访问 Linux 容器后端 IP。
要启用和设置 SOCKS 代理支持
- 导航到 Settings 中的 Resources 选项卡。
- 从下拉菜单中选择 Proxies。
- 开启 Manual proxy configuration 开关。
- 在 Secure Web Server HTTPS 框中,粘贴您的
socks5://host:port
URL。
Mac 和 Linux 的网络功能
SSH 代理转发
Docker Desktop for Mac 和 Linux 允许您在容器内使用主机的 SSH 代理。为此
通过向
docker run
命令添加以下参数来绑定挂载 SSH 代理套接字$--mount type=bind,src=/run/host-services/ssh-auth.sock,target=/run/host-services/ssh-auth.sock
在容器中添加
SSH_AUTH_SOCK
环境变量$ -e SSH_AUTH_SOCK="/run/host-services/ssh-auth.sock"
要在 Docker Compose 中启用 SSH 代理,请为您的服务添加以下标志
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 地址可以在 Settings 中更改。更改 IP 后,您需要重置 Kubernetes 集群并离开所有活动的 Swarm。
主机上没有 docker0
桥接
由于 Docker Desktop 实现网络的方式,您无法在主机上看到 docker0
接口。此接口实际上位于虚拟机内部。
我无法 ping 通我的容器
Docker Desktop 无法将流量路由到 Linux 容器。但是,如果您是 Windows 用户,则可以 ping Windows 容器。
无法按容器分配 IP 地址
这是因为 Docker bridge
网络无法从主机访问。但是,如果您是 Windows 用户,则可以对 Windows 容器进行按容器分配 IP 地址。
用例和解决方法
我想从容器连接到主机上的服务
主机具有变化的 IP 地址,如果没有任何网络访问权限,则没有 IP 地址。Docker 建议您连接到特殊的 DNS 名称 host.docker.internal
,该名称解析为主机使用的内部 IP 地址。
您也可以使用 gateway.docker.internal
访问网关。
如果您的机器上安装了 Python,可以使用以下说明作为示例,从容器连接到主机上的服务
运行以下命令在端口 8000 上启动一个简单的 HTTP 服务器。
python -m http.server 8000
如果您安装了 Python 2.x,请运行
python -m SimpleHTTPServer 8000
。现在,运行一个容器,安装
curl
,并尝试使用以下命令连接到主机$ docker run --rm -it alpine sh # apk add curl # curl http://host.docker.internal:8000 # exit
我想从主机连接到容器
端口转发适用于 localhost
。--publish
、-p
或 -P
都可以使用。从 Linux 暴露的端口会被转发到主机。
Docker 建议您发布一个端口,或从另一个容器连接。即使在 Linux 上,如果容器位于 overlay 网络而非 bridge 网络(因为 overlay 网络不可路由),您也需要这样做。
例如,要运行一个 nginx
Web 服务器
$ docker run -d -p 80:80 --name webserver nginx
为了澄清语法,以下两个命令都将容器的端口 80
发布到主机的端口 8000
$ docker run --publish 8000:80 --name webserver nginx
$ docker run -p 8000:80 --name webserver nginx
要发布所有端口,请使用 -P
标志。例如,以下命令启动一个容器(在分离模式下),-P
标志将容器所有暴露的端口发布到主机上的随机端口。
$ docker run -d -P --name webserver nginx
或者,您也可以使用主机网络,使容器直接访问主机的网络堆栈。
有关 docker run
使用的发布选项的更多详细信息,请参阅run 命令。