docker 中的多容器连接

Multi Container Connection in docker

我已经使用 spring-boot 和 MySQL 构建了一个 CRUD 应用程序,MySQL 在 docker 中并且我能够从本地连接并且我的应用程序是在职的。但是当 我尝试在 docker 中部署 Spring-boot 应用程序时,它现在无法连接到 Docker MySQL.

## Spring application.properties

server.port=8001

# MySQL Props
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto = create
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:9001}/${MYSQL_DATABASE:test-db}
spring.datasource.username=${MYSQL_USER:admin}
spring.datasource.password=${MYSQL_PASSWORD:nimda}
##Dockerfile

FROM openjdk:11

RUN apt-get update

ADD target/mysql-crud-*.jar mysql-crud.jar

ENTRYPOINT ["java", "-jar", "mysql-crud.jar"]
## docker-compose.yml

version: '3.9'

services:
  dockersql:
    image: mysql:latest
    restart: always
    container_name: dockersql
    ports:
      - "3306:3306"
    env_file: .env
    environment:
      - MYSQL_DATABASE=$MYSQL_DATABASE
      - MYSQL_USER=$MYSQL_USER
      - MYSQL_PASSWORD=$MYSQL_PASSWORD
      - MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
    networks:
      - crud-network

  mycrud:
    depends_on:
      - dockersql
    restart: always
    container_name: mycrud
    env_file: .env
    environment:
      - MYSQL_HOST=dockersql:3306
      - MYSQL_DATABASE=$MYSQL_DATABASE
      - MYSQL_USER=$MYSQL_USER
      - MYSQL_PASSWORD=$MYSQL_PASSWORD
      - MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
    build: .
    networks:
      - crud-network

networks:
  crud-network:
    driver: bridge
# .env file

MYSQL_DATABASE=test-db
MYSQL_USER=admin
MYSQL_PASSWORD=nimda
MYSQL_ROOT_PASSWORD=nimda

谁能帮帮我?

我发现在 MySQL 完全启动和 运行 之前,我的 spring 启动尝试连接 MySQL,这导致了错误。

添加后

mycrud:
    depends_on:
      - dockersql
    container_name: mycrud
    restart: on-failure

它解决了我的问题。

最好为 MySQL 添加健康检查,并使其成为 spring 启动的条件

dockersql:
  healthcheck:
    test: [ "CMD-SHELL", 'mysql --user=${MYSQL_USER} --database=${MYSQL_DATABASE} --password=${MYSQL_PASSWORD} --execute="SELECT count(table_name) > 0 FROM information_schema.tables;"' ]

mycrud:
  depends_on:
    dockersql:
      condition: service_healthy

也可以修改 --execute 以包括 application-specific 健康检查。例如,检查特定的 table 它是否存在。