我有一个简单的Springboot应用程序,它连接到两个不同的SQL Server数据库。当所有这些都托管在本地时,我没有问题。但是我需要将它们每个都放在一个单独的docker容器中,当我这样做时,我在Springboot应用程序的开头收到一个SQLServerException告诉我:
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_gls
的docker网络(似乎无效)将我的容器(gls_app
,mssql_1
和mssql_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
中的数据库示例):
jdbc:sqlserver://172.21.0.3:1433;DatabaseName=gls
docker网络方面对我来说是陌生的,告诉我我是否在这个问题上缺少重要信息
预先感谢
答案 0 :(得分:0)
就我而言,当我使用容器名称而不是IP地址时,它确实起作用。 所以代替:
jdbc:sqlserver://172.21.0.3:1433;DatabaseName=gls
尝试一下:
jdbc:sqlserver://mssql_2:1433;DatabaseName=gls
如果要测试网络连接是否有问题,也可以尝试发布端口。 https://docs.docker.com/config/containers/container-networking/
答案 1 :(得分:0)
编辑:感谢 David 指出不需要container_name。可以使用服务名称进行连接。
您可以创建一个docker compose并使用它来启动您的数据库。给出的是您使用的docker compose和application.properties的示例。
从另一个容器连接到db时,可以使用docker服务名称。要从本地主机连接,在大多数情况下,端口公开为port:port
,因此可以作为本地主机访问。
docker-compose build web .
docker-compose up db
docker-compose up web
或
docker-compose up
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:
这是应用程序属性(用于本地开发):
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.datasource.url=jdbc:postgresql://localhost:5432/database
spring.datasource.username=USERNAME
spring.datasource.password=PASSWORD
希望这会回答。