Docker 指定多个端口的使用方法

在使用 Docker 构建容器镜像时,我们经常需要指定容器内部的端口与主机的端口进行映射,以实现容器与外部环境的通信。Docker 提供了多种方式来指定容器的端口映射,本文将介绍如何使用 Docker 指定多个端口,并提供相应的代码示例。

端口映射概述

在 Docker 中,容器的端口映射通过 -p--publish 参数来实现。这个参数的基本语法如下:

docker run -p [主机端口]:[容器端口] ...

其中 [主机端口] 是指要将容器端口映射到主机上的端口号,[容器端口] 是指容器内部监听的端口号。

单个端口映射示例

先来看一个简单的单个端口映射的示例。我们创建一个简单的 Flask 应用程序,监听容器的 5000 端口,并将其映射到主机的 8080 端口,以便访问该应用。

# Dockerfile
FROM python:3.9

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py .

EXPOSE 5000

CMD ["python", "app.py"]
# app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, Docker!'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)

通过以下命令构建并运行容器:

docker build -t flask-app .
docker run -p 8080:5000 flask-app

这样,我们就可以通过浏览器访问 http://localhost:8080,看到 "Hello, Docker!" 的输出了。

多个端口映射示例

有时候,我们需要在一个容器中运行多个服务,每个服务都需要监听不同的端口。Docker 允许我们指定多个端口映射规则,以满足这种需求。

以下是一个示例,我们在同一个容器中运行了两个服务,一个是 Flask 应用程序,另一个是一个简单的静态文件服务器。

# Dockerfile
FROM python:3.9

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py .
COPY static/ static/

EXPOSE 5000
EXPOSE 8000

CMD ["python", "app.py"]
# app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, Docker!'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)
├── Dockerfile
├── app.py
└── static
    └── index.html
<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Static File Server</title>
</head>
<body>
    Hello, Docker!
</body>
</html>

通过以下命令构建并运行容器:

docker build -t multi-service .
docker run -p 8080:5000 -p 8081:8000 multi-service

这样,我们就可以通过 http://localhost:8080 访问 Flask 应用程序,通过 http://localhost:8081 访问静态文件服务器。

总结

通过以上示例,我们了解到了 Docker 如何指定多个端口进行映射。在构建容器镜像时,使用 -p 参数可以方便地将容器内部的端口映射到主机上。这对于运行多个服务的容器非常有用。

希望本文能对你理解 Docker 的端口映射有所帮助。如果你还有其他问题或疑问,欢迎探讨和交流。