Docker 连接到 docker mysql (jdbc url)

Docker connecting to docker mysql (jdbc url)

我在容器上有一个 运行 MySQL 数据库,如下所示 (docker-compose):

version: '3'

services:

  my-database:
    image: mysql:latest
    volumes:
      - ./data:/docker-entrypoint-initdb.d
    container_name: db
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: admin
      MYSQL_DATABASE: MYDATABASE
    cap_add:
      - SYS_NICE
    ports:
      - "3308:3306"
    networks:
      - database

networks:
  database:
    external: true

当我 运行 我的应用程序时,我使用以下 jdbc url : jdbc:mysql://localhost:3308/DATABASE-NAME 并且它有效还不错。

现在我已经“docker化”了我的应用程序,但是当 运行 应用程序作为容器(连接到同一网络)具有相同的 jdbc url,docker化的应用程序无法连接到数据库。我不明白为什么。

这里是 docker-compose :

version: "3.8"

networks:
    database:
        external: true

services: 
    my-api:
        image: my-api:latest
        container_name: my-api
        ports:
            - "127.0.100.1:8080:8080"
        networks:
            - database

但是连接数据库失败

例外情况是:

Caused by: java.net.ConnectException: Connection refused

at java.base/sun.nio.ch.Net.pollConnect(Native Method)

at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:589)

at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542)

at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597)

at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:333)

at java.base/java.net.Socket.connect(Socket.java:648)

at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:156)

at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63)

我假设你的数据库网络是一个网桥网络。在这种情况下,网络上的容器可以使用它们的服务名称和容器公开的端口相互寻址。

在你的情况下,你的连接字符串应该是 jdbc:mysql://db:3306/DATABASE-NAME

db 是您为数据库容器指定的名称,3306 是容器公开的端口。

如果您不需要直接从主机访问数据库,您可以在docker-compose 文件中删除端口映射。