我有两个容器,想要彼此沟通。容器'A'包含端口5432上的PostgreSQL数据库的discourse.org应用程序,容器'B'具有在端口1000上运行的ROR应用程序。我想与ROR应用程序建立数据库连接到PostgreSQL(在另一个容器中)。如何将ROR应用程序与PostgreSQL数据库连接?
version: '2'
services:
app:
build: .
command: bundle exec rails s -p 9000 -b '0.0.0.0'
volumes:
- ".:/slackcron"
ports:
- "9000:9000"
development:
<<: *default
database: discourse
username: muzammil
password: '123'
host: 0.0.0.0
port: 5432
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
答案 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连接来实现的。