2017-06-01 66 views
3

我使用docker-compose,並嘗試從Web容器連接到postgres數據庫。 我用這個URI:如何通過docker-compose網絡連接到postgres?

postgresql://hola:[email protected]/holadb 

我得到這個錯誤:

Connection refused 
    Is the server running on host "postgres" (172.18.0.2) and accepting 
    TCP/IP connections on port 5432? 

泊塢窗,compose.yml

version: '2' 

services: 
    web: 
     restart: always 
     build: ./web 
     expose: 
      - "8000" 
     volumes: 
      - /usr/src/app/project/static 
     command: /usr/local/bin/gunicorn -w 2 -b :8000 project:app 
     depends_on: 
      - postgres 

    postgres: 
     image: postgres:9.6 
     ports: 
      - "5432:5432" 
     environment: 
      - POSTGRES_USER=hola 
      - POSTGRES_PASSWORD=hola 
      - POSTGRES_DB=holadb 
     volumes: 
      - ./data/postgres:/var/lib/postgresql/data 

我構建和運行之前刪除./data/postgres。

日誌

postgres_1 | The files belonging to this database system will be owned by user "postgres". 
postgres_1 | This user must also own the server process. 
postgres_1 | 
postgres_1 | The database cluster will be initialized with locale "en_US.utf8". 
postgres_1 | The default database encoding has accordingly been set to "UTF8". 
postgres_1 | The default text search configuration will be set to "english". 
postgres_1 | 
postgres_1 | Data page checksums are disabled. 
postgres_1 | 
postgres_1 | fixing permissions on existing directory /var/lib/postgresql/data ... ok 
postgres_1 | creating subdirectories ... ok 
postgres_1 | selecting default max_connections ... 100 
postgres_1 | selecting default shared_buffers ... 128MB 
postgres_1 | selecting dynamic shared memory implementation ... posix 
postgres_1 | creating configuration files ... ok 
postgres_1 | running bootstrap script ... ok 
web_1  | [2017-06-03 16:54:14 +0000] [1] [INFO] Starting gunicorn 19.7.1 
web_1  | [2017-06-03 16:54:14 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1) 
web_1  | [2017-06-03 16:54:14 +0000] [1] [INFO] Using worker: sync 
web_1  | [2017-06-03 16:54:14 +0000] [7] [INFO] Booting worker with pid: 7 
web_1  | [2017-06-03 16:54:14 +0000] [8] [INFO] Booting worker with pid: 8 
postgres_1 | performing post-bootstrap initialization ... ok 
postgres_1 | 
postgres_1 | WARNING: enabling "trust" authentication for local connections 
postgres_1 | You can change this by editing pg_hba.conf or using the option -A, or 
postgres_1 | --auth-local and --auth-host, the next time you run initdb. 
postgres_1 | syncing data to disk ... ok 
postgres_1 | 
postgres_1 | Success. You can now start the database server using: 
postgres_1 | 
postgres_1 |  pg_ctl -D /var/lib/postgresql/data -l logfile start 
postgres_1 | 
postgres_1 | waiting for server to start....LOG: database system was shut down at 2017-06-03 16:54:16 UTC 
postgres_1 | LOG: MultiXact member wraparound protections are now enabled 
postgres_1 | LOG: database system is ready to accept connections 
postgres_1 | LOG: autovacuum launcher started 
postgres_1 | done 
postgres_1 | server started 
postgres_1 | CREATE DATABASE 
postgres_1 | 
postgres_1 | CREATE ROLE 
postgres_1 | 
postgres_1 | 
postgres_1 | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/* 
postgres_1 | 
postgres_1 | LOG: received fast shutdown request 
postgres_1 | LOG: aborting any active transactions 
postgres_1 | LOG: autovacuum launcher shutting down 
postgres_1 | LOG: shutting down 
postgres_1 | waiting for server to shut down....LOG: database system is shut down 
postgres_1 | done 
postgres_1 | server stopped 
postgres_1 | 
postgres_1 | PostgreSQL init process complete; ready for start up. 
postgres_1 | 
postgres_1 | LOG: database system was shut down at 2017-06-03 16:54:18 UTC 
postgres_1 | LOG: MultiXact member wraparound protections are now enabled 
postgres_1 | LOG: database system is ready to accept connections 
postgres_1 | LOG: autovacuum launcher started 

我不明白爲什麼這是行不通的。預先感謝您的幫助。

+0

看來數據庫沒有運行。日誌的最後一行表示它已收到關閉,並且沒有重新開始。另外,即使它啓動了,你也需要確保數據庫配置允許外部連接,它將是pg_hba.conf文件。在此處查看:https://www.postgresql.org/docs/9.1/static/auth-pg-hba-conf.html –

+0

@JorgeCampos然後寫入「數據庫系統已準備好接受連接」。我讀了一些關於這個的內容:「服務器的啓動和停止是正常的,這允許入口點腳本:啓動只偵聽unix套接字的sql server;創建初始用戶,數據庫和密碼;以及運行shell腳本和從/docker-entrypoint-initdb.d/中導入sql文件,完成後,它會停止後臺的sql服務器,然後用偵聽tcp套接字的新sql服務器進程替換自己。「 [這裏](https://github.com/docker-library/postgres/issues/101) – clemtoy

回答

2

Web容器嘗試連接,而postgres仍在初始化... 等待一些延遲解決了我的問題。

編輯:我用Docker Compose Healthcheck來做到這一點。

3

您需要設置網絡以允許容器之間的通信。像這樣的東西必須努力:

version: '2' 
services: 
    web: 
     restart: always 
     build: ./web 
     expose: 
      - "8000" 
     volumes: 
      - /usr/src/app/project/static 
     command: /usr/local/bin/gunicorn -w 2 -b :8000 project:app 
     depends_on: 
      - postgres 
     networks: ['mynetwork'] 

    postgres: 
     restart: always 
     build: 
      context: ./postgresql 
     volumes_from: 
      - data 
     ports: 
      - "5432:5432" 
     networks: ['mynetwork'] 
networks: {mynetwork: {}} 

更多信息herehere

+0

謝謝你的回答。默認網絡[由docker-compose自動創建](https://docs.docker.com/compose/networking/)。在我的情況下:'8ffcf2334734 hola2_default橋本地',所以它應該沒有'mynetwork'工作。我仍然嘗試過你的解決方案,但沒有奏效。 – clemtoy

+2

你說得對。在這種情況下,我建議你通過'sudo docker exec -it postgres bash'連接你的postgres容器,然後確保你的服務器正在運行:'psql -U role'。通過發出'SHOW listen_addresses'來檢查postgres的'listen_addresses'是否設置爲「*」。 –

+0

的確,「hola」角色沒有創建。我不明白爲什麼。我簡化了我的架構並更新了我的問題。 – clemtoy