端口映射

DockerBeginner
立即练习

简介

隔离是容器的一项核心特性。默认情况下,容器的网络与主机系统分离。这意味着,即使容器内运行的 Web 服务器状态正常,如果你没有主动发布端口,外部仍然无法访问它。

端口映射可以解决这个问题。它会将主机上指定端口的流量转发到容器内指定的端口。这是容器网络的基础知识之一,因为它说明了隔离的服务如何变得可以访问。

如果不执行发布端口这一步,即使容器内的服务完全正常,它实际上仍然只对容器自己的网络命名空间可见。

在本实验中,你将练习以下操作:

  • 运行 Nginx Web 服务器容器。
  • 将主机的 8080 端口映射到容器的 80 端口。
  • 验证端口映射并访问服务。
  • 清理资源。

暴露容器端口

在此步骤中,你将使用 Nginx 镜像启动一个新的 Docker 容器。

Nginx 是一个 Web 服务器,默认在容器内监听 80 端口。但是,由于容器彼此隔离,80 端口不会自动从你的 LabEx 环境访问。为了解决这个问题,你需要将主机上的 8080 端口映射到容器内的 80 端口。

端口映射的语法是 -p <host_port>:<container_port>。

端口顺序很重要。左侧是客户端连接的主机端口,右侧是应用程序在容器内实际监听的端口。

在终端中运行以下命令:

docker run -d -p 8080:80 --name my-nginx nginx

命令说明:

  • docker run:创建并启动容器的命令。
  • -d:以 detached 模式(后台模式)运行容器。
  • -p 8080:80:端口映射标志。
    • 8080:主机上的端口(LabEx 环境)。
    • 80:容器内的端口(Nginx 正在监听的端口)。
  • --name my-nginx:将容器命名为「my-nginx」。
  • nginx:要使用的镜像。

如果操作成功,Docker 会输出较长的容器 ID。

此时,Docker 并没有修改 Nginx 本身,而是创建了一条网络规则,将发送到主机端口的请求转发到容器的服务端口。

检查端口配置

现在需要验证容器是否正在运行,以及端口映射是否配置正确。docker ps 命令会提供这些信息。

运行以下命令:

docker ps

你应该会看到类似下面的输出:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
abc123456789   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 10 seconds   0.0.0.0:8080->80/tcp   my-nginx

理解输出内容:

仔细查看 PORTS 列:0.0.0.0:8080->80/tcp。

  • 0.0.0.0:8080:表示主机正在所有网络接口上监听 8080 端口。
  • ->:表示转发方向。
  • 80/tcp:表示容器内的目标端口。

这确认了发送到本机 8080 端口的所有流量都会被转发到容器内的 80 端口。

正因为存在这条转发规则,端口映射通常也称为「发布」容器端口。你正在将原本隔离的服务公开给主机或外部客户端。

你也可以使用专门的命令,只检查端口信息:

docker port my-nginx

测试服务

端口映射完成后,现在测试 Web 服务器是否可以访问。由于你已经映射了主机的 8080 端口,因此可以向 localhost:8080 发送请求来访问 Nginx 服务器。

这里使用 curl,它是一个用于发送 Web 请求的命令行工具。

运行以下命令:

curl localhost:8080

预期结果:

你应该会看到 Nginx 默认欢迎页面的原始 HTML 代码。

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to nginx!</title>
...
    <h1>Welcome to nginx!</h1>
...
</html>

如果看到这些 HTML 输出,说明操作成功!你的请求已经从主机(8080 端口)进入容器(80 端口),由 Nginx 处理,然后将响应发送回主机。

这个完整的往返过程证明了主机与容器之间的网络连接正常,而不仅仅是说明容器内的进程正在运行。

清理资源

在最后一步中,清理实验环境。对于不再需要的容器,及时停止并删除是一个好习惯,这样可以释放端口和系统资源。

首先,停止正在运行的容器:

docker stop my-nginx

接着,删除已停止的容器:

docker rm my-nginx

验证容器是否已经删除:

docker ps -a

列表中不应再出现 my-nginx 容器。

总结

在本实验中,你成功学习了 Docker 端口映射的基础知识。你完成了以下操作:

  1. 启动以 detached 模式运行的 Nginx 容器。
  2. 使用 -p 标志,将主机的 8080 端口映射到容器的 80 端口。
  3. 使用 docker ps验证端口配置。
  4. 使用 curl 从主机访问服务。
  5. 清理容器。

了解端口映射对于部署 Web 应用程序非常重要,因为它可以让外部流量访问运行在隔离容器内的服务。