繁体   English   中英

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

[英]How two docker containers communicate each other?

我有两个容器,想互相交流。 容器“ A”由discourse.org应用程序和端口5432上的PostgreSQL数据库组成,容器“ 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应用程序,database.yml

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

码头工人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

将数据库放入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

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

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

首先,您可以尝试在多容器模式下设置语篇: https : //github.com/discourse/discourse_docker#single-container-vs-multiple-container之后,您可能只有一个docker-compse.yml文件, struct: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应用程序将在同一网络中运行。

我通过使用容器“ A” IP到容器“ B” database.yml文件并将其与PostgreSQL连接来做到这一点


暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM