【问题标题】:How to set up Docker containers for Java Spring Boot and MySql如何为 Java Spring Boot 和 MySql 设置 Docker 容器
【发布时间】:2018-09-17 16:49:48
【问题描述】:

我无法让运行 Java Spring Boot Api 层的 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

2) 我为 Java Spring Boot 应用构建了 Docker 镜像,如下所示:

./gradlew build docker -x test

3) 我为 Java Spring Boot 应用创建了 Docker 容器,如下所示:

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"]

5) 我的 application-container.yml 文件如下所示

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

我收到一条错误消息,指出该站点拒绝连接并且只显示默认浏览器错误页面。请告诉我我做错了什么。谢谢。

【问题讨论】:

  • 您的 mysql 容器没有暴露任何端口,因此基本上无法从外部访问。要么将端口 3306 公开为外部端口,要么创建一个 docker-compose 文件,以便两个容器共享网络,以便您可以通过容器名称引用它们,而无需从外部公开端口。

标签: java mysql spring docker connect


【解决方案1】:

将两个应用程序放入一个 docker compose 中,并通过它们的 docker 名称相互引用。

【讨论】:

  • 你能举个例子吗?
【解决方案2】:

创建一个 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"

启动服务:

docker-compose up

尝试通过 localhost:3306 从 java 连接到它 或者获取db容器的ip:

docker inspect db

查找公共 ip 然后连接到它

【讨论】:

  • 应该如何更改我的 Dockerfile 以适应 docker-compose.yml?谢谢。
  • 你不需要更改 Dockerfile 中的任何内容,它应该像这样工作
  • docker-compose up 对我来说失败了。我收到的错误消息是 ERROR: for c6a25cdaa43d_aname-mysql 无法启动服务数据库:驱动程序在端点 aname-mysql 上编程外部连接失败。我尝试删除所有图像和容器,然后重新开始。据我所知,没有端口冲突。我的步骤是 1)删除图像和容器(除了 mysql 和 openjdk 2)./gradlew build docker 3)docker-compose up。然后出现上述错误。有什么想法吗?谢谢。
  • 或者只是将数据库服务编辑为以下内容:image: mysql ports: - 3306:3306 restart: always environment: MYSQL_ROOT_PASSWORD: example
  • 数据库:container_name:aname-mysql 映像:mysql:5.7 端口:- 3306:3306 环境:- MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=bgdb - MYSQL_USER=root - MYSQL_PASSWORD=root 银行-api:映像: com.abcd/my.api depends_on:- 数据库端口:- 8080:8080 环境:- DATABASE_HOST=database - DATABASE_USER=root - DATABASE_PASSWORD=root - DATABASE_NAME=bgdb - DATABASE_PORT=3306
【解决方案3】:

我刚刚注意到一个错字。我用冒号代替了 DATABASE_PORT=3306。通过此更正,Java Spring Boot 容器现在已链接到 MySql 容器并可以正常工作。

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 2019-06-10
    • 2019-04-12
    • 2021-04-04
    • 2018-11-28
    • 2021-11-22
    • 2019-11-24
    • 1970-01-01
    • 2017-11-10
    相关资源
    最近更新 更多