欢迎光临
我们一直在努力

Docker端口如何只允许本机访问

使用 Docker 部署网站、监控面板或管理后台后,很多人会通过 Nginx 配置域名和 HTTPS。

但配置完成后,可能发现一个问题:

通过域名可以访问,通过“服务器公网 IP 加应用端口”也能直接打开页面。

如果希望应用统一通过反向代理访问,可以将 Docker 的宿主机端口绑定到 127.0.0.1,让宿主机上的代理程序继续连接,同时取消该端口在公网地址上的直接发布。

本文以 Linux 服务器上的 Docker Compose 为例,说明具体配置和验证方法。

1. 先看懂端口映射的三个位置

常见的 Compose 配置如下:

ports:
  - "18080:80"

这表示将宿主机的 18080 端口映射到容器的 80 端口。

在没有修改 Docker 默认绑定设置的情况下,省略宿主机 IP 会向所有宿主机接口发布端口,可能包含公网接口。公网最终能否连接,还取决于网络和访问规则。

如果只需要宿主机访问,应改成:

ports:
  - "127.0.0.1:18080:80"

三个位置分别表示:

配置内容含义
127.0.0.1绑定宿主机的 IPv4 回环地址
18080宿主机上的访问端口
80容器内部服务实际使用的端口

修改后,宿主机上的程序通过下面的地址访问:

http://127.0.0.1:18080

这三个位置分别控制绑定地址、宿主机端口和容器端口。

2. 操作前检查Docker环境

本文适用于常规 Linux Docker Engine 的 bridge/NAT 网络,不适用于直接照搬到 host、macvlan 或已配置特殊直连路由的环境。

先在服务器终端检查:

docker version
docker compose version

建议使用仍受维护的 Docker 版本。Docker 官方说明,低于 28.0.0 的版本曾存在同一二层网络中的其他主机可以访问 localhost 发布端口的问题,因此旧版本应先安排升级。

尚未安装 Docker,可以参考本站:

服务器上安装Docker和Docker Compose教程

上述早期文章中的 Compose 部分使用旧版 docker-compose。本文使用新版插件形式的:

docker compose

对于已经配置 Docker 官方软件源的 Debian 或 Ubuntu,可以安装插件:

sudo apt-get update
sudo apt-get install -y docker-compose-plugin
docker compose version

其他安装情况可参考 Docker官方Compose插件安装说明。

如果需要独立的测试环境,也可以使用莱卡云 Linux 云服务器,先验证端口设置,再应用到正式业务。

查看官网购买链接: https://www.lcayun.com

9折优惠码:bloglcayun

3. 创建一个仅本机访问的测试容器

下面使用 Nginx 默认页面验证效果,不需要提前准备域名。

在服务器终端创建独立测试目录:

mkdir -p ~/docker-local-demo
cd ~/docker-local-demo

创建 Compose 文件:

cat > compose.yaml <<'EOF'
services:
  web:
    image: nginx:alpine
    restart: unless-stopped
    ports:
      - "127.0.0.1:18080:80"
EOF

检查配置:

docker compose config --quiet

没有报错后启动:

docker compose up -d
docker compose ps

这里的 18080 是示例宿主机端口。如果已经被其他服务占用,可以更换为一个空闲端口,并同步修改后面的测试命令。

容器内部的 80 是本例 Nginx 的服务端口。换成其他应用时,应根据该应用实际监听的端口填写。

4. 已有项目怎么修改?

如果原来的业务配置是:

ports:
  - "18080:80"

将这一条替换成:

ports:
  - "127.0.0.1:18080:80"

注意是替换原来的映射,不是在下面再增加一条。

如果同时保留原来的公网映射,限制就没有达到预期效果。

修改前,应确认重要数据已经通过挂载目录或数据卷持久化,并做好必要备份。端口配置变化通常需要重建容器,可能产生短暂的服务中断。

进入实际业务项目目录,执行:

docker compose config --quiet
docker compose up -d

docker compose up -d 会根据服务配置变化更新相关容器。只执行 docker compose restart,不会应用新的端口映射。

如果项目使用多个 Compose 文件或 .env 变量,还应在本机检查:

docker compose config

确认最终配置中没有遗留其他公网映射。该输出可能包含密码等配置,不要直接公开。

检查和启动时,应使用与原项目相同的 -f、-p、--env-file 等参数,避免操作到另一个项目。

环境变量的使用方法可以参考本站:

Docker Compose .env环境变量配置教程

5. 怎么确认公网不能直接访问?

验证时应同时检查实际映射、本机访问和外部访问。

5.1 查看实际端口映射

在第3节的测试目录中执行:

docker compose port web 80

按照本文配置,预期返回:

127.0.0.1:18080

这里的 web 是 Compose 服务名,80 是容器端口。检查其他项目时,需要替换成实际服务名和容器端口。

还可以查看所有运行容器的端口:

docker ps --format 'table {{.Names}}\t{{.Ports}}'

重点确认目标端口没有同时出现:

0.0.0.0:18080

或:

[::]:18080

这类面向所有地址的发布记录。

5.2 在服务器本机测试

在服务器终端执行:

curl --noproxy '*' -I \
  --connect-timeout 5 \
  --max-time 10 \
  http://127.0.0.1:18080/

本例 Nginx 正常运行时,预期能够获得 HTTP 响应。

如果本机也无法连接,先检查容器状态和日志:

docker compose ps
docker compose logs --tail 50 web

这里的 127.0.0.1 指服务器自己。在你自己的电脑浏览器里输入这个地址,访问的是自己的电脑。

5.3 从另一台电脑测试

在自己的 Windows PowerShell 中执行:

Test-NetConnection -ComputerName 203.0.113.10 -Port 18080

其中 203.0.113.10 是示例 IP,必须替换为服务器实际公网 IP。

如果该公网入口确实无法建立 TCP 连接,应看到:

TcpTestSucceeded : False

但一次外部测试失败,也可能受到安全组或网络故障影响,所以需要结合前面的实际映射和本机测试一起判断。

如果服务器还有公网 IPv6,也要检查是否存在额外的 IPv6 端口映射,并验证对应入口。

6. 设置后,Nginx反向代理怎么连接?

需要根据 Nginx 运行的位置选择上游地址。

Nginx安装在宿主机

例如宝塔中的 Nginx,或直接安装在服务器系统里的 Nginx,可以继续连接:

http://127.0.0.1:18080

在已经配置好的站点中,反向代理目标使用这个地址即可。

对应的 Nginx 上游配置形式为:

proxy_pass http://127.0.0.1:18080;

这样,用户仍可以通过已经配置好的域名访问,由宿主机 Nginx 将请求转发到本机映射端口。

限制应用端口直接访问,不会自动关闭反向代理提供的域名入口。 如果目标是让整个后台仅供内部使用,还需要为代理入口设置相应的访问限制。

Nginx也运行在容器中

如果 Nginx 和应用处于同一个 Docker 网络,通常可以直接通过服务名连接。

例如应用服务名为 web,容器内部监听 80:

proxy_pass http://web:80;

这种情况下,如果没有其他宿主机程序需要访问后端,后端服务通常可以不配置 ports,只由代理容器提供入口。

同一 Compose 网络中的服务可以通过服务名通信,容器间连接使用容器端口。

不要在普通 Nginx 容器里使用 127.0.0.1:18080 连接另一个容器,因为这个地址指向 Nginx 容器自身。

这部分区别可以继续参考本站:

Docker容器访问宿主机怎么配置?地址设置与连接排查

如果调整后域名出现502,可参考:

Nginx出现502 Bad Gateway怎么办?常见原因与排查教程

7. 常见问题

只在UFW里禁止端口可以吗?

不要仅凭 UFW 显示已禁止,就认定 Docker 发布端口一定无法访问。

Docker 的端口转发可能在流量进入 UFW 常用的处理链之前发生。官方文档明确说明了两者的兼容性问题。

对于只供宿主机使用的端口,优先明确绑定到 127.0.0.1,再检查实际映射和外部连接结果。

绑定127.0.0.1后,其他容器还能访问吗?

可能可以。

这项设置限制的是宿主机端口的发布地址,不等于隔离容器之间的网络。同一 Docker 网络中的其他容器,仍可能通过服务名或容器 IP 访问应用。

如果需要限制容器之间的通信,应进一步规划 Docker 网络。

容器内应用也要改成监听127.0.0.1吗?

通常不需要照着修改。

宿主机端口绑定地址与容器内应用监听地址,是两个不同的设置。

在常规 bridge 网络下,容器内的 Web 应用通常需要监听容器网络接口,例如 0.0.0.0:80,才能接收端口转发过来的请求。

如果把应用改成只监听容器内部的 127.0.0.1,反而可能导致映射端口无法连接。

测试容器用完怎么停止?

仅针对第3节创建的独立测试项目,执行:

cd ~/docker-local-demo
docker compose down

这会移除该测试项目的容器和默认网络。

8. 结语

Docker 应用只需要被宿主机访问时,可以将端口映射写成:

ports:
  - "127.0.0.1:18080:80"

修改后重新应用 Compose 配置,再依次检查实际映射、服务器本机访问和外部电脑连接结果。

如果反向代理运行在宿主机,连接本机映射端口;如果代理和应用都运行在同一 Docker 网络,优先通过服务名和容器端口通信。

把宿主机端口发布、容器内部监听和反向代理入口分清,才能准确控制应用的访问范围。

赞(0)
未经允许不得转载:莱卡云 » Docker端口如何只允许本机访问