互联网技术 / 互联网资讯 · 2024年3月14日

Docker 网络端口映射与容器端口绑定要点

端口映射基础与演化

在 Docker 的网络功能引入之前,您可以通过链接(links)机制让容器彼此发现并安全传递信息。然而,随着网络功能的发展,链接仍然可用,但在默认桥接网络和自定义网络中的行为有所不同。

示例:运行一个简单的应用并映射端口

假设您使用如下命令运行一个简单的 Python Flask 应用:

$ docker run -d -P training/webapp python app.py

使用 -P 标志时,容器内的任何暴露端口会自动映射到 Docker 主机的一个随机高端口。随后通过 docker ps 看到,容器中的端口 5000 已绑定到主机上的某个随机端口,例如 49155。

$ docker ps nostalgic_Morse

绑定到特定端口

您也可以使用 -p 标志将容器端口绑定到主机的特定端口。例如,主机的 80 端口映射到容器的 5000 端口:

$ docker run -d -p 80:5000 training/webapp python app.py

不过,这种做法的缺点是每次只能在同一端口使用一个容器,限制了并行性和灵活性。

绑定到一段端口区间

若要将容器端口绑定到主机上不同的端口范围,可以指定一个端口区间:

$ docker run -d -p 8000-9000:5000 training/webapp python app.py

这会将容器内的端口 5000 绑定到主机上 8000 至 9000 之间的一个可用端口。

绑定到特定接口或 localhost

默认情况下,-p 会将端口绑定到主机的所有网络接口。您也可以将绑定限定在特定接口,例如仅绑定到 localhost:

$ docker run -d -p 127.0.0.1:80:5000 training/webapp python app.py

这会将容器内的端口 5000 绑定到主机的 127.0.0.1/localhost 接口上的 80 端口。

仅限 localhost 的动态端口绑定

如果希望将容器的端口绑定到动态端口,但仅限于 localhost,可以使用:

$ docker run -d -p 127.0.0.1::5000 training/webapp python app.py

支持的协议与更多选项

还可以通过在端口映射中指定协议,例如 UDP 或 SCTP,例如:

$ docker run -d -p 127.0.0.1:80:5000/UDP training/webapp python app.py

使用 docker port 查看端口映射

您还可以通过 docker port 命令快速查看当前端口映射状态。这对于快速了解容器端口与主机端口的对应关系非常有用。例如,如果您将容器端口映射到 localhost 主机端口,docker port 的输出会反映这一点。

$ docker port Nostalgic_Morse 5000

注意事项

– -p 标志可以多次使用,以配置多个端口的映射。