Docker Run 多端口

在使用 Docker 运行容器时,我们经常需要将容器内的应用程序监听的端口映射到宿主机的端口上,以便我们可以通过宿主机访问容器内的应用程序。Docker 提供了 docker run 命令来运行容器,并且可以通过参数来指定端口映射。

端口映射

Docker 容器中的应用程序通常会监听某个特定的端口,比如一个 Web 应用程序可能会监听 80 端口用于 HTTP 请求。为了让宿主机能够访问到容器内的应用程序,我们需要将容器内的端口映射到宿主机的一个端口上。

Docker 的端口映射功能可以通过 docker run 命令的 -p 参数来实现。下面是一个示例:

docker run -p 8080:80 nginx

上面的命令表示运行一个基于 Nginx 镜像的容器,并将容器的 80 端口映射到宿主机的 8080 端口上。这样,我们就可以通过访问 http://localhost:8080 来访问容器内的 Nginx 服务了。

可以通过 -p 参数来指定多个端口的映射,多个端口之间使用逗号分隔。例如:

docker run -p 8080:80 -p 3306:3306 nginx

上面的命令将容器的 80 端口映射到宿主机的 8080 端口上,并将容器的 3306 端口映射到宿主机的 3306 端口上。

示例应用

下面我们来通过一个示例应用来演示 Docker 容器的多端口映射功能。

假设我们有一个简单的 Node.js 应用程序,它监听 3000 端口,并返回一个 "Hello, Docker!" 的响应。我们可以通过以下代码来实现:

const http = require('http');

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

server.listen(3000, '0.0.0.0', () => {
  console.log('Server running at http://localhost:3000/');
});

我们可以使用 Docker 来运行这个应用程序,并将容器的 3000 端口映射到宿主机的某个端口上。下面是一个使用 Dockerfile 构建镜像并运行容器的示例:

FROM node:14

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD [ "node", "app.js" ]
docker build -t my-node-app .
docker run -p 8080:3000 my-node-app

上面的命令会构建一个名为 my-node-app 的镜像,并运行一个基于该镜像的容器。容器的 3000 端口将映射到宿主机的 8080 端口上。

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

关系图

下面是一个关系图,展示了 Docker 容器的多端口映射的关系:

erDiagram
    Docker --|> 容器
    容器 --|> 应用程序
    Docker --|> 宿主机
    宿主机 --|> 外部网络

序列图

下面是一个序列图,展示了 Docker 容器的多端口映射的流程:

sequenceDiagram
    participant Docker
    participant 容器
    participant 宿主机
    participant 外部网络
    Docker ->> 容器: 运行容器
    容器 -->> Docker: 应用程序监听端口
    Docker ->> 宿主机: 端口映射
    宿主机 -->> 外部网络: 访问映射端口

通过上述示例和