当前位置: 首页 > 面试题库 >

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

方寒
2023-03-14
问题内容

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文件,该文件旨在用Supervisor替换运行多个进程(RQ worker,RQ仪表板和Flask应用程序)的单个Docker容器解决方案。 主机系统是Debian 8 Linux,我的样子如下(我删除了所有其他条目以减少错误源): “ rq-worker1”是Python RQ工作者,尝试通过本地主机和端口6379连接到Redis,但无

  • 我试图为Nginx+PHP(Laravel)+MySQL构建docker组合容器,但我不断收到连接拒绝错误 Docker-compose.yml 在中,我有一个全新的Laravel应用程序,它具有基本的SQL设置 所有容器都运行时没有错误,我可以使用以下方法连接到MySQL容器 但当我试图从浏览器访问或将ssh直接导入php容器时,我总是得到错误2002。 我有nginx和mysql运行在服务器上

  • 试图在localhost中建立从app容器到mysql容器的连接,出现连接拒绝异常 我们正在采取一种docker的方法来调用rest api服务来采用微服务的方法。我们正在建立应用程序容器和mysql容器之间的连接,同时我们编写了一个docker-compose文件,创建了mysql容器和应用程序容器,为这两个容器公开了端口。下面是运行docker-compose文件docker-compose

  • 问题内容: 我创建了一个小工具,过去它像一个魅力一样可以部署小型WordPress实例。看起来像这样: 但是当我现在启动它时(也许是因为docker更新到Docker 1.9.1版本,build ),它失败了 当我的猫的有项针对MySQL: 而且我能够ping通MariaDB服务器。 当我安装WordPress并多次重启后,MariaDB容器打印出来: 是哪个指示它正在运行,不是吗? 我如何获得W

  • 我正在运行2个spring boot应用程序:一个客户端和rest-api。客户机与rest-api通信,rest-API与mongodb数据库通信。所有3层都在docker容器中运行。 我启动容器,通常指定docker文件中公开的端口,并将它们映射到主机上的端口,例如:-p 7070:7070,其中7070是docker文件中公开的端口。 当我通过< code > Java-jar[applic

  • 我正在开发一个多容器的Docker应用程序,我想要一个容器使用Docker Compose向其他容器的API发出HTTP请求。我收到连接拒绝错误。 这两个容器都运行ASP.NET Core2.2。我使用的IDE是Visual Studio2017。我在用邮递员测试API调用。 DockerFiles Docker组合配置: 服务控制器操作: 卷曲 我还可以使用CURL来稳定与API RESTend