Skip to content

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 nginx

NOTE

配置了映射之后主机能够访问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 nginx

    NOTE

    该命令会在容器的 /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 参数,容器将与宿主机共享网络堆栈,实现完全的网络互通,但会丧失网络隔离性。

    bash
    docker run --network host <镜像名>

NOTE

  • 宿主机 IP 地址:在 Linux 下,常见的宿主机网关地址为 172.17.0.1,具体可用 ip addrifconfig 查询。
  • 防火墙配置:确保宿主机防火墙允许来自 Docker 容器的访问请求,否则可能导致连接失败。
  • 网络模式选择host 网络模式适用于需要高性能或完全互通的场景,但建议谨慎使用以保证安全隔离。

TIP

推荐优先使用 --add-host 或直接使用宿主机网关 IP 的方式,简单高效且安全。如需更复杂的网络需求,可结合 Docker 自定义网络和防火墙策略进行配置。

Released under the MIT License.