# 端口映射与服务发现

URL: https://caijiao.org/docker/networking/ports-and-discovery
Source: docs/docker/networking/ports-and-discovery.md
Description: 本章节介绍 Docker 的端口映射机制与服务发现方法，包括宿主机端口映射、容器间通信、DNS 解析及集群服务注册，帮助开发者实现高效的容器网络配置与微服务管理。

Docker 容器通常运行在隔离的网络环境中，端口映射与服务发现机制保证容器能够与外部或集群中的其他容器通信。

## 1. 端口映射（Port Mapping）

将宿主机端口映射到容器端口，使外部可以访问容器服务：

```bash
docker run -d -p 8080:80 nginx
````

* `8080`：宿主机端口
* `80`：容器内部端口
* 可映射单个端口或范围：

```bash
docker run -d -p 5000-5005:80-85 myapp
```

### 1.1 映射协议

* 默认 TCP，可显式指定：

```bash
docker run -d -p 8080:80/tcp myapp
docker run -d -p 8080:80/udp myapp
```

## 2. 容器间通信

* 同一自定义网络内容器可通过容器名称访问：

```bash
docker network create mynet
docker run -d --name db --network mynet mysql
docker run -d --name web --network mynet mywebapp
docker exec web ping db
```

## 3. 服务发现（Service Discovery）

* Docker 内置 DNS 支持容器名称解析
* Swarm 或 Kubernetes 可自动注册服务，容器间通过服务名访问
* Swarm 服务示例：

```bash
docker service create --name web --replicas 3 -p 8080:80 nginx
docker service ls
```

* 内部容器可通过服务名访问负载均衡后的实例

## 4. 负载均衡与健康检查

* Swarm 自动分配容器请求，实现服务负载均衡
* 配置健康检查保证服务可用：

```bash
docker service create \
  --name web \
  --replicas 3 \
  --publish 8080:80 \
  --health-cmd="curl -f http://localhost/ || exit 1" \
  nginx
```

## 5. 最佳实践

* 使用自定义网络简化容器名称解析
* 对外暴露端口时避免使用默认 `latest` 或常用端口
* 在集群环境中结合健康检查和负载均衡提高可用性
* 利用 DNS 名称而非 IP，保证容器迁移或重启时通信稳定

---

端口映射与服务发现是 Docker 网络管理的核心，通过合理配置可实现容器间高效通信和外部访问。
