docker-compose:容器之间的连接被拒绝,但是主机可以访问服务

TL; DR:docker-compose.yml为了允许一个容器通过自定义(非标准)端口使用另一个容器的服务,我必须如何更改以下内容?

我有一个非常普通的设置: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 也看起来很好afaik:

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版本: Docker version 1.12.3, build 6b644ec, experimental

有什么想法我做错了吗?我很感谢任何提示如何使我的安装程序运行。

回答:

当您像这样绑定端口时,您将'9002:6379'告诉Docker从localhost:9002->

转发流量redis:6379。这就是为什么它可以在您的主机上工作的原因:

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

但是,当容器相互通信时,默认情况下它们都连接到同一网络(Docker网桥 docker0)。默认情况下,容器可以在此网络上相互 自由

通信,而无需打开任何端口。在此网络中,您的redis容器正在侦听其常规端口(6379)上的流量,根本不涉及主机。这就是您的容器之间进行容器通信的原因6379

以上是 docker-compose:容器之间的连接被拒绝,但是主机可以访问服务 的全部内容, 来源链接: utcz.com/qa/434491.html

回到顶部