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
任何想法我做錯了嗎?我很感激任何提示如何讓我的設置運行。
你釘了它!非常感謝你指點我的部分(端口映射,它將端口轉發給主機,但不是內部容器)我直到現在才被誤解。現在它工作了! :) – crn
當您可能有多個容器在內部偵聽同一端口並且需要在本地主機上重新映射時,映射非常有用。由於每個容器是分開的,所以在容器到容器中不存在問題。還有一些設置可以關閉容器之間的通信,還可以創建其他網絡而不是默認連接容器。請記住接受答案,如果它的工作:) – johnharris85