探索 Docker Desktop 上的网络功能
Docker Desktop 提供了多种网络功能,使其更易于使用。
联网功能
VPN 直通
Docker Desktop 网络在连接到 VPN 时可以工作。为此,Docker Desktop 拦截来自容器的流量并将其注入主机,就像它源自 Docker 应用程序一样。
端口映射
当您使用参数运行容器时-p
,例如:
$ docker run -p 80:80 -d nginx
Docker Desktop 使容器中端口 80 上运行的任何内容(在本例中为nginx
)在 的端口 80 上可用localhost
。在此示例中,主机和容器端口相同。例如,如果您已经在主机的端口 80 上运行某些内容,则可以将容器连接到不同的端口:
$ docker run -p 8000:80 -d nginx
现在,连接将localhost:8000
发送到容器中的端口 80。的语法-p
是HOST_PORT:CLIENT_PORT
.
HTTP/HTTPS 代理支持
看:
SOCKS5 代理支持(测试版)
SOCKS(套接字安全)是一种通过代理服务器促进客户端和服务器之间的网络数据包路由的协议。它提供了一种增强用户和应用程序的隐私、安全性和网络性能的方法。
使用 Docker Desktop 4.28 及更高版本,您可以启用 SOCKS 代理支持以允许传出请求(例如拉取映像)以及从主机访问 Linux 容器后端 IP。
要启用并设置 SOCKS 代理支持:
- 导航到Docker Desktop 中的设置。
- 转到开发中的功能,然后在Beta选项卡上选中启用SOCKS 代理支持选项。
- 选择应用并重新启动。
- 转到“资源”选项卡,然后从下拉菜单中选择“代理”
- 打开手动代理配置开关。
- 在安全 Web 服务器 HTTPS框中,粘贴您的
socks5://host:port
URL。
SSH代理转发
Mac 和 Linux 上的 Docker Desktop 允许您在容器内使用主机的 SSH 代理。go做这个:
通过将以下参数添加到命令中来绑定安装 SSH 代理套接字
docker run
:$--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 寻址是不可能的
bridge
这是因为主机无法访问Docker网络。但是,如果您是 Windows 用户,则可以使用 Windows 容器进行每个容器的 IP 寻址。
使用案例和解决方法
我想从容器连接到主机上的服务
主机的 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
并尝试使用以下命令连接到主机:$ docker run --rm -it alpine sh # apk add curl # curl http://host.docker.internal:8000 # exit
我想从主机连接到容器
端口转发适用于localhost
. --publish
、-p
、 或-P
全部工作。从 Linux 公开的端口将转发到主机。
我们建议您发布端口,或从另一个容器进行连接。即使在 Linux 上,如果容器位于覆盖网络而不是桥接网络上,您也需要执行此操作,因为这些网络没有路由。
例如,要运行nginx
网络服务器:
$ 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
。