Docker 端口映射
在 Docker 中,容器的端口和当前主机的端口是相互独立的,默认情况下容器的端口不会直接影响主机的端口。只有当你显式地将容器的端口映射到主机的端口时,才会产生关联。
容器映射主机端口
Docker 提供了端口映射功能,可以将容器内部的端口映射到主机的端口,实现主机访问Docker内部容器服务
bash
# 使用 `docker ps` 查看容器的端口映射信息:
# 使用 -p 参数指定端口映射:
docker run -p <主机端口>:<容器端口> <镜像名称>
# 示例 1: 将主机的 8080 端口映射到容器的 80 端口
docker run -p 8080:80 nginx
# 示例 2: 映射多个端口
docker run -p 8080:80 -p 8443:443 nginx
# 示例 3: 指定绑定的主机 IP 地址
docker run -p 127.0.0.1:8080:80 nginx
# -P 参数可以随机映射容器的所有暴露端口到主机的可用端口:
docker run -P nginxNOTE
配置了映射之后主机能够访问Docker容器服务, 但是Docker容器无法访问主机的服务.
容器访问主机端口
在实际应用中,Docker 容器有时需要访问宿主机上的服务(如数据库、API 服务等)。由于容器与宿主机网络是隔离的,容器默认无法直接访问宿主机端口。常见的实现方式如下:
使用
--add-host参数
通过--add-host参数,可以在容器的/etc/hosts文件中添加一条自定义主机名与宿主机 IP 的映射,使容器能够通过指定域名访问宿主机服务。bash# host-gateway 是 Docker 提供的特殊关键字,自动解析为宿主机网关地址 docker run --add-host=host.docker.internal:host-gateway <镜像名称> # 示例:运行 nginx 容器并添加宿主机映射 docker run --add-host=host.docker.internal:host-gateway nginxNOTE
该命令会在容器的
/etc/hosts文件中添加host.docker.internal的映射,使容器可以通过该域名访问宿主机服务。直接使用宿主机 IP 地址
在 Linux 系统中,宿主机的默认网关 IP 通常为172.17.0.1(可通过ip addr命令查询)。容器可以直接通过该 IP 访问宿主机服务。bash# 例如在容器内访问宿主机上的 3306 端口 mysql -h 172.17.0.1 -P 3306使用 host 网络模式
通过--network host参数,容器将与宿主机共享网络堆栈,实现完全的网络互通,但会丧失网络隔离性。bashdocker run --network host <镜像名称>
NOTE
- 宿主机 IP 地址:在 Linux 下,常见的宿主机网关地址为
172.17.0.1,具体可用ip addr或ifconfig查询。 - 防火墙配置:确保宿主机防火墙允许来自 Docker 容器的访问请求,否则可能导致连接失败。
- 网络模式选择:
host网络模式适用于需要高性能或完全互通的场景,但建议谨慎使用以保证安全隔离。
TIP
推荐优先使用 --add-host 或直接使用宿主机网关 IP 的方式,简单高效且安全。如需更复杂的网络需求,可结合 Docker 自定义网络和防火墙策略进行配置。
