如何为JavaSpringBoot和MySql设置Docker容器
我无法让运行JavaSpringBootAPI层的Docker容器与运行MySql数据库的Docker容器通信 1) 我创建了MySql映像,如下所示:如何为JavaSpringBoot和MySql设置Docker容器,java,mysql,spring,docker,connect,Java,Mysql,Spring,Docker,Connect,我无法让运行JavaSpringBootAPI层的Docker容器与运行MySql数据库的Docker容器通信 1) 我创建了MySql映像,如下所示: docker run -d --name aname-mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=db -e MYSQL_USER=root -e MYSQL_PASSWORD=root mysql:5.7 ./gradlew build docker -x test
docker run -d
--name aname-mysql
-e MYSQL_ROOT_PASSWORD=root
-e MYSQL_DATABASE=db
-e MYSQL_USER=root
-e MYSQL_PASSWORD=root
mysql:5.7
./gradlew build docker -x test
docker run -d
-p 8080:8080 --name app-api
--link aname-mysql:mysql
-e DATABASE_HOST=aname-mysql
-e DATABASE_PORT:3306
-e DATABASE_NAME=db
-e DATABASE_USER=root
-e DATABASE_PASSWORD=root
com.app/my.api
2) 我为Java Spring Boot应用程序构建了Docker映像,如下所示:
docker run -d
--name aname-mysql
-e MYSQL_ROOT_PASSWORD=root
-e MYSQL_DATABASE=db
-e MYSQL_USER=root
-e MYSQL_PASSWORD=root
mysql:5.7
./gradlew build docker -x test
docker run -d
-p 8080:8080 --name app-api
--link aname-mysql:mysql
-e DATABASE_HOST=aname-mysql
-e DATABASE_PORT:3306
-e DATABASE_NAME=db
-e DATABASE_USER=root
-e DATABASE_PASSWORD=root
com.app/my.api
3) 我为Java Spring Boot应用程序创建了Docker容器,如下所示:
docker run -d
--name aname-mysql
-e MYSQL_ROOT_PASSWORD=root
-e MYSQL_DATABASE=db
-e MYSQL_USER=root
-e MYSQL_PASSWORD=root
mysql:5.7
./gradlew build docker -x test
docker run -d
-p 8080:8080 --name app-api
--link aname-mysql:mysql
-e DATABASE_HOST=aname-mysql
-e DATABASE_PORT:3306
-e DATABASE_NAME=db
-e DATABASE_USER=root
-e DATABASE_PASSWORD=root
com.app/my.api
4) 我的Dockerfile看起来像这样
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Dspring.profiles.active=container", "-jar","/app.jar"]
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}?autoReconnect=true&useSSL=false
username: ${DATABASE_USER}
password: ${DATABASE_PASSWORD}
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
hibernate:
ddl-auto: validate
show_sql: true
5) 我的application-container.yml文件如下所示
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Dspring.profiles.active=container", "-jar","/app.jar"]
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}?autoReconnect=true&useSSL=false
username: ${DATABASE_USER}
password: ${DATABASE_PASSWORD}
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
hibernate:
ddl-auto: validate
show_sql: true
运行这些命令,然后输入
http://localhost:8080/api/users
我收到一个错误,说明站点拒绝连接,并且只显示默认的浏览器错误页面。请告诉我我做错了什么。谢谢。将两个应用程序放入docker compose,并通过它们的docker名称相互引用。将两个应用程序放入docker compose,并通过它们的docker名称相互引用。创建docker-compose.yaml并放入以下内容
version: '2'
services:
database:
container_name:db
restart: always
image: mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: example
java:
image: <YOUR JAVA IMAGE>
links:
- "database"
尝试从java通过localhost:3306连接到它
或获取db容器的ip:
docker inspect db
查找公共ip,然后连接到它创建一个docker-compose.yaml并放置以下内容
version: '2'
services:
database:
container_name:db
restart: always
image: mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: example
java:
image: <YOUR JAVA IMAGE>
links:
- "database"
尝试从java通过localhost:3306连接到它
或获取db容器的ip:
docker inspect db
查找公共ip,然后连接到它我刚刚注意到一个输入错误。我用冒号代替了DATABASE_PORT=3306。通过此更正,Java Spring引导容器现在链接到MySql容器并正常工作。我刚刚注意到一个输入错误。我用冒号代替了DATABASE_PORT=3306。通过此更正,Java Spring引导容器现在链接到MySql容器,并且可以正常工作。您的MySql容器没有暴露任何端口,因此基本上无法从外部访问。要么将端口3306公开为外部端口,要么创建一个docker compose文件,以便两个容器共享网络,这样您就可以通过容器名称引用它们,而不需要对外公开端口。您的mysql容器没有公开任何端口,因此从外部基本上无法访问。将端口3306公开为外部端口,或者创建一个docker compose文件,以便两个容器共享网络,这样您就可以通过容器名称引用它们,而不需要对外公开端口。我的docker文件应如何更改以适应docker-compose.yml?谢谢。你不需要在Dockerfile中更改任何内容,它应该像Docker compose一样为我工作。我收到的错误消息是错误:对于c6a25cdaa43d_aname-mysql,无法启动服务数据库:驱动程序未能在端点aname mysql上编程外部连接。我尝试删除所有图像和容器,然后重新开始。据我所知,没有端口冲突。我的步骤是1)删除图像和容器(mysql和OpenJDK2除外)。/gradlew build docker 3)docker compose up。然后出现上述错误。有什么想法吗?谢谢。或者只需将数据库服务编辑为以下内容:
image:mysql端口:-3306:3306重新启动:始终环境:mysql\u ROOT\u密码:示例
database:container\u名称:aname mysql图像:mysql:5.7端口:-3306:3306环境:-mysql\u ROOT\u密码=ROOT-MYSQL\u DATABASE=bgdb-MYSQL\u USER=root-MYSQL\u PASSWORD=root-banking-api:image:com.abcd/my.api依赖于:-数据库端口:-8080:8080环境:-数据库\u主机=数据库-数据库\u USER=root-DATABASE\u PASSWORD=root-DATABASE\u NAME=bgdb-数据库\u端口=3306我的是否更改docker文件以适应docker-compose.yml?谢谢。你不需要在Dockerfile中更改任何内容,它应该像Docker compose一样为我工作。我收到的错误消息是错误:对于c6a25cdaa43d_aname-mysql,无法启动服务数据库:驱动程序未能在端点aname mysql上编程外部连接。我尝试删除所有图像和容器,然后重新开始。据我所知,没有端口冲突。我的步骤是1)删除图像和容器(mysql和OpenJDK2除外)。/gradlew build docker 3)docker compose up。然后出现上述错误。有什么想法吗?谢谢。或者只需将数据库服务编辑为以下内容:image:mysql端口:-3306:3306重新启动:始终环境:mysql\u ROOT\u密码:示例
database:container\u名称:aname mysql图像:mysql:5.7端口:-3306:3306环境:-mysql\u ROOT\u密码=ROOT-MYSQL\u DATABASE=bgdb-MYSQL\u USER=root-MYSQL\u PASSWORD=root-banking-api:image:com.abcd/my.api依赖于:-数据库端口:-8080:8080环境:-数据库\u主机=数据库-数据库\u USER=root-DATABASE\u PASSWORD=root-DATABASE\u NAME=bgdb-数据库\u端口=3306您能给我一些建议吗举个例子?你能举个例子吗?