简体   繁体   English

Docker compose spring 启动无法连接到 mysql db

[英]Docker compose spring boot couldn't connect to mysql db

I have spring boot application which connects to mysql database.我有 spring 启动应用程序,它连接到 mysql 数据库。 If I run it locally in a classic way it works fine.如果我以经典方式在本地运行它,它可以正常工作。 But when I try do dockerise it - database starts successfully but the application doesn't see the DB.但是当我尝试 dockerise 它时 - 数据库成功启动但应用程序看不到数据库。

My Dockerfile:我的 Dockerfile:

FROM openjdk:11-jdk-slim
ADD start-local.sh /start-local.sh
RUN chmod +x start-local.sh
ENTRYPOINT [ "sh", "-c", "./start-local.sh" ]

My start-local.sh (I added it in order my application waited for database start):我的 start-local.sh (我添加它是为了让我的应用程序等待数据库启动):

#!/bin/sh

echo "Waiting for the database server to start"
echo "********************************************************"
apt-get update && apt-get install -y netcat
while ! nc -z mysql 3306; do sleep 3; done
echo "******** Database Server has started"
echo "Starting account service"
java -jar /mnt/service-2.4.0.jar

And finally my docker-compose.yml file:最后是我的 docker-compose.yml 文件:

version: '2'
services:
  mysql:
    image: mysql:5.7.23
    environment:
      - MYSQL_ROOT_PASSWORD=root
    entrypoint:
      sh -c "echo 'CREATE DATABASE IF NOT EXISTS books;  CREATE DATABASE IF NOT EXISTS notifications' > /docker-entrypoint-initdb.d/init.sql;/usr/local/bin/docker-entrypoint.sh --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --sql_mode="""
    ports:
      - "3306:3306"

  account_app:
    image: service_img
    environment:
      - "SPRING_PROFILES_ACTIVE=local"
    ports:
      - "8083:8083"
    volumes:
      - "/build/libs/:/mnt"

What I execute:我执行的是:

  • first of all, I build my service_img首先,我建立了我的 service_img
  • then I execute docker-compose up.然后我执行 docker-compose up。 In logs, I see database starting logs, after my application starting logs and then error:在日志中,我看到数据库启动日志,在我的应用程序启动日志之后,然后出现错误:

