如何为JavaSpringBoot和MySql设置Docker容器

如何为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

我无法让运行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 
-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您能给我一些建议吗举个例子?你能举个例子吗?