以下情况:
我有两个容器,一个带有一个带有一些表和内容的MySQL DB,另一个是带有springboot的容器,该容器启动了一个.war应用程序,该容器需要上述db并需要通向飞行通道。两者都使用docker-compose文件和单独的Dockerfile构建。
我怎样才能同时连接我的Springboot应用程序可以访问数据库?现在,我得到了错误:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
因为它仍然指向本地主机(应用程序容器),其中ofc不是mysql数据库。
spring.datasource.url: jdbc:mysql://#${db.hostname:localhost}:${db.port:3306}/${db.dbname:appdb}?useSSL=false&useUnicode=yes&characterEncoding=UTF-8
当我将db.hostname更改为网络的IP地址时,仍然出现错误。而且我不知道如何直接与容器“对话”。有什么想法怎么办?如果可能,它应该在Dockerfile,docker-compose文件或脚本中发生(大多数情况下是自动的,没有单独的“ docker run xxx-”命令)。该项目将查看该应用程序是否能够在docker环境中运行。
当我检查docker0(我猜是默认网桥?)端口3306是否打开(使用nmap)时,它已经打开。
docker-compose.yml
version: "3"
services:
mysqldb:
container_name: mysqldb
networks:
- app-mysql
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=app
build: ./mysql
volumes:
- datavolume:/var/lib/mysql
ports:
- "3306:3306"
app-sb:
container_name: app
build: ./app
networks:
- app-mysql
depends_on:
- mysqldb
links:
- mysqldb
volumes:
datavolume:
networks:
app-mysql:
driver: bridge
用于mysqldb的Dockerfile:
FROM mysql:5.7
COPY target/app-bck.sql /
ADD init_db.sh /tmp/init_db.sh
RUN /tmp/init_db.sh
springboot应用程序的Dockerfile:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY target/app.war /
COPY target/app.yaml /
RUN mkdir /etc/app
RUN mv app.yaml /etc/app/
RUN java -jar /app.war
/etc/app/app.yaml
baseUrl: https://app.web.site
db.hostname: mysqldb
db.port: 3306
db.name: app
db.username: app
db.password: somepw
mail.host: localhost
mail.sender: no-reply@web.site