You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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`)"

补充说明

  1. Docker Compose会自动为所有服务创建默认内部网络,服务之间可直接通过服务名解析到对应容器IP,无需依赖公网IP
  2. 数据库的4400:8000端口映射仅用于本地主机直接调试数据库,后端服务内部访问用容器的8000端口即可
  3. 给数据库添加数据卷挂载,能避免容器重启或删除后数据丢失

内容的提问来源于stack exchange,提问作者user1445685

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:09:59