github编辑

EXPOSE 暴露端口

基本语法

具体内容如下:

EXPOSE <端口> [<端口>/<协议>...]

EXPOSE 声明容器运行时提供服务的端口。这是一个文档性质的声明,告诉使用者容器会监听哪些端口。


基本用法

具体内容如下:

## 声明单个端口

EXPOSE 80

## 声明多个端口

EXPOSE 80 443

## 声明 TCP 和 UDP 端口

EXPOSE 80/tcp
EXPOSE 53/udp

EXPOSE 的作用

1. 文档说明

告诉镜像使用者,容器将在哪些端口提供服务:

2. 配合 -P 使用

使用 docker run -P 时,Docker 会自动映射 EXPOSE 的端口到宿主机随机端口:


EXPOSE vs -p

特性
EXPOSE
-p

位置

Dockerfile

docker run 命令

作用

声明/文档

实际端口映射

是否必需

是(外部访问时)

映射发生时

不发生

运行时发生

没有 EXPOSE 也能 -p

具体内容如下:


常见误解

误解:EXPOSE 会打开端口

具体内容如下:

EXPOSE 不会:

  • 自动进行端口映射

  • 让服务可从外部访问

  • 在容器启动时开启端口监听

EXPOSE 只是元数据声明。容器是否实际监听该端口,取决于容器内的应用。

正确理解

具体内容如下:


最佳实践

1. 总是声明应用使用的端口

具体内容如下:

2. 使用明确的协议

具体内容如下:

3. 与应用实际端口保持一致

具体内容如下:


使用环境变量

具体内容如下:


在 Compose 中

在 Compose 中 配置如下:

expose 在 Compose 中仅用于容器间通信的文档说明,不进行端口映射。


本章小结

要点
说明

作用

声明容器提供服务的端口(文档)

不会

自动映射端口或开放外部访问

配合

docker run -P 自动映射

外部访问

需要 -p 宿主机端口:容器端口

语法

EXPOSE 80EXPOSE 80/tcp

延伸阅读

最后更新于