2016-11-05 608 views
2

TL; DR:如何修改我的docker-compose.yml以允許一個容器使用另一個服務通過自定義(非標準)港口?docker-compose:容器之間的連接被拒絕,但服務可以從主機訪問

我有一個很常見的設置:Web應用程序(Padrino [Ruby]),Postgres,Redis和排隊框架(Sidekiq)的容器。 Web應用程序隨附自定義Dockerfile,其餘服務來自標準圖像(Postgres,Redis),或從Web應用程序(Sidekiq)安裝數據。他們聯繫在了一起通過以下docker-compose.yml

version: '2' 

services: 
    web: 
    build: . 
    command: 'bundle exec puma -C config/puma.rb' 
    volumes: 
     - .:/myapp 
    ports: 
     - "9000:3000" 
    depends_on: 
     - postgres 
     - redis 

    sidekiq: 
    build: . 
    command: 'bundle exec sidekiq -C config/sidekiq.yml -r ./config/boot.rb' 
    volumes: 
     - .:/myapp 
    depends_on: 
     - postgres 
     - redis 

    postgres: 
    image: postgres:9.5 
    environment: 
     POSTGRES_USER: my-postgres-user 
     POSTGRES_PASSWORD: my-postgres-pass 
    ports: 
     - '9001:5432' 
    volumes: 
     - 'postgres:/var/lib/postgresql/data' 

    redis: 
    image: redis 
    ports: 
     - '9002:6379' 
    volumes: 
     - 'redis:/var/lib/redis/data' 

volumes: 
    redis: 
    postgres: 

一個關鍵點這裏需要注意的是,我在非標準端口(9000-9002)使容器服務。

如果我以docker-compose up開始設置,Redis和Postgres容器會很好,但Web應用程序和Sidekiq的容器失敗,因爲它們無法連接到Redis的redis:9002。值得注意的是,如果我用6379(標準Redis的端口)工作而不是9002

docker ps相同的設置也看起來很好,據我所知:

CONTAINER ID  IMAGE     COMMAND     CREATED     STATUS    PORTS        NAMES 
9148566c2509  redis     "docker-entrypoint.sh" Less than a second ago Up About a minute 0.0.0.0:9002->6379/tcp    rubydockerpadrino_redis_1 
e6d47321c939  postgres:9.5   "/docker-entrypoint.s" Less than a second ago Up About a minute 0.0.0.0:9001->5432/tcp    rubydockerpadrino_postgres_1 

什麼是更加混亂:我可以訪問Redis的來自主機的容器通過redis-cli -h localhost -p 9002 -n 0,但Web應用程序和Sidekiq容器無法建立連接。

我使用在MacOS此泊塢窗版本: Docker version 1.12.3, build 6b644ec, experimental

任何想法我做錯了嗎?我很感激任何提示如何讓我的設置運行。

回答

4

當你像這樣綁定端口'9002:6379'時,你告訴Docker轉發來自localhost:9002 - >redis:6379的流量。這就是爲什麼這從您的主機的工作原理:

redis-cli -h localhost -p 9002 -n 0 

然而,當容器相互交談,他們都在默認情況下(在泊塢橋docker0)連接到同一個網絡。默認情況下,容器可以在此網絡上互相通信免費,而不需要打開任何端口。在這個網絡中,您的redis容器正在監聽通常的端口上的流量(6379),主機根本不參與。這就是爲什麼你的集裝箱到集裝箱通信的原因是6379

+0

你釘了它!非常感謝你指點我的部分(端口映射,它將端口轉發給主機,但不是內部容器)我直到現在才被誤解。現在它工作了! :) – crn

+0

當您可能有多個容器在內部偵聽同一端口並且需要在本地主機上重新映射時,映射非常有用。由於每個容器是分開的,所以在容器到容器中不存在問題。還有一些設置可以關閉容器之間的通信,還可以創建其他網絡而不是默認連接容器。請記住接受答案,如果它的工作:) – johnharris85

相關問題