通过Docker-Compose关联App与MySQL容器,如何用JDBC URL连接数据库?
如何在Docker Compose关联的应用容器中通过JDBC连接MySQL容器?
我通过docker-compose将两个Docker容器关联在一起,一个是应用Docker容器,另一个是MySQL容器。以下是我的docker-compose文件:
version: '3.1' services: db: image: mysql:latest environment: - 'MYSQL_USER=root' - 'MYSQL_ROOT_PASSWORD=claytablet-pw' ports: - '3306:3306' restart: always environment: MYSQL_ROOT_PASSWORD: claytablet-pw aem63: image: pulse/prepared-aem-6.3.1.1:3 restart: always depends_on: - 'db' ports: - '4502:4502' links: - 'db:db'
请问如何在我的应用中通过JDBC URL连接到MySQL容器中的数据库?
回答
嘿,这事儿其实挺简单的,Docker Compose已经帮你把网络打通了,直接用服务名就能搞定!
核心关键:用Docker Compose服务名作为MySQL主机地址
在同一个Docker Compose创建的专属网络里,每个服务的名称(这里是db)会被自动解析成对应容器的IP地址,完全不需要用localhost或者宿主机IP来连接。正确的JDBC URL格式
你可以直接套用下面的模板,把[你的数据库名]替换成你实际要连接的数据库名称就行:jdbc:mysql://db:3306/[你的数据库名]?useSSL=false&serverTimezone=UTC我给你拆解下各部分的作用:
db: 就是你docker-compose里MySQL服务的名字,Docker内置的DNS会自动把它映射到MySQL容器的内部IP3306: MySQL容器内部的默认端口,不用纠结宿主机映射的3306(虽然你配置了端口映射,但应用容器直接连容器内部端口更稳定)useSSL=false: 开发环境下可以关闭SSL要求,避免出现不必要的连接报错(生产环境建议开启)serverTimezone=UTC: 解决时区不匹配的问题,防止出现时间相关的连接失败
几个额外的小提醒
- 你的docker-compose里重复写了
environment字段,建议合并成一个,避免配置冲突,还能顺便加个自动创建初始数据库的配置:db: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: claytablet-pw # 启动时自动创建指定数据库,省得手动操作 MYSQL_DATABASE: [你的数据库名] ports: - '3306:3306' restart: always depends_on只是保证db容器先启动,但不代表MySQL服务已经完全就绪。如果你的应用启动太快,可能会碰到连接失败的情况。可以给应用加个重试连接的逻辑,或者用wait-for-it这类脚本等MySQL服务可用后再启动应用。- 权限方面不用担心,Docker的MySQL镜像默认允许
root用户从任何主机(%)连接,所以你的应用容器用root和密码claytablet-pw就能正常连接,不需要额外配置权限。
- 你的docker-compose里重复写了
内容的提问来源于stack exchange,提问作者Anthony Mofo
相关产品推荐
相关产品推荐

