web-dev-qa-db-ja.com

2つのコンテナーでdocker-compose:webはdbに接続できません

docker-composeは、以前に作成されたdbコンポーネントに接続できないため、Webコンポーネントの構築に失敗します

Mac OSX 10.13.6、conda 4.5.11、Python 3.6.8、Dockerバージョン18.09.1、docker-composeバージョン1.23.2

Django 1.8.3は、Dockerfileのrequirements.txtとともにインストールされます。アップグレードする自由がない。

SOに関する非常に類似したいくつかの議論は役に立たなかった(このように: Docker-compose with Django could not translate Host name "db" to not toアドレス:名前またはサービスが不明 )。

ネットワークと2つのコンポーネントを持つdocker-compose.ymlがあります。

version: '3'
networks:
  bridge:
   driver: bridge
services:
  db:
    image: postgres:10
    container_name: myapp-db
    volumes:
      - ./postgres_data:/var/lib/postgresql/data/
    ports:
      - "5432:5432"
    environment:
     POSTGRES_DB: actionability-master
     POSTGRES_PASSWORD: postgres
     POSTGRES_USER: postgres
    networks:
      - bridge


  web:
    restart: unless-stopped
    container_name: myapp-web
    build: .
    command: /start_gunicorn.sh
    ports:
      - "8080:8080"
    environment:
      PRODUCTION: 'true'
    networks:
      - bridge

私のsettings.pyにはDATABASESセクションがあります:

DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.postgresql_psycopg2',
        'NAME': INSTANCE_NAME,
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'Host': 'db',
        'PORT': '5432'
    },

}

$ docker-compose up -dを実行すると、最初のイメージ(db)が作成され、そのコンテナが起動します。 docker psおよびlsofを使用して、ポート5432で実行およびリスニングしていることを確認できます。 web:ファイルからdocker-compose.ymlコンポーネントを削除しても同じことが起こります

これで、2番目のコンポーネント(web)には、他の多くの行のうち、次の2行を含むDockerfileがあります。

RUN python manage.py makemigrations myapp
RUN python manage.py migrate

のような「移行」はこのエラーで死にます:

Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/Django/db/backends/base/base.py", line 130, in ensure_connection
    self.connect()
File "/usr/local/lib/python3.6/site-packages/Django/db/backends/base/base.py", line 119, in connect
    self.connection = self.get_new_connection(conn_params)
File "/usr/local/lib/python3.6/site-packages/Django/db/backends/postgresql_psycopg2/base.py", line 176, in get_new_connection
    connection = Database.connect(**conn_params)
File "/usr/local/lib/python3.6/site-packages/psycopg2/__init__.py", line 130, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not connect to server: Connection refused
Is the server running on Host "db" (37.34.32.51) and accepting TCP/IP connections on port 5432?

私はいくつかの微調整に疲れました。 *変更version '3.7' * dbセクションに追加

expose:
    - "5432"
  • webコンポーネントに追加:

depends_on: - "db"

  • webコンポーネントに追加:

links: - "db"

  • pRODUCTIONをfalseに設定します

environment: PRODUCTION: 'false'

  • settings.pyのホストをコンテナ名、イメージ名、タグ、コンテナID、「localhost」、「127.0.0.1」などに変更しました。エラーは同じで、新しいホスト名のみが表示されています「db」の代わりに
  • conda envの外で実行されました
  • --buildスイッチで実行(docker-compose up -d --build
  • docker system Pruneを実行し、再度実行しました

すべて同じエラー。


UPDATE:docker-composeがこのように機能しないという提案の後、2つの個別のタスクに分割しようとしました。最初にmyapp-dbコンテナを作成し、それが正しいポートで実行されていることを確認します。

$ docker container ps


CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
c110e8361cda        postgres:10         "docker-entrypoint.s…"   4 hours ago         Up 4 hours          0.0.0.0:5432->5432/tcp     myapp-db

次に、myapp-webをビルドします。

docker build -t myapp-web .

同じエラーがまだ発生します。それで、なぜ今はdbコンテナが見つからないのですか?

5
SwissNavy

depends_onリストを使用して、Webコンテナーの前にdbコンテナーを開始し、linksを使用してホスト名を解決できるようにします。

以下をウェブに追加します:

services:
  db:
    # ...
  web:
    links:
    - "db:db" # resolve the hostname "db" with the ip of the db container
    depends_on:
    - db # start db before web

1
User

これは本当に基本的なように思えるかもしれませんが、適度に洗練された命名規則を考慮して、それらの名前をホスト上のDNSサービス、または少なくともAレコードに追加してみませんか?

その後、システムは名前またはIPでデータベースにアクセスできます。ちょっとした考え。

プラットフォームと言語の優れた選択肢と組み合わせ、Django + PostgreSQLは私のお気に入りです。特に、迅速なツール展開機能を探している場合は、Bootstrapをお勧めします。

0
Fallenour

ネットワークエイリアスを使用してこの構成を試すことができます。

version: '3.5'
services:

  db:
    image: postgres:10
    container_name: myapp-db
    volumes:
      - ./postgres_data:/var/lib/postgresql/data/
    expose:
      - "5432"
    environment:
       POSTGRES_DB: actionability-master
       POSTGRES_PASSWORD: postgres
       POSTGRES_USER: postgres
    networks:
      services-network:
        aliases:
         - db

  web:
    restart: unless-stopped
    container_name: myapp-web
    build: .
    command: /start_gunicorn.sh
    ports:
      - "8080:8080"
    environment:
      PRODUCTION: 'true'
    depends_on:
      - db
    networks:
      services-network:
        aliases:
         - web

networks:
   services-network:
     name: services-network
     driver: bridge
0
Masht Metti