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

如何实现本地主机与App容器用相同数据库URL访问Docker DB容器

解决Docker容器间与本地主机使用同一数据库URL访问的问题

我来帮你搞定这个问题!核心原因其实是:本地主机的localhost和容器内部的localhost不是一回事——本地用localhost:1433是通过端口映射访问到db容器,但app容器里的localhost指的是容器自己,自然连不上db容器。下面是让两边用同一个URL访问的具体方案:

方案:利用Docker Compose内置DNS + 本地Hosts映射

1. 调整Docker Compose配置,启用服务名解析

首先去掉network_mode: bridge配置,因为默认情况下Docker Compose会创建一个自定义的bridge网络,这个网络自带DNS服务,能让容器直接通过服务名(也就是你定义的db)访问对方。

修改后的docker-compose.yml如下:

version: '3.3'
services:
  db:
    image: "mcr.microsoft.com/mssql/server:2017-latest"
    restart: always
    volumes:
      - db_data:/var/lib/mssql
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=Test123
    hostname: db
    ports:
      - "1433:1433"
  app:
    build: './testapp'
    volumes:
      - './system/build:/opt/tomcat/webapps/testapp/'
    ports:
      - "8080:8080"
      - "8009:8009"
    tty: true
    depends_on:
      - db
volumes:
  db_data:

2. 修改本地Hosts文件,让db域名指向本地

为了让本地主机也能用db:1433访问数据库,需要把db这个域名映射到本地回环地址:

  • Windows:编辑C:\Windows\System32\drivers\etc\hosts,添加一行:127.0.0.1 db
  • Linux/macOS:编辑/etc/hosts,添加一行:127.0.0.1 db

3. 验证并应用配置

  1. 重启容器:执行docker-compose down && docker-compose up -d
  2. 本地测试:用数据库客户端连接db:1433,确认能正常访问数据库
  3. 容器内测试:进入app容器执行docker exec -it <你的app容器名称> bash,然后用telnet db 1433测试连接,能通就说明解析正常
  4. 修改app的配置文件:把数据库URL改成db:1433,重启Tomcat后系统就能正常上线了

为什么要去掉network_mode: bridge?

当你指定network_mode: bridge时,容器会使用宿主机的默认bridge网络,这个网络没有Docker Compose提供的DNS服务,所以容器之间只能通过IP地址访问,没法用服务名。而Compose默认创建的自定义bridge网络自带DNS解析,服务名(比如db)会自动映射到对应容器的IP,这就能让app容器直接用db访问数据库了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:43:20