如何通过公网IP访问远程服务器上的Docker化应用?
解决方案:通过远程服务器IP对外开放Docker化应用
一、配置文件调整
- 修正前端API地址
将my_frontend服务中的REACT_APP_API_SERVER值替换为服务器实际IPIP_Server_X,确保前端能正确请求到后端:
environment: - REACT_APP_API_SERVER=http://IP_Server_X:5000 # 替换为你的服务器IP
- 限制数据库对外暴露(安全建议)
当前配置中Postgres映射了54320:5432,数据库直接对外开放存在安全风险,建议删除这一行端口映射,仅保留Docker内部网络访问:
# 注释或删除此行 # ports: # - "54320:5432"
二、开放服务器端口
Linux防火墙配置(以ufw为例)
执行以下命令开放前端、后端、pgAdmin的对外端口:
sudo ufw allow 5173/tcp sudo ufw allow 5000/tcp sudo ufw allow 5555/tcp sudo ufw reload
iptables配置
如果使用iptables,执行:
sudo iptables -A INPUT -p tcp --dport 5173 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 5000 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 5555 -j ACCEPT sudo iptables-save > /etc/iptables/rules.v4
三、云服务器安全组配置(若使用云主机)
如果是阿里云、腾讯云等云服务器,需在控制台的安全组规则中添加入站规则,允许外部访问5173、5000、5555端口,否则即使服务器防火墙开放,外部也无法访问。
四、验证访问
启动Docker Compose服务:
docker-compose up -d
之后即可通过以下地址访问各服务:
- 前端:
http://IP_Server_X:5173 - 后端接口:
http://IP_Server_X:5000/你的接口路径 - pgAdmin:
http://IP_Server_X:5555
五、可选优化
- 使用Nginx反向代理,将前端和后端映射到80/443端口,避免暴露非标准端口,同时可配置HTTPS加密访问。
- 将前端API地址改为相对路径(如
/api),配合Nginx反向代理转发,避免IP变更后重新部署前端。
用户原始提问(中文翻译)
我已将包含backend(端口5000)、frontend(端口5173)、postgres(端口5432)、pgadmin(端口5555)四个服务的应用Docker化,将镜像推送至DockerHub后拉取到IP为IP_Server_X的远程服务器。现咨询如何通过该服务器IP将应用对外开放访问,以下是我的服务器docker-compose配置文件:
version: '2.3' services: my_frontend: image: username/frontend:v0 restart: always environment: - REACT_APP_API_SERVER=http://111.55.66.888:5000 # Server IP adress ports: - "5173:80" networks: - my_network env_file: - .env depends_on: - my_backend my_backend: image: username/backend:v0 env_file: - .env command: bash -c 'while !</dev/tcp/my_db/5432; do sleep 1; done; bash run.sh' restart: always ports: - "5000:5000" networks: - my_network depends_on: - my_db my_db: image: username/postgres:v0 env_file: - .env volumes: - /home/client/data:/var/lib/postgresql/data/pgdata restart: always ports: - "54320:5432" networks: - my_network healthcheck: test: ["CMD-SHELL", "pg_isready -U admin -d my_db"] interval: 10s timeout: 5s retries: 5 my_db_viewer: image: username/pgadmin:v0 env_file: - .env restart: always ports: - "5555:5555" networks: - my_network depends_on: - my_db networks: my_network: driver: bridge
内容的提问来源于stack exchange,提问作者Abdelouahed BEN MHAMED
相关产品推荐
相关产品推荐