| | 2019-09-23 09:51:14.006 DEBUG [account-service,,,] 286 --- [ 2019-09-23 09:51:14.006 调试 [帐户服务,,,] 286 --- [
main] c.mlc.c.dpDatasourceConfiguration: Creating datasource主] c.mlc.c.dpDatasourceConfiguration:创建数据源
account_app_1 | account_app_1 | 2019-09-23 09:51:14.014 INFO [account-service,,,] 286 --- [ main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Starting... account_app_1 | 2019-09-23 09:51:14.014 INFO [account-service,,,] 286 --- [main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - 开始... account_app_1 | 2019-09-23 09:51:15.222 ERROR [account-service,,,] 286 --- [ main] com.zaxxer.hikari.pool.HikariPool: HikariPool-1 - Exception during pool initialization. 2019-09-23 09:51:15.222 错误 [account-service,,,] 286 --- [main] com.zaxxer.hikari.pool.HikariPool: HikariPool-1 - 池初始化期间出现异常。 account_app_1 | account_app_1 | account_app_1 | account_app_1 | com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure account_app_1 | com.mysql.cj.jdbc.exceptions.CommunicationsException:通信链路故障 account_app_1 | account_app_1 | account_app_1 | The last packet sent successfully to the server was 0 milliseconds ago.最后一个成功发送到服务器的数据包是 0 毫秒前。 The driver has not received any packets from the server.驱动程序没有收到来自服务器的任何数据包。 account_app_1 | account_app_1 | at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.15.jar:/.8.0.15] account_app_1 | at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.15.jar:/.8.0.15] account_app_1 | at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping:java.64) ~[mysql-connector-java-8.0.15:jar./.8.0.15] account_app_1 | at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping:java.64) ~[mysql-connector-java-8.0.15:jar./.8.0.15] account_app_1 | at com.mysql.cj.jdbc.ConnectionImpl:createNewIO(ConnectionImpl.java.835) ~[mysql-connector-java-8.0:15.jar./.8.0.15] account_app_1 | at com.mysql.cj.jdbc.ConnectionImpl:createNewIO(ConnectionImpl.java.835) ~[mysql-connector-java-8.0:15.jar./.8.0.15] account_app_1 | at com.mysql.cj.jdbc:ConnectionImpl.(ConnectionImpl.java.455) ~[mysql-connector-java-8:0.15.jar./.8.0.15] account_app_1 | at com.mysql.cj.jdbc:ConnectionImpl.(ConnectionImpl.java.455) ~[mysql-connector-java-8:0.15.jar./.8.0.15] account_app_1 | at com.mysql.cj:jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240) ~[mysql-connector-java-8.0.15.jar./.8.0.15] account_app_1 | at com.mysql.cj:jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240) ~[mysql-connector-java-8.0.15.jar./.8.0.15] account_app_1 | at com.mysql:cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver:java.199) ~[mysql-connector-java-8.0.15.jar./.8.0.15] The last packet sent successfully to the server was 0 milliseconds ago. at com.mysql:cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver:java.199) ~[mysql-connector-java-8.0.15.jar./.8.0.15] The last packet sent successfully to the server was 0 milliseconds前。 The driver has not received any packets from the server.驱动程序没有收到来自服务器的任何数据包。 account_app_1 | account_app_1 | at com.mysql:cj.jdbc.exceptions.SQLError:createCommunicationsException(SQLError.java.174) ~[mysql-connector-java-8.0.15.jar./.8.0.15] account_app_1 | at com.mysql:cj.jdbc.exceptions.SQLError:createCommunicationsException(SQLError.java.174) ~[mysql-connector-java-8.0.15.jar./.8.0.15] account_app_1 | at com:mysql.cj.jdbc.exceptions:SQLExceptionsMapping.translateException(SQLExceptionsMapping.java.64) ~[mysql-connector-java-8.0.15.jar./.8:0.15] account_app_1 | at com:mysql.cj.jdbc.exceptions:SQLExceptionsMapping.translateException(SQLExceptionsMapping.java.64) ~[mysql-connector-java-8.0.15.jar./.8:0.15] account_app_1 | at com.mysql.cj:jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java.835) ~[mysql-connector-java-8.0.15.jar./:8.0.15] account_app_1 | at com.mysql.cj:jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java.835) ~[mysql-connector-java-8.0.15.jar./:8.0.15] account_app_1 | at com.mysql:cj.jdbc.ConnectionImpl.(ConnectionImpl.java.455) ~[mysql-connector-java-8.0.15.jar:/.8.0.15] account_app_1 | at com.mysql:cj.jdbc.ConnectionImpl.(ConnectionImpl.java.455) ~[mysql-connector-java-8.0.15.jar:/.8.0.15] account_app_1 | at com:mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java.240) ~[mysql-connector-java-8.0.15:jar./.8.0:15] account_app_1 | at com:mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java.240) ~[mysql-connector-java-8.0.15:jar./.8.0:15] account_app_1 | at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java.199) ~[mysql-connector-java-8.0:15.jar./.8:0.15] account_app_1 | at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java.199) ~[mysql-connector-java-8.0:15.jar./.8:0.15] account_app_1 | at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource:java.136) ~[HikariCP-3.2.0:jar./.na] account_app_1 |在 com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource:java.136)~[HikariCP-3.2.0:Z68995FCBF40432492D140ZDna./DBa at com.zaxxer.hikari.pool.PoolBase:newConnection(PoolBase.java.369) ~[HikariCP-3.2:0.jar./.na] account_app_1 |在 com.zaxxer.hikari.pool.PoolBase:newConnection(PoolBase.java.369) ~[HikariCP-3.2:0.Z68995FCBF432492D15484ACD0]帐户at com.zaxxer.hikari.pool:PoolBase.newPoolEntry(PoolBase.java.198) ~[HikariCP-3:2.0.jar./.na] account_app_1 | at com.zaxxer.hikari.pool:PoolBase.newPoolEntry(PoolBase.java.198) ~[HikariCP-3:2.0.jar./.na] account_app_1 | at com.zaxxer.hikari:pool.HikariPool.createPoolEntry(HikariPool.java:467) ~[HikariCP-3.2.0.jar:/.na] account_app_1 | at com.zaxxer.hikari:pool.HikariPool.createPoolEntry(HikariPool.java:467) ~[HikariCP-3.2.0.jar:/.na] account_app_1 | at com.zaxxer.hikari.pool:HikariPool.checkFailFast(HikariPool.java.541) ~[HikariCP-3.2.0.jar./:na] account_app_1 |... 206 common frames omitted account_app_1 | at com.zaxxer.hikari.pool:HikariPool.checkFailFast(HikariPool.java.541) ~[HikariCP-3.2.0.jar./:na] account_app_1 |... 206 common frames omitted account_app_1 | Caused by.造成的。 com.mysql.cj:exceptions:CJCommunicationsException. com.mysql.cj:异常:CJCommunicationsException。 Communications link failure account_app_1 |通讯链路故障 account_app_1 | account_app_1 | account_app_1 | The last packet sent successfully to the server was 0 milliseconds ago.最后一个成功发送到服务器的数据包是 0 毫秒前。 The driver has not received any packets from the server.驱动程序没有收到来自服务器的任何数据包。 account_app_1 | account_app_1 | at java.base/jdk.internal.reflect:NativeConstructorAccessorImpl:newInstance0(Native Method) ~[na.na] account_app_1 |在 java.base/jdk.internal.reflect:NativeConstructorAccessorImpl:newInstance0(Native Method) ~[na.na] account_app_1 | at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl:java:62) ~[na.na] account_app_1 |在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl:java:62) ~[na.na] account_app_1 | at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl:java.45) ~[na.na] account_app_1 |在 java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl:java.45) ~[na.na] account_app_1 | at java.base/java:lang.reflect.Constructor.newInstance(Constructor.java.490) ~[na.na] account_app_1 |在 java.base/java:lang.reflect.Constructor.newInstance(Constructor.java.490) ~[na.na] account_app_1 | at com.mysql.cj:exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.15.jar./.8.0.15] account_app_1 | at com.mysql.cj:exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.15.jar./.8.0.15] account_app_1 | at com.mysql:cj.exceptions.ExceptionFactory.createException(ExceptionFactory:java.105) ~[mysql-connector-java-8.0.15.jar./.8.0.15] account_app_1 | at com.mysql:cj.exceptions.ExceptionFactory.createException(ExceptionFactory:java.105) ~[mysql-connector-java-8.0.15.jar./.8.0.15] account_app_1 | at com:mysql.cj.exceptions.ExceptionFactory:createException(ExceptionFactory.java.151) ~[mysql-connector-java-8.0.15.jar./.8.0.15] account_app_1 | at com:mysql.cj.exceptions.ExceptionFactory:createException(ExceptionFactory.java.151) ~[mysql-connector-java-8.0.15.jar./.8.0.15] account_app_1 | at com:mysql.cj.exceptions.ExceptionFactory:createCommunicationsException(ExceptionFactory.java.167) ~[mysql-connector-java-8.0.15.jar./.8:0.15] account_app_1 | at com:mysql.cj.exceptions.ExceptionFactory:createCommunicationsException(ExceptionFactory.java.167) ~[mysql-connector-java-8.0.15.jar./.8:0.15] account_app_1 | at com.mysql.cj:protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java.91) ~[mysql-connector-java-8.0.15.jar:/.8.0.15] account_app_1 | at com.mysql.cj:protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java.91) ~[mysql-connector-java-8.0.15.jar:/.8.0.15] account_app_1 | at com:mysql.cj.NativeSession.connect(NativeSession.java.152) ~[mysql-connector-java-8.0.15.jar:/.8.0.15] account_app_1 | at com:mysql.cj.NativeSession.connect(NativeSession.java.152) ~[mysql-connector-java-8.0.15.jar:/.8.0.15] account_app_1 | at com:mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:955) ~[mysql-connector-java-8.0.15.jar!/:8.0.15] account_app_1 |在 com:mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:955) ~[mysql-connector-java-8.0.15.jar!/:8.0.15] account_app_1 | at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825) ~[mysql-connector-java-8.0.15.jar!/:8.0.15] account_app_1 |在 com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825) ~[mysql-connector-java-8.0.15.jar!/:8.0.15] account_app_1 |
... 214 common frames omitted account_app_1 | ... 214 常见框架省略 account_app_1 | Caused by: java.net.ConnectException: Connection refused (Connection refused) account_app_1 |引起:java.net.ConnectException:连接被拒绝(连接被拒绝)account_app_1 | at java.base/java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:na] account_app_1 |在 java.base/java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:na] account_app_1 | at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399) ~[na:na] account_app_1 |在 java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399) ~[na:na] account_app_1 | at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242) ~[na:na] account_app_1 |在 java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242) ~[na:na] account_app_1 | at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) ~[na:na] account_app_1 |在 java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) ~[na:na] account_app_1 | at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403) ~[na:na] account_app_1 |在 java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403) ~[na:na] account_app_1 | at java.base/java.net.Socket.connect(Socket.java:591) ~[na:na] account_app_1 |在 java.base/java.net.Socket.connect(Socket.java:591) ~[na:na] account_app_1 | at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) ~[mysql-connector-java-8.0.15.jar:/.8.0.15] account_app_1 | at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) ~[mysql-connector-java-8.0.15.jar:/.8.0.15] account_app_1 | at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection:java.65) ~[mysql-connector-java-8.0.15:jar./.8.0.15] account_app_1 | at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection:java.65) ~[mysql-connector-java-8.0.15:jar./.8.0.15] account_app_1 |
... 217 common frames omitted account_app_1 | ... 217 常见框架省略 account_app_1 |

Any suggestions?有什么建议么?

When running a compose "stack", docker uses its own DNS mechanism.运行组合“堆栈”时,docker 使用自己的 DNS 机制。

This means that if you perform a DNS query inside of the account_app container for the hostname mysql , the query would return the IP address of the container named mysql (possibly prefixed with the stack name) This means that if you perform a DNS query inside of the account_app container for the hostname mysql , the query would return the IP address of the container named mysql (possibly prefixed with the stack name)

In short : Configure your Spring application to connect to a mysql db not on localhost but on mysql and you are good to go. In short : Configure your Spring application to connect to a mysql db not on localhost but on mysql and you are good to go.

There probably are some environmental variables which you could set to configure this.您可能可以设置一些环境变量来配置它。

There is a misconception on port mapping: you're passing all your traffic from host port 3306 to container port 3306, but that's not bidirectional.对端口映射存在误解:您将所有流量从主机端口 3306 传递到容器端口 3306,但这不是双向的。

To manage your situation, if you're on Linux (it does not works in Windows and Mac) you can add in your docker-compose.yml this configuration, allowing the container to use host services.为了管理您的情况,如果您使用的是 Linux(它在 Windows 和 Mac 中不起作用),您可以在 docker-compose.yml 中添加此配置,允许容器使用主机服务。

 network_mode: "host"

Otherwise you could setup your local MySql to accept connection from external IPs and point container database to your IP address.否则,您可以设置本地 MySql 以接受来自外部 IP 的连接并将容器数据库指向您的 IP 地址。

Please note that this solution would work fine only in local development machine, I strongly suggest to avoid this in any production environment.请注意,这个解决方案只能在本地开发机器上正常工作,我强烈建议在任何生产环境中避免这种情况。

I think you use "localhost" as mysql server hostname,我认为您使用“localhost”作为 mysql 服务器主机名,

jdbc:mysql://localhost:3306

try changing it to尝试将其更改为

jdbc:mysql://host.docker.internal:3306

You cannot localhost inside a docker container.您不能在 docker 容器内使用 localhost。 Best way to do this is by passing jdbc url as a environment variable.最好的方法是将 jdbc url 作为环境变量传递。

SPRING_DATASOURCE_URL=jdbc:mysql://host.docker.internal:3306/code_master

Please check the last 5 lines of this sh file, https://github.com/keaz/code_master/blob/develop/build_docker.sh请检查这个 sh 文件的最后 5 行, https://github.com/keaz/code_master/blob/develop/build_docker.sh

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM