两个docker容器如何相互通信?

时间:2017-07-26 07:53:11

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

我有两个容器,想要彼此沟通。容器'A'包含端口5432上的PostgreSQL数据库的discourse.org应用程序,容器'B'具有在端口1000上运行的ROR应用程序。我想与ROR应用程序建立数据库连接到PostgreSQL(在另一个容器中)。如何将ROR应用程序与PostgreSQL数据库连接?

RoR应用程序,docker-compose.yml

version: '2'
services:
  app:
    build: .
    command: bundle exec rails s -p 9000 -b '0.0.0.0'
    volumes:
      - ".:/slackcron"
    ports:
      - "9000:9000"

RoR Application,database.yml

development:
  <<: *default
  database: discourse
  username: muzammil
  password: '123'
  host: 0.0.0.0
  port: 5432

docker ps

CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                                                NAMES
92a9cb961e56        slackcroncom_app      "bundle exec rails..."   47 seconds ago      Up 46 seconds       0.0.0.0:9000->9000/tcp                                               slackcroncom_app_1
b727c2d0d5ba        local_discourse/app   "/sbin/boot"             10 minutes ago      Up 10 minutes       0.0.0.0:443->443/tcp, 0.0.0.0:5432->5432/tcp, 0.0.0.0:8080->80/tcp   app

4 个答案:

答案 0 :(得分:2)

将数据库添加到docker-compose.yml并在您的应用中添加指向该链接的链接

version: '2'
services:
  db:
    container_name: db
    image: postgres:9.4.1
    ports:
      - "5555:5555"
  app:
    container_name: app
    build: .
    command: rails server --port 3000 --binding 0.0.0.0
    ports:
      - "3000:3000"
    links:
      - hobover_db
    volumes:
      - .:/app

并在database.yml中将您的容器名称作为主机:

development: &default
  adapter: postgresql
  encoding: unicode
  database: myapp_development
  pool: 5
  username: postgres
  password:
  host: db

答案 1 :(得分:1)

您应该在docker-compose中使用links。您只需链接到两个容器,在配置中,您只需引用服务名称。

“链接服务的容器可以在与别名相同的主机名上访问,如果没有指定别名,则可以访问服务名称。”

答案 2 :(得分:1)

首先,您可以尝试在多容器模式下设置话语:https://github.com/discourse/discourse_docker#single-container-vs-multiple-container 之后,你可能有一个带有struct的docker-compse.yml文件: app,db(话语数据库)和discourse_app。

其次,您可以尝试使用EXPOSE运算符将PostgreSQL运行到外部。 添加到您的app.yml:

expose:
 ...
  - "5432:5432" # PostgreSQL ports

您必须拥有postgres用户的密码: 输入容器:

su - postgres
psql -d postgres -c "ALTER USER postgres WITH PASSWORD '<new password>';"

您也可以尝试使用Docker Networking,如下所示:

$ docker network ls

NETWORK ID          NAME                DRIVER
7fca4eb8c647        bridge              bridge
9f904ee27bf5        none                null
cf03ee007fb4        <discourse_name>    host

您将看到Discourse容器的网络。您可以尝试将它与您的应用程序一起使用。

version: '2'
services:
  app:
    build: .
    command: bundle exec rails s -p 9000 -b '0.0.0.0'
    volumes:
       - ".:/slackcron"
    ports:
      - "9000:9000"
networks:
  default:
    external:
      name: <discourse_name>

之后,您的RoR应用程序将在同一网络中运行。

答案 3 :(得分:0)

我是通过将容器“A”IP用于容器“B”database.yml文件并将其与PostgreSQL连接来实现的。