Use a better structure

This commit is contained in:
Baohua Yang
2026-02-09 09:32:05 -08:00
parent fdb879dcf2
commit e669ee0fe8
167 changed files with 2462 additions and 2462 deletions

View File

@@ -1,6 +1,6 @@
# EXPOSE 声明端口
## EXPOSE 声明端口
## 基本语法
### 基本语法
```docker
EXPOSE <端口> [<端口>/<协议>...]
@@ -10,45 +10,45 @@ EXPOSE <端口> [<端口>/<协议>...]
---
## 基本用法
### 基本用法
```docker
# 声明单个端口
## 声明单个端口
EXPOSE 80
# 声明多个端口
## 声明多个端口
EXPOSE 80 443
# 声明 TCP 和 UDP 端口
## 声明 TCP 和 UDP 端口
EXPOSE 80/tcp
EXPOSE 53/udp
```
---
## EXPOSE 的作用
### EXPOSE 的作用
### 1. 文档说明
#### 1. 文档说明
告诉镜像使用者容器将在哪些端口提供服务
```docker
# 使用者一看就知道这是 web 应用
## 使用者一看就知道这是 web 应用
EXPOSE 80 443
```
```bash
# 查看镜像暴露的端口
## 查看镜像暴露的端口
$ docker inspect nginx --format '{{.Config.ExposedPorts}}'
map[80/tcp:{}]
```
### 2. 配合 -P 使用
#### 2. 配合 -P 使用
使用 `docker run -P` Docker 会自动映射 EXPOSE 的端口到宿主机随机端口
```docker
# Dockerfile
## Dockerfile
EXPOSE 80
```
@@ -60,7 +60,7 @@ $ docker port $(docker ps -q)
---
## EXPOSE vs -p
### EXPOSE vs -p
| 特性 | EXPOSE | -p |
|------|--------|-----|
@@ -85,27 +85,27 @@ $ docker port $(docker ps -q)
└────────────────────────────────────────────────────────────┘
```
### 没有 EXPOSE 也能 -p
#### 没有 EXPOSE 也能 -p
```docker
# 即使没有 EXPOSE也可以使用 -p
## 即使没有 EXPOSE也可以使用 -p
FROM nginx
# 没有 EXPOSE
## 没有 EXPOSE
```
```bash
# 仍然可以映射端口
## 仍然可以映射端口
$ docker run -p 8080:80 mynginx
```
---
## 常见误解
### 常见误解
### 误解EXPOSE 会打开端口
#### 误解EXPOSE 会打开端口
```docker
# ❌ 错误理解:这不会让容器可从外部访问
## ❌ 错误理解:这不会让容器可从外部访问
EXPOSE 80
```
@@ -116,68 +116,68 @@ EXPOSE 不会:
EXPOSE 只是元数据声明容器是否实际监听该端口取决于容器内的应用
### 正确理解
#### 正确理解
```docker
# Dockerfile
## Dockerfile
FROM nginx
EXPOSE 80 # 1. 声明:这个容器会在 80 端口提供服务
```
```bash
# 运行:需要 -p 才能从外部访问
## 运行:需要 -p 才能从外部访问
$ docker run -p 8080:80 nginx # 2. 映射:宿主机 8080 → 容器 80
```
---
## 最佳实践
### 最佳实践
### 1. 总是声明应用使用的端口
#### 1. 总是声明应用使用的端口
```docker
# Web 服务
## Web 服务
FROM nginx
EXPOSE 80 443
# 数据库
## 数据库
FROM postgres
EXPOSE 5432
# Redis
## Redis
FROM redis
EXPOSE 6379
```
### 2. 使用明确的协议
#### 2. 使用明确的协议
```docker
# 默认是 TCP
## 默认是 TCP
EXPOSE 80
# 明确指定 UDP
## 明确指定 UDP
EXPOSE 53/udp
# 同时支持 TCP 和 UDP
## 同时支持 TCP 和 UDP
EXPOSE 53/tcp 53/udp
```
### 3. 与应用实际端口保持一致
#### 3. 与应用实际端口保持一致
```docker
# ✅ 好EXPOSE 与应用端口一致
## ✅ 好EXPOSE 与应用端口一致
ENV PORT=3000
EXPOSE 3000
CMD ["node", "server.js"]
# ❌ 差EXPOSE 与应用端口不一致(误导)
## ❌ 差EXPOSE 与应用端口不一致(误导)
EXPOSE 80
CMD ["node", "server.js"] # 实际监听 3000
```
---
## 使用环境变量
### 使用环境变量
```docker
ARG PORT=80
@@ -186,7 +186,7 @@ EXPOSE $PORT
---
## Compose
### Compose
```yaml
services:
@@ -202,7 +202,7 @@ services:
---
## 本章小结
### 本章小结
| 要点 | 说明 |
|------|------|
@@ -212,8 +212,8 @@ services:
| **外部访问** | 需要 `-p 宿主机端口:容器端口` |
| **语法** | `EXPOSE 80` `EXPOSE 80/tcp` |
## 延伸阅读
### 延伸阅读
- [网络配置](../../network/README.md)Docker 网络详解
- [端口映射](../../network/port_bindingbindingbinding.md)-p 参数详解
- [Compose 端口](../../compose/compose_file.md)Compose 中的端口配置
- [Compose 端口](../../compose/9.5_compose_file.md)Compose 中的端口配置