【问题标题】:Docker compose doesn't connect two containersDocker compose 不连接两个容器
【发布时间】:2020-01-06 04:36:50
【问题描述】:

我有两个不相互连接的容器: 1.我做了一个从dump.sql获取数据的图片postgres 这是 Dockerfile:

FROM postgres:11.1-alpine
COPY restore_db.sh /docker-entrypoint-initdb.d/
COPY db.sql  /backup/
ENV PGDATA=/data
  1. 然后我用 docker run --name db -p 5432:5432 db 创建了容器

4.我用应用程序制作了一张图片。应用程序的 Dockerfile 如下所示:

# Set the working directory to /app

WORKDIR /app
# Copy the current directory contents into the container at /app
COPY build/libs/  /app/

# Make port 80 available to the world outside this container
EXPOSE 8085

# Define environment variable
ENV NAME app

# Run app when the container launches
CMD java -jar /app/olympic-0.0.1-SNAPSHOT.jar
  1. 我用run做了一个容器。

然后我使用 docker-compose up 文件看起来像:

version: '3'
services:
  db:
    image: db-data
    container_name: postgres
    ports:
      - 5432:5432
    volumes:
      - ./pg_data:/data
    environment:
      POSTGRES_DB: innovation
      POSTGRES_USER: postgres
      PGDATA: /data
      restart: always
  web:
    image: app
    container_name: roc
    environment:
      POSTGRES_HOST: db
    ports:
      - 8085:8085
    restart: always
    links:
      - db
```



here is property file:
```
 spring.datasource.url=jdbc:postgresql://db:5432/innovation
 spring.datasource.username=postgres
 spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
 logging.level.org.hibernate.SQL=DEBUG
 logging.level.root=INFO
 spring.output.ansi.enabled=ALWAYS
 logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

 spring.liquibase.change-log=classpath:liqubase/db.changelog-master.xml
 spring.liquibase.url=jdbc:postgresql://db:5432/innovation
 spring.liquibase.user=postgres

```

Thet are not able to be connected.

I always got an error:
org.postgresql.util.PSQLException: Connection to db:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

【问题讨论】:

  • 看看你在哪里定义了localhost:5432并将其更改为db:5432并确保你没有旧的图像容器,我建议你删除所有图像和容器并重新构建它们
  • @LinPy 没有帮助
  • 你的数据库正在运行吗? docker psdocker logs DB_CONTINER?
  • 看看你的 2 个容器是否在同一个 docker 网络中。
  • 你也可以试试 spring.datasource.url=jdbc:postgresql://postgres:5432/innovation

标签: postgresql docker docker-compose


【解决方案1】:

首先,我没有看到您的 Docker 文件中为两个容器定义了任何网络

所以我假设他们在 $project-default 网络上。

docker network inspect $project-default

将为您提供使用默认网络的所有容器的列表。

现在来到容器,假设 DB 是 Container 1 (10.1.1.2) 而 Spring App 是 Container 2 (10.1.1.3)。

你可以通过运行来获取运行中的容器IP

docker inspect containerName

您将分别为 db 和 Spring 暴露 54328085 端口

Spring 应用容器内属性文件spring.datasource.url

localhost:5432 or db:5432(不确定 db 主机名映射到什么)不可访问,因为 DB 位于不同的容器中。

你可以试试10.1.1.2:5432

当您从主机暴露 5432 和 8085 端口时,您可以访问这些端口。

例如,在 Docker for Windows 中,它将是 192.168.99.100:5432

但不能从容器内部访问。

spring.datasource.url=jdbc:postgresql://10.1.1.2:5432/innov 应该可以在数据库启动并运行的情况下工作

【讨论】:

  • docker-compose 的默认网络不是“桥”网络。它将创建一个名为 $project-default 的网络。
  • db 是在 docker 中获取网络别名的服务名称。这是连接到另一个容器的正确方法。尝试从容器内部连接到 localhost 将仅连接到该容器,而不是主机命名空间,因此您不应该使用 localhost 在容器之间进行连接。不建议使用 IP 地址,因为它不可移植并且会在更新时中断。
  • 感谢@BMitch 提供的信息。是的 localhost 不起作用,如果它们共享同一网络,我建议连接到容器内部 IP。
  • 如果他们共享同一个网络,您应该使用 DNS 别名 db。每次部署项目时 IP 地址都会发生变化。
  • 所以它终于开始了,但没有旧数据。这是用于创建映像的 Dockerfile: FROM postgres:11.1-alpine COPY re store_db.sh /docker-entrypoint-initdb.d/ COPY db.sql /backup/ ENV PGDATA=/data 。但是当我启动 docker-compose init.sh 脚本不起作用
猜你喜欢
  • 2021-01-26
  • 2019-06-18
  • 1970-01-01
  • 2018-03-01
  • 2021-10-31
  • 1970-01-01
  • 2016-03-27
  • 2019-04-14
  • 1970-01-01
相关资源
最近更新 更多