7.1 端口转发(Port forwarding)的基础
端口转发是 Docker 的一个重要功能,它允许容器中的应用程序对外部可访问。这项功能需要用来从主机机器或甚至其他网络连接到运行在容器中的 web 服务器、数据库或其他服务。
默认情况下,容器在隔离的网络中运行。为了让容器中的服务可被访问,Docker 会将容器的端口转发到主机机器的端口。
端口转发使用 -p
或 --publish
参数与 docker run
命令配合使用。
语法
docker run -p [HOST_PORT]:[CONTAINER_PORT] [OPTIONS] IMAGE [COMMAND] [ARG...]
参数含义:
- HOST_PORT:主机机器上的端口,用于接收流量。
- CONTAINER_PORT:容器内的端口,流量将被转发到这里。
- OPTIONS:用于配置容器的附加参数。
- IMAGE:用来创建容器的镜像。
- COMMAND:在容器内执行的命令。
- ARG...:命令的参数。
基础使用示例
在这个例子中,容器中运行 Nginx web 服务器的 80 端口被转发到主机机器的 8080 端口。之后你可以通过浏览器打开 http://localhost:8080 来访问 web 服务器。
docker run -d -p 8080:80 nginx
7.2 其他端口转发方式
1. 多端口转发
Docker 支持同时转发多个端口。为此可以使用多个 -p
参数。
示例
这里的示例中,容器的 80 端口转发到了主机的 8080 端口,而容器的 443 端口转发到了主机的 8443 端口。
docker run -d -p 8080:80 -p 8443:443 nginx
2. 指定 IP 地址的端口转发
你可以为转发的端口指定一个具体的 IP 地址。这个功能在主机有多个网络接口并且你需要限制对容器的访问时特别有用。
示例:
在这个示例中,容器的 80 端口仅通过主机的 127.0.0.1
接口转发到主机的 8080 端口。这意味着只能从主机本身访问服务。
docker run -d -p 127.0.0.1:8080:80 nginx
3. 端口段转发
如果需要一次性转发多个连续的端口,Docker 支持使用端口范围。
示例:
在这个示例中,容器的 7000
到 8000
端口转发到了主机的 7000
到 8000
端口。
docker run -d -p 7000-8000:7000-8000 someimage
7.3 实用场景
1. 访问Web服务器
端口转发最常用的场景之一是提供对容器内运行的Web服务器的访问。
docker run -d -p 8080:80 nginx
执行此命令后,运行在容器端口80上的Nginx Web服务器将在主机机器的8080端口上可用。
2. 访问数据库
端口转发对于访问容器内运行的数据库也很有用。
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=mysecretpassword postgres
在这个例子中,运行在容器端口5432上的PostgreSQL将在主机机器的5432端口上可用。
3. 测试与开发
Docker容器经常被用来创建隔离的测试环境。端口转发允许开发者以仿真真实环境的方式部署和测试应用程序。
docker run -d -p 8080:80 -p 8443:443 myapp
在这个例子中,应用程序在8080和8443端口被测试,这对应于生产环境中的标准端口。
7.4 额外建议
1. 端口保护
当你转发端口时,别忘了安全问题。开放的端口可能会成为攻击目标。只转发真正需要的端口,并使用防火墙来限制访问。
2. 防火墙和NAT
为了增强保护和管理流量,使用防火墙和Network Address Translation (NAT)。这会限制对你服务的访问并控制网络连接。
3. 监控和日志
配置监控和日志收集,来跟踪转发端口的流量。这会帮助你更快发现和应对可疑活动。
GO TO FULL VERSION