【问题标题】:Docker container in docker-compose can't find other containers by hostnamedocker-compose 中的 Docker 容器无法通过主机名找到其他容器
【发布时间】:2018-07-26 16:06:14
【问题描述】:

我正在将 docker-compose 文件从 v1 升级到 v3,但在将容器链接在一起时遇到问题。

在 docker-compose.yml 之前是这样的:

database:
  working_dir: /mnt
  volumes:
    - .:/mnt
  links:
   - postgresql_db
  ports:
    - '3000:3000'
  build: ./database
  entrypoint: python database/server.py

postgresql_db:
  build: ./database
  ports:
    - '5432:5432'

test_database:
  working_dir: /mnt
  volumes:
    - .:/mnt
  links:
    - test_postgresql_db
  ports:
    - '5053:5053'
  build: ./database/test

test_postgresql_db:
  image: postgres:latest
  ports:
    - '5432:5432'

但链接已被弃用。现在容器应该共享一个网络(默认情况下它们应该这样做)并且能够使用主机名找到彼此(参见:here)。

所以我将文件修改为:

version: '3'

networks:
  dbnet:
    driver: bridge

volumes:
  postgresql_data: {}
  postgresql_test_data: {}

services:
  database:
    build: database
    environment:
      APPLICATION_DB_CONTAINER: db
      APPLICATION_POSTGRES_HOST: db
    working_dir: /mnt
    volumes:
      - .:/mnt
    networks:
      - dbnet
    ports:
      - '3000:3000'
    command: python database/server.py

  db:
    image: postgres:latest
    volumes:
      - postgresql_data:/var/lib/postgresql/data
    networks:
      - dbnet
    depends_on:
      - database

  test_database:
    build: database/test
    environment:
      APPLICATION_DB_CONTAINER: testdb
    working_dir: /mnt
    volumes:
      - .:/mnt
    command: python -m pytest --cov=database --cov-report term --cov-report html:htmlcov database/test/

  testdb:
    image: postgres:latest
    volumes:
      - postgresql_test_data:/var/lib/postgresql/data

我遇到的问题是数据库容器无法通过主机名找到 db 容器并且我得到了(我的软件尝试每秒连接 10 秒然后停止):

错误:找不到数据库 postgresql://postgres:@db:5432/postgres (10 尝试)

我检查了,db 容器已经启动,如果我使用它的 IP 地址,那么它可以工作,但使用主机名不能。

如何链接数据库和 db 容器并确保每次都能找到它?

信息:我在 MacO 上运行 docker 版本 18.06.0-ce-mac70。

谢谢!

编辑:尝试将其添加到 db 的撰写文件中,但没有改变问题。

端口:'5432:5432'

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) 无法将主机名“db”转换为地址:名称或服务未知 数据库_1 | (此错误的背景:http://sqlalche.me/e/e3q8

我从 sqlalchemy 收到此错误,表明数据库容器不知道 db(或 db-1)是什么,并且文件 /etc/hosts 不包含对另一个容器的任何提及

【问题讨论】:

  • 不确定这是否是您的具体问题,但您尚未为 db 服务公开端口 5432
  • 如果容器在同一个网络中,可以使用容器名本身访问容器
  • 嗨,我试图暴露端口 5432 但它没有改变,问题是我得到一个未找到主机的错误...还尝试使用容器名称(例如对于 db,我使用了 db-1) 但它没有改变。 /etc/hosts 文件中没有任何行包含 db 容器...
  • 您的撰写文件指出您的db 容器依赖于database 容器。不应该反过来吗?
  • 哦,确实。似乎反转depends_on会强制数据库服务始终在db之前启动,从而阻止数据库知道主机db。谢谢@sachav!你找到了:)

标签: docker docker-compose docker-networking


【解决方案1】:

正如@sachav 在 cmets 中指出的那样,我反转了depends_on。

在数据库服务中,

db:
  depends_on:
    - database
...

强制db服务在数据库之前启动,从而阻止数据库知道主机db存在!

取出添加

database:
  depends_on:
    - db
...

成功了 :)

谢谢@sachav,我现在要亲自去面对手掌了。

【讨论】:

    最近更新 更多