如何实现本地主机与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. 验证并应用配置
- 重启容器:执行
docker-compose down && docker-compose up -d - 本地测试:用数据库客户端连接
db:1433,确认能正常访问数据库 - 容器内测试:进入app容器执行
docker exec -it <你的app容器名称> bash,然后用telnet db 1433测试连接,能通就说明解析正常 - 修改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
相关产品推荐
相关产品推荐

