Java 无法使用Docker容器名称连接到MySQL,但可以连接到localhost

Java 无法使用Docker容器名称连接到MySQL,但可以连接到localhost,java,mysql,spring-boot,docker,docker-compose,Java,Mysql,Spring Boot,Docker,Docker Compose,我无法使用连接字符串中的Docker容器名称连接到MySQL,但可以连接到localhost docker compose: mysql-docker-container: image: mysql:latest environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=test - MYSQL_PASSWORD=test ports: - 3306:3306

我无法使用连接字符串中的Docker容器名称连接到MySQL,但可以连接到localhost

docker compose:

 mysql-docker-container:
    image: mysql:latest
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
      - MYSQL_PASSWORD=test
    ports:
      - 3306:3306
    volumes:
      - /data/mysql

  app:
    image: app
    build:
      context: ./
      dockerfile: Dockerfile
    depends_on:
      - mysql-docker-container

links:
  - mysql-docker-container:mysql-docker-container
ports:
  - 9090:9090
volumes:
  - /data/p2c-app
environment:
  - DATABASE_HOST=mysql-docker-container
  - DATABASE_USER=testuser
  - DATABASE_PASWORD=testuser
  - DATABASE_NAME=test
  - DATABASE_PORT=3306

spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&allowPublicKeyRetrieval=true
上面的作品,但我想与容器名称如下-我得到连接被拒绝

spring.datasource.url=jdbc:mysql://mysql-docker-container:3306/test?useSSL=false&allowPublicKeyRetrieval=true

我做错了什么?

如果本地主机连接正常,您可以更新
/etc/hosts

127.0.0.1   localhost  mysql-docker-container
要检查是否可以从应用程序容器访问
mysql docker容器
,可以打开tty并ping

docker exec -it app_container_name bash
ping mysql-docker-container
一切正常。
数据库服务似乎已启动,但mysql正在启动过程中。
然后应用程序服务启动,无法访问数据库

对于这种情况,有一些解决办法。
但最简单的一点是,您可以将下面的内容添加到应用程序服务中

restart: on-failure

请注意,
dependens_on
部分仅表示docker容器上下文中的内容,而不是底层服务中的内容。

问题作者不想连接到localhost-他们的应用程序和数据库正确地位于不同的容器中。他们想从一个容器连接到另一个容器。我想他是想从spring boot framework
spring.datasource.url
啊,抱歉-我明白你的意思-你是说他/她想从主机连接,而不是从容器连接。是的,这可以解释为什么localhost可以工作,以及为什么他们不需要更改它。(我已经对你的帖子做了澄清,如果不是你的意思,请重新编辑)。伙计们,我不想连接到localhost,而是从docker容器。这应该清楚地解释:jdbc:mysql://mysql-docker-container:3306/Are 您是否在容器中运行spring应用程序?当您“上述操作正常”时(参考
mysql://localhost:3306
),你在哪里运行?这将在您的主机上运行,因为您已经发布了端口,但我假设您希望从
应用程序
容器建立连接。