无法使用 docker 中的 jdbc 连接到 mysql

Unable to connect to mysql using jdbc in docker

我有以下 docker-撰写:

version: '3.1'
services:
  db:
    container_name: db
    image: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=world
    volumes:
      - ./mysql-db/:/docker-entrypoint-initdb.d
    networks:
      - my-network
  app:
    depends_on:
      - db
    container_name: app
    build: App/
    networks:
      - my-network
networks:
  my-network:
    driver: bridge

这将构建 mysql 图像并使用本地文件创建数据库。我可以通过主机上的数据库客户端连接到数据库。 我知道数据库是 运行 并在端口 3306.

上使用这些凭据

App/Dockerfile:

# Build stage
FROM maven:latest AS build
COPY src /app/src
COPY pom.xml /app
# need to assemble to package in plugins
RUN mvn -f /app/pom.xml clean compile assembly:single

# Package stage
FROM openjdk:latest
COPY --from=build /app/target/seMethods-1.0-jar-with-dependencies.jar /usr/local/lib/build.jar
ENTRYPOINT ["java", "-jar", "/usr/local/lib/build.jar"]

这将使用 maven 构建 jar 文件。

App/src/App.java


// sql imports
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class App 
{
  public static void main( String[] args )
  {
    try {
      String dbUrl = "jdbc:mysql://db:3306/world";
      Connection con = DriverManager.getConnection(dbUrl,"root","password");

      String testStatement = "SELECT * FROM city;";
      PreparedStatement preparedTest = con.prepareStatement(testStatement);
      ResultSet rs = preparedTest.executeQuery();

      while(rs.next()){
        System.out.println(rs.getRow());
      }

    } catch (Exception e) {
      // handle any errors
      System.out.println(String.format("Error: %s", e));
    }
  }
}

当我的 docker-compose 运行时,尽管我的应用停止并显示以下内容,但容器已创建:

Error: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

如何将我的 db 容器连接到 app

您正在尝试访问应用程序 docker 容器外的资源,但未在其上设置端口。默认情况下,您可能知道 docker 容器与系统隔离,因此您无法从容器内部访问端口 3306,而您可以从主机访问端口 3306。将端口添加到 docker 组合文件。

已解决。

创建数据库映像时,用于生成初始数据库的初始化文件需要几秒钟才能完成。在我的 java 应用程序的开头添加 Thread.sleep() 修补程序允许创建数据库表,然后我就可以连接了。