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 文件中删除端口映射。
我在容器上有一个 运行 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 文件中删除端口映射。