端口映射基础与演化
在 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 标志可以多次使用,以配置多个端口的映射。
