【问题标题】:understanding Docker compose mongodb and rails application了解 Docker 编写 mongodb 和 rails 应用程序
【发布时间】:2021-03-14 20:36:09
【问题描述】:

ruby​​ on rails 应用程序使用 mongodb 和 postgresql 数据库。当我在本地运行它时一切正常,但是当我尝试在远程容器中打开时,它会抛出错误消息

2021-03-14T20:22:27.985+0000 Failed: error connecting to db server: no reachable servers

docker-compose.yml 文件定义了以下服务:

redis mongodb db rails

我使用以下命令启动远程容器:

docker-compose build - 构建成功

docker-compose up -d - 容器已启动并正在运行

当我连接到rails 容器并尝试这样做时

bundle exec rake aws:restore_db

上面提到的错误被抛出。我不知道这里有什么问题。 mongodb 容器已启动并正在运行。

docker-compose.yml 如下:

version: '3.4'
services:
  redis:
    image: redis:5.0.5
  mongodb:
    image: mongo:3.6.13
    volumes:
      - mongo-data:/data/db
  db:
    image: postgres:11.3
    volumes:
      - db-data:/var/lib/postgresql/data
  rails:
    build: .
    image: proj:latest
    depends_on:
      - db
      - mongodb
      - redis
    volumes:
      - .:/proj
    ports:
      - "3000:3000"
    tty: true
    stdin_open: true
    env_file:
      - .env/development.env
volumes:
  db-data:
  mongo-data:

这就是我启动所有四个远程容器的方式:

$ docker-compose up -d
Starting proj_db_1      ... done
Starting proj_redis_1   ... done
Starting proj_mongodb_1 ... done
Starting proj_rails_1   ... done

请帮助我了解远程容器应该如何相互交互。

【问题讨论】:

    标签: ruby-on-rails docker docker-compose


    【解决方案1】:

    您的配置应按名称指向服务,而不是指向 localhost 上的端口。例如,如果您将redis 连接为localhost:6380127.0.0.1:6380,现在您需要使用redis:6380

    如果这仍然没有帮助,您可以尝试在容器之间添加链接,以便将作为服务提供给它们的名称进行解析。所以文件看起来像这样:

    version: '3.4'
    services:
      redis:
        image: redis:5.0.5
        networks:
          - front-end
        links:
          - "mongodb:mongodb"
          - "db:db"
          - "rails:rails"
      mongodb:
        image: mongo:3.6.13
        volumes:
          - mongo-data:/data/db
        networks:
          - front-end
        links:
          - "redis:redis"
          - "db:db"
          - "rails:rails"
      db:
        image: postgres:11.3
        volumes:
          - db-data:/var/lib/postgresql/data
        networks:
          - front-end
        links:
          - "redis:redis"
          - "mongodb:mongodb"
          - "rails:rails"
      rails:
        build: .
        image: proj:latest
        depends_on:
          - db
          - mongodb
          - redis
        volumes:
          - .:/proj
        ports:
          - "3000:3000"
        tty: true
        stdin_open: true
        env_file:
          - .env/development.env
        networks:
          - front-end
        links:
          - "redis:redis"
          - "mongodb:mongodb"
          - "db:db"
    volumes:
      db-data:
      mongo-data:
    
    networks:
      front-end:
    

    这些链接将允许在容器中定义主机名。

    link 标志是旧的,在新版本的 docker-engine 中,用户定义的网络不需要它。此外,在 docker swarm 部署的情况下,这些链接将被忽略。但是,由于 Docker 和 docker-compose 的安装仍然很旧,这是在故障排除时尝试的一件事。

    【讨论】:

    • 添加网络和链接并不能解决问题。添加链接和网络后,我仍然有这个错误
    • 1) 你的连接字符串是什么,2) 你试图从哪个容器连接到哪个容器(例如 rails 到 redis)
    • 我连接到 rails 容器以运行 bash 脚本 docker-compose exec rails bash 然后执行 bundle exec rake aws:restore_db 。连接字符串似乎是正确的,mongoid.yml 包含设置为 mongodb:27017 的主机
    • 你能从rails容器中做cat /etc/hosts并检查mongodb是否列在里面。
    • 问题是连接字符串指向 localhost 而不是 mongodb。一切正常。干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多