Docker 没开放 UDP 端口,能找到吗?

在 Docker 网络中,UDP(User Datagram Protocol)用于发送无连接的数据包,常用于音频、视频、游戏和实时通信等应用。当我们在使用 Docker 构建应用时,有时会遇到无法访问 UDP 端口的情况。本文将介绍如何在 Docker 中开放 UDP 端口,并通过代码示例进行详细说明。

Docker 网络基础知识

在开始之前,我们需要了解一些 Docker 网络的基础知识。Docker 提供了多种网络驱动来实现容器之间的通信。常用的网络驱动包括:

  • bridge:默认网络驱动,使用 NAT(Network Address Translation)技术将容器的 IP 地址转换为主机的 IP 地址,使得容器可以通过主机进行访问。
  • host:容器与主机共享网络命名空间,即容器直接使用主机的网络设备。
  • overlay:用于跨多个 Docker 主机创建多个容器的网络。

开放 UDP 端口

对于大多数情况下,Docker 默认开放的是 TCP 端口。要开放 UDP 端口,我们需要创建自定义的网络并指定 UDP 端口。

首先,我们需要创建一个自定义网络:

```bash
docker network create --driver bridge mynetwork

然后,我们可以在容器的启动命令中指定 UDP 端口。下面是一个使用 Node.js 创建 UDP 服务器的示例:

```markdown
```javascript
const dgram = require('dgram');

const server = dgram.createSocket('udp4');

server.on('error', (err) => {
  console.log(`server error:\n${err.stack}`);
  server.close();
});

server.on('message', (msg, rinfo) => {
  console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});

server.on('listening', () => {
  const address = server.address();
  console.log(`server listening ${address.address}:${address.port}`);
});

server.bind(12345); // 绑定 UDP 端口

在启动容器时,我们需要将自定义网络绑定到容器上,并将 UDP 端口映射到主机上。下面是一个使用 Dockerfile 构建镜像的示例:

```markdown
```dockerfile
FROM node:14
COPY server.js .
EXPOSE 12345/udp
CMD ["node", "server.js"]

在构建镜像后,我们可以通过以下命令运行容器,并将 UDP 端口映射到主机上:

```markdown
```bash
docker run -d --network=mynetwork -p 12345:12345/udp udp-server

现在,我们就可以通过 UDP 协议访问主机的 12345 端口了。

### 序列图

下面是一个通过 UDP 发送消息的简单序列图,用 mermaid 语法标识出来:

```markdown
```mermaid
sequenceDiagram
  participant Client
  participant Server

  Client->>Server: 发送消息
  Note over Server: 接收消息
  Server-->>Client: 回复消息

### 关系图

下面是一个包含主机、容器和自定义网络之间关系的简单关系图,用 mermaid 语法标识出来:

```markdown
```mermaid
erDiagram
  HOST ||--o| CONTAINER : 使用
  HOST ||--o| NETWORK : 使用
  CONTAINER ||--o| NETWORK : 使用

以上就是关于 Docker 中开放 UDP 端口的介绍和示例代码。通过以上步骤,我们可以在 Docker 中成功开放和访问 UDP 端口。希望本文能帮助到你!