Docker 内外网不同端口

在使用 Docker 进行应用程序的容器化部署时,我们经常会遇到内网和外网端口不一致的情况。本文将介绍如何在 Docker 中配置不同的内外网端口,并提供代码示例来帮助读者更好地理解。

为什么要配置内外网不同端口?

Docker 容器运行在一个虚拟网络环境中,通过网络端口与外部进行通信。在默认情况下,Docker 容器的网络端口与宿主机的端口是一致的,也就是说,外部无法直接访问容器内部的端口。为了使容器内部的应用程序能够通过外部网络进行访问,我们需要配置内外网不同的端口。

配置内外网不同端口的方法

在 Docker 中,我们可以使用 docker run 命令的 -p 参数来进行端口映射。该参数的格式为 宿主机端口:容器端口。例如,我们可以将容器内部的 80 端口映射到宿主机的 8080 端口上,命令如下所示:

docker run -p 8080:80 myapp

上述命令运行了一个名为 myapp 的容器,并将容器内部的 80 端口映射到宿主机的 8080 端口上。这样,通过访问宿主机的 8080 端口,我们可以访问到容器内部运行的应用程序。

示例代码

下面是一个简单的 Node.js 应用程序的示例代码,它监听容器内部的 80 端口,并返回一个 "Hello, World!" 的响应。

const http = require('http');

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello, World!');
});

server.listen(80, '0.0.0.0', () => {
  console.log('Server running on port 80');
});

我们可以使用 Docker 来构建和运行该应用程序的容器。Dockerfile 的内容如下所示:

FROM node:14

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 80

CMD [ "node", "app.js" ]

通过运行以下命令,我们可以构建和运行该容器:

docker build -t myapp .
docker run -p 8080:80 myapp

现在,我们可以通过访问 http://localhost:8080 来访问容器内部运行的应用程序了。

类图

下面是一个使用 mermaid 语法标识的类图,展示了 Docker 容器与宿主机之间的关系。

classDiagram
  class Docker {
    + run()
    + build()
    + stop()
  }
  class Host {
    - ipAddress
  }
  Docker --> Host: uses

序列图

下面是一个使用 mermaid 语法标识的序列图,展示了 Docker 容器的端口映射过程。

sequenceDiagram
  participant Docker
  participant Host
  participant Container

  Docker ->> Host: 容器运行命令
  Docker ->> Container: 启动容器
  Docker ->> Host: 容器端口映射

  Note over Docker, Host: 映射成外网端口

结论

通过配置 Docker 容器的端口映射,我们可以使容器内部运行的应用程序通过外部网络进行访问。在本文中,我们介绍了如何使用 -p 参数配置内外网不同的端口,并提供了一个 Node.js 应用程序的示例代码帮助读者更好地理解。希望本文对您在 Docker 中配置内外网不同端口有所帮助。