两个docker集装箱如何相互通信?

我有两个容器,想互相沟通。 容器'A'包含在端口5432上的PostgreSQL数据库的discourse.org应用程序,容器'B'具有运行在端口1000上的ROR应用程序。我想与ROR应用程序build立数据库连接到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 

docker工人

 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 

首先,您可以尝试以多容器模式设置话语: 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用户的密码:input容器:

 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容器的networking。 你可以尝试在你的应用程序中使用它。

 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应用程序运行在同一个networking上之后。

将数据库放入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中的链接 。 您只需链接到两个容器,并在您的configuration中,您只需引用服务名称。

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

我通过使用容器'A'IP到容器'B'database.yml文件中,并将其与PostgreSQL连接