Spring boot 如何将docker容器中的java应用程序与另一个容器中的数据库连接?
我有一个简单的Springboot应用程序连接到两个不同的SQL Server数据库。当它们都在本地托管时,我就没有问题了。但我需要将它们分别放在一个单独的docker容器中,当我这样做时,在Springboot应用程序的开始处会出现一个SQLServerException,告诉我:Spring boot 如何将docker容器中的java应用程序与另一个容器中的数据库连接?,spring-boot,docker,docker-networking,Spring Boot,Docker,Docker Networking,我有一个简单的Springboot应用程序连接到两个不同的SQL Server数据库。当它们都在本地托管时,我就没有问题了。但我需要将它们分别放在一个单独的docker容器中,当我这样做时,在Springboot应用程序的开始处会出现一个SQLServerException,告诉我: com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host '172.21.0.3', port 1434
com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host '172.21.0.3', port 1434 has failed. Error: "'172.21.0.3'. Verify the connection properties.
其中,172.21.0.3
是我的一个数据库的IP,1434
是它的端口
我使用一个名为network\u gls
(似乎不起作用)的docker网络将我的容器(gls\u app
,mssql\u 1
&mssql\u 2
)连接在一起,当我执行以下操作时:
docker inspect network_gls
(注意:此行的执行在Springboot应用程序容器启动之后&在它出错之前)
我得到以下结果:
[
{
"Name": "network_gls",
"Id": "88895acb2247b3b63b0cc29656fcb6d1a0d4a8192a8c7c1bb7b79362509e0742",
"Created": "2020-09-28T15:21:39.995019917Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.21.0.0/16",
"Gateway": "172.21.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0754d8766736806549e99500c143420c556e9370c14f897f6beb82c24a3c1124": {
"Name": "mssql_1",
"EndpointID": "6d886cf8f2aed256d8cbc7141d9ea5242f7ce61d95ae5412c16905d1b490f133",
"MacAddress": "02:42:ac:15:00:02",
"IPv4Address": "172.21.0.2/16",
"IPv6Address": ""
},
"54d20a9a409053eaf53eb5c7e73e340ab29c12ceaf8ac20b109d1403cba0c3d3": {
"Name": "mssql_2",
"EndpointID": "e675f72fc6c737201a31dd485496e749d386165eaa90a6647e0bf13507683028",
"MacAddress": "02:42:ac:15:00:03",
"IPv4Address": "172.21.0.3/16",
"IPv6Address": ""
},
"7e4ae1a46358fe9081c5277cb52ec49681b44631d6d9c1cdcaf6116326277d37": {
"Name": "gls_app",
"EndpointID": "d9051cd0134f5074b2b756b44b60cced85d2cac2fd04653e0f52ddb9ada339b9",
"MacAddress": "02:42:ac:15:00:04",
"IPv4Address": "172.21.0.4/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
在我的Springboot应用程序中,我的连接字符串如下所示(mssql_2中的数据库示例):
docker网络方面对我来说是新的,如果我在这个问题中遗漏了重要信息,请告诉我
提前感谢在我的例子中,当我使用容器名称而不是IP地址时,它确实有效。 因此,不是:
jdbc:sqlserver://172.21.0.3:1433;DatabaseName=gls
试试这个:
jdbc:sqlserver://mssql_2:1433;DatabaseName=gls
如果你想测试你的网络是否有问题,你也可以尝试发布你的端口。
在我的例子中,当我使用容器名称而不是IP地址时,它确实起作用。 因此,不是:
jdbc:sqlserver://172.21.0.3:1433;DatabaseName=gls
试试这个:
jdbc:sqlserver://mssql_2:1433;DatabaseName=gls
如果你想测试你的网络是否有问题,你也可以尝试发布你的端口。
编辑:感谢David指出不需要容器名称。它可以使用服务名称进行连接 您可以创建docker compose并使用它启动DB。下面给出了您使用的docker compose和application.properties的示例 从另一个容器连接到db时,可以使用docker服务名称。要从localhost进行连接,在大多数情况下,端口被公开为
port:port
,可以作为localhost进行访问
docker-compose build web .
docker-compose up db
docker-compose up web
或
docker编写
- 当不从容器访问localhost时,可以使用localhost
Docker编写文件
version: "3.3"
services:
web:
build:
context: ./
dockerfile: Dockerfile
image: web:latest
ports:
- 8080:8080
environment:
POSTGRES_JDBC_USER: UASENAME
POSTGRES_JDBC_PASS: PASSWORD
SPRING_DATASOURCE_URL: "jdbc:postgresql://db:5432/DATABASE"
SPRING_PROFILES_ACTIVE: dev
command: mvn spring-boot:run -Dspring.profiles.active=dev
depends_on:
- db
- rabbitmq
db:
image: "postgres:9.6-alpine"
ports:
- 5432:5432
expose:
- 5432
volumes:
- postgres:/var/lib/postgresql/data
environment:
POSTGRES_USER: USERNAME
POSTGRES_PASSWORD: PASSWORD
POSTGRES_DB: DATABASE
volumes:
postgres:
app:
这是应用程序属性(用于本地开发):
希望这会有答案。编辑:感谢David指出不需要容器名称。它可以使用服务名称进行连接
您可以创建docker compose并使用它启动DB。下面给出了您使用的docker compose和application.properties的示例
从另一个容器连接到db时,可以使用docker服务名称。要从localhost进行连接,在大多数情况下,端口被公开为port:port
,可以作为localhost进行访问
docker-compose build web .
docker-compose up db
docker-compose up web
或
docker编写
- 当不从容器访问localhost时,可以使用localhost
Docker编写文件
version: "3.3"
services:
web:
build:
context: ./
dockerfile: Dockerfile
image: web:latest
ports:
- 8080:8080
environment:
POSTGRES_JDBC_USER: UASENAME
POSTGRES_JDBC_PASS: PASSWORD
SPRING_DATASOURCE_URL: "jdbc:postgresql://db:5432/DATABASE"
SPRING_PROFILES_ACTIVE: dev
command: mvn spring-boot:run -Dspring.profiles.active=dev
depends_on:
- db
- rabbitmq
db:
image: "postgres:9.6-alpine"
ports:
- 5432:5432
expose:
- 5432
volumes:
- postgres:/var/lib/postgresql/data
environment:
POSTGRES_USER: USERNAME
POSTGRES_PASSWORD: PASSWORD
POSTGRES_DB: DATABASE
volumes:
postgres:
app:
这是应用程序属性(用于本地开发):
希望这能解决问题。如何启动3个容器docker compose
?@DuyPhan我使用docker compose up
作为我的数据库和docker run
作为Springboot应用程序,你认为这可能是个问题吗?你有没有阅读过背景资料,比如docker文档中的内容?您能否提供一个包括docker compose.yml
和完整的docker run
命令的命令?(如果您不docker在网络上运行--net
,它将不起作用;docker-inspect
查找容器的IP地址通常是不必要的或最佳做法。)如何启动3个容器docker compose
?@DuyPhan我使用docker compose up
作为我的数据库和docker run
作为Springboot应用程序,你认为这可能是个问题吗?你有没有阅读过背景资料,比如docker文档中的内容?您能否提供一个包括docker compose.yml
和完整的docker run
命令的命令?(如果您没有docker在网络上运行--net
,它将不起作用;docker-inspect
查找其IP地址的容器通常是不必要的,或者是最佳做法。)这对我不起作用,仍然有相同的SQLServerException。如果是网络问题,您是否尝试发布端口以查看?数据库dockers是否正常运行?我建议发布数据库端口并尝试连接数据库客户端,以确认数据库服务器是否正常运行。要同时对这两个数据库进行测试,您需要为每个数据库使用映射到不同端口。e、 g.-p 1433:1433和-p 1434:1433是的,尝试了:docker compose-f./mssql_2.yml-p 1434:1434 up
我可以通过SQL Server Management Studioi连接到容器中运行的数据库,而我的另一个数据库是1433:1433。这对我不起作用,是否仍有相同的SQLServerExceptionId您试图发布端口以查看是否存在网络问题?数据库dockers是否正常运行?我建议发布数据库端口并尝试连接数据库客户端,以确认数据库服务器是否正常运行。要同时对这两个数据库进行测试,您需要为每个数据库使用映射到不同端口。e、 g.-p 1433:1433和-p 1434:1433是的,尝试了:docker compose-f./mssql_2.yml-p 1434:1434 up
我可以使用SQL Server管理研究连接到容器中运行的数据库,而我的另一个数据库位于1433:1433。您无需指定链接:
,容器名称:
,或命令:
在典型使用中。数据库URL将不是localhost
:在Docker中,它几乎总是表示“此容器”,因此它将导致Spring容器连接到Spring容器,而不是数据库容器。@David-links
已删除(不是必需的)<代码>命令