在Docker Compose中通过Traefik传递数据库服务URL至后端服务
解决Traefik配置中后端服务数据库URL的问题
你完全不需要用服务器公网IP来配置数据库地址,Docker Compose默认会为所有服务创建一个内部网络,服务之间可以直接通过服务名称互相访问,具体调整方案如下:
核心修改点
- 后端服务的数据库地址:直接用
surreal-db(数据库服务的名称)作为主机名,搭配SurrealDB的默认容器端口8000(注意不是你映射到主机的4400) - 移除不必要的端口映射:数据库服务不需要暴露端口到主机(除非你本地需要直接调试数据库)
- 可选:关闭数据库的外部访问路由:如果不需要外部访问数据库,删掉Traefik相关标签,降低安全风险
修改后的完整配置
version: '3.7' services: traefik: image: traefik:v2.5 command: - "--log.level=DEBUG" - "--api.insecure=true" - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--entrypoints.web.address=:80" - "--entrypoints.websecure.address=:443" - "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-v02.api.letsencrypt.org/directory" - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true" - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" - "--certificatesresolvers.letsencrypt.acme.email=my-email" - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/var/run/docker.sock - ./letsencrypt:/letsencrypt landing: image: rg.fr-par.scw.cloud/project1/project1-new-front:0.11 labels: - "traefik.enable=true" - "traefik.http.routers.landing.rule=Host(`www.project1.app`)" - "traefik.http.routers.landing.entrypoints=websecure" - "traefik.http.routers.landing.tls=true" - "traefik.http.routers.landing.tls.certresolver=letsencrypt" backend: platform: linux/arm64 image: myregistery/project1/project1-backend:latest labels: - "traefik.enable=true" - "traefik.http.routers.backend.rule=Host(`api.project1.app`)" - "traefik.http.routers.backend.entrypoints=websecure" - "traefik.http.routers.backend.tls=true" - "traefik.http.routers.backend.tls.certresolver=letsencrypt" environment: - USER=prod - DB_URL=http://surreal-db:8000 # 改为服务名+容器内部端口 - DB_PORT=8000 # 同步调整为容器内部端口 depends_on: - surreal-db surreal-db: image: surrealdb/surrealdb:latest user: root command: start --user root --pass root file:/project1-data/data volumes: - ./project1-data:/project1-data # 挂载本地目录持久化数据,避免容器删除数据丢失 # 移除对外端口映射,仅保留内部访问 # 如果不需要外部访问数据库,可删除下方Traefik标签 # labels: # - "traefik.http.routers.surrealdb.rule=Host(`surrealdb.docker.localhost`)"
补充说明
- Docker Compose会自动为所有服务创建默认内部网络,服务之间可直接通过服务名解析到对应容器IP,无需依赖公网IP
- 数据库的
4400:8000端口映射仅用于本地主机直接调试数据库,后端服务内部访问用容器的8000端口即可 - 给数据库添加数据卷挂载,能避免容器重启或删除后数据丢失
内容的提问来源于stack exchange,提问作者user1445685
相关产品推荐
相关产品推荐

