首页 > 解决方案 > 无法在 docker 上连接 Java 和 MySQL

问题描述

当我运行 docker compose 时,它​​返回错误

引起:java.net.ConnectException:连接被拒绝(连接被拒绝)

我对码头工人没有太多经验..我做错了什么?

我的码头工人撰写:

version: '3.5'

services:
  mysql-service:
    image: mysql:5.7
    networks:
      - phonebook-network
    environment:
      - MYSQL_ROOT_PASSWORD=admin
      - MYSQL_USER=admin
      - MYSQL_PASSWORD=admin
      - MYSQL_DATABASE=PhoneBook

    restart: on-failure

  phonebook-service:
    build:
      context: ./
      args:
        JAR_FILE: ./Phonebook-0.0.1-SNAPSHOT.jar
    ports:
      - "8080:8080"
    environment:
      - DB_HOST=jdbc:mysql://mysql-service:3306/PhoneBook?useTimezone=true&serverTimezone=UTC&useSSL=false
      - DB_USERNAME:admin
      - DB_PASSWORD:admin
    networks:
      - phonebook-network
    depends_on:
      - mysql-service

    restart: on-failure

networks:
  phonebook-network:
    driver: bridge

我的码头文件:

FROM openjdk:11-jdk-slim
VOLUME /phoneBook
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

标签: javamysqldockerdocker-compose

解决方案


首先,确保端口也在 MySQL 中公开:

services:
  mysql-service:
    image: mysql:5.7
    networks:
      - phonebook-network
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=admin
      - MYSQL_USER=admin
      - MYSQL_PASSWORD=admin
      - MYSQL_DATABASE=PhoneBook

    restart: on-failure

“depends_on”配置不能解决容器启动顺序的问题?

是的,这depends_on确保了 MySQL 容器将在 Java 容器之前启动,但可能会发生 MySQL 本身需要很长时间才能引导,因此容器已准备好但内部进程尚未准备好。


如果问题仍然存在,这可能是一个可能的解决方案:docker_entrypoint.sh在项目的根目录下创建一个文件。这也假设容器已netcat安装。

#!/usr/bin/env bash

echo "Waiting for MySQL..."

# I'm assuming you're running it in a default port (3306)
until nc -vz "mysql-service" 3306; do
  >&2 echo "Waiting for MySQL to be available..."
  sleep 0.1
done

echo "MySQL started"

java -jar /app.jar

然后修改你的 Dockerfile:

FROM openjdk:11-jdk-slim
VOLUME /phoneBook
ARG JAR_FILE

RUN apt-get update --fix-missing \
    && apt-get install -y --no-install-recommends netcat \
    && rm -rf /var/lib/apt/lists/*

COPY ${JAR_FILE} app.jar
COPY ./docker_entrypoint.sh docker_entrypoint.sh
RUN chmod 100 docker_entrypoint.sh
ENTRYPOINT [ "./docker_entrypoint.sh" ]

我现在没有办法测试这个,但让我知道这是否有效。


推荐阅读