Spring boot 如何将docker容器中的java应用程序与另一个容器中的数据库连接?

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

我有一个简单的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\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
已删除(不是必需的)<代码>命令