Docker Desktop 上的网络功能

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 代理支持:

  1. 导航到 设置 中的 资源 选项卡。
  2. 从下拉框中选择 代理
  3. 打开 手动代理配置 开关。
  4. Secure Web Server HTTPS 框中,粘贴你的 socks5://host:port URL。

socks代理需要Docker-Desktop企业订阅

适用于 Mac 和 Linux 的网络功能

SSH 代理转发

Mac 和 Linux 上的 Docker Desktop 允许你在容器内使用主机的 SSH 代理。

  1. 通过向 docker run 命令添加以下参数来绑定挂载 SSH 代理套接字:

    console 复制代码
    $--mount type=bind,src=/run/host-services/ssh-auth.sock,target=/run/host-services/ssh-auth.sock
  2. 在容器中添加 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,你可以使用以下步骤从容器连接到主机上的服务:

  1. 运行以下命令以在端口 8000 上启动一个简单的 HTTP 服务器。

    python -m http.server 8000

    如果你已经安装了 Python 2.x,请运行 python -m SimpleHTTPServer 8000

  2. 现在,运行一个容器,安装 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 命令的文档。

相关推荐
GIS数据转换器3 分钟前
2025无人机在农业生态中的应用实践
大数据·网络·人工智能·安全·无人机
cozil1 小时前
记录磊科B39路由器跨域组网遇到的问题
网络·智能路由器·跨域组网
维诺菌1 小时前
k8s java应用pod内存占用过高问题排查
java·jvm·云原生·容器·性能优化·kubernetes
路由侠内网穿透1 小时前
本地部署开源数据分析平台 Elastic Stack 并实现外部访问( Windows 版本)
运维·服务器·网络·windows·开源·jenkins
浪飘1 小时前
k8s device plugin
java·docker·kubernetes
冬夜戏雪1 小时前
milvus容器restart不成功,但docker仍在running问题排查
docker·容器·milvus
m0_579146652 小时前
docker desktop的容器间通信
docker·容器·php
helloworddm2 小时前
Orleans 与 Kubernetes 结合的价值分析
云原生·容器·kubernetes
FreeBuf_2 小时前
AWS服务大规模中断,基础设施故障影响全球企业
网络·数据库·aws
王道长服务器 | 亚马逊云2 小时前
AWS CloudFormation —— 自动化部署的“云中脚本大师”
运维·服务器·网络·自动化·云计算·aws