如何将Docker容器中的Java应用程序与另一个容器中的数据库连接?

时间:2020-09-30 10:06:52

标签: 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 has failed. Error: "'172.21.0.3'. Verify the connection properties.

172.21.0.3是我的数据库之一的IP,1434是端口。

我使用名为network_gls的docker网络(似乎无效)将我的容器(gls_appmssql_1mssql_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网络方面对我来说是陌生的,告诉我我是否在这个问题上缺少重要信息

预先感谢

2 个答案:

答案 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

希望这会回答。