启动 Postgres 服务器
在这里,我们将开始学习我们想要添加到应用中的数据库。
Postgres server
我们希望为 Rails 应用运行一个 Postgres 服务器。这个过程与添加 Redis 非常相似。在上一章中,我们首先熟悉了如何使用 docker run 运行 Redis 服务器。然而,现在我们已经积累了一些添加服务的经验,可以直接通过 Compose 来设置 Postgres。
修改 docker-compose.yml
让我们将 Postgres 添加到我们的 docker-compose.yml 文件中:
1version: '3' 2 services: 3 web: 4 build: . 5 ports: 6 - "3000:3000" 7 volumes: 8 - . :/usr/src/app 9 redis: 10 image: redis 11 database: 12 image: postgres 13 environment: 14 POSTGRES_USER: postgres 15 POSTGRES_PASSWORD: some-long-secure-password 16 POSTGRES_DB: myapp_development
说明
我们使用官方的 postgres 镜像定义了一个新的数据库服务。我们依赖该镜像的默认 CMD 指令 CMD ["postgres"],它会启动 Postgres 服务器。
与 Redis 类似,我们的新数据库服务不需要端口映射或卷挂载。我们不希望数据库能从应用外部访问。同时,也不需要将任何文件挂载到 Postgres 容器中。
不过,我们确实指定了一个名为 environment 的新属性。你可能已经猜到了它的作用:它告诉 Docker 在容器内设置后续的环境变量。在这里,我们指定:
POSTGRES_USER应设为postgres;POSTGRES_PASSWORD应设为some-long-secure-password;POSTGRES_DB应设为myapp_development。
为什么要设置这些?
非 Docker 化版本的 Postgres 允许你通过环境变量指定某些参数。Docker 化版本也是如此。
当 Postgres 启动时,如果设置了 POSTGRES_USER,其值将作为超级用户账户的名称。同样地,如果设置了 POSTGRES_PASSWORD,该值将作为超级用户的密码。最后,如果设置了 POSTGRES_DB,该值将作为启动时创建的默认数据库名称。
将数据库密码放在 docker-compose.yml 文件中并不是理想的做法。这个文件应该提交到版本控制中,但提交包含密钥的文件存在安全风险。我们稍后会重新讨论这个问题。
此外,技术上讲,我们其实不需要设置 POSTGRES_USER,因为它是默认值。但我们仍将其包含在内,因为这是良好的可配置性实践。在更新了 docker-compose.yml 后,我们可以启动 Postgres:
1$ docker-compose up -d database
这将在分离模式下启动我们的数据库服务。我们可以通过以下命令验证它是否已启动并运行:
1$ docker-compose ps
我们的应用将有三个容器。为了额外确认,我们可以查看数据库容器的输出:
1$ docker-compose logs database
请记住,此命令显示的是容器的日志,即其输出内容,而不是 Postgres 日志文件的输出。
🍀 练习
现在让我们尝试所有这些更改。
-
在
docker-compose.yml中添加数据库服务。 -
点击运行按钮。
-
启动数据库服务。
-
验证数据库服务已启动并运行。
-
查看数据库容器的输出。
No configuration found for ID: abdcf3a4aad6684e784588ee7778af53baff644dcb0b6b4ad2fb7e2de54e3858
解决方案是:
- docker-compose.yml 文件将如下所示:
1version: '3' 2 3services: 4 5 web: 6 image: educative1/railsv21 7 ports: 8 - "3000:3000" 9 redis: 10 image: redis 11 12 database: 13 image: postgres 14 environment: 15 POSTGRES_USER: postgres 16 POSTGRES_PASSWORD: some-long-secure-password 17 POSTGRES_DB: myapp_development
- 点击运行按钮。
- 启动数据库服务,请使用:
1$ docker-compose up -d database - 运行
docker-compose ps - 运行
docker-compose logs database
解决方案是:
- docker-compose.yml 文件将如下所示:
1version: '3' 2services: 3web: 4image: educative1/railsv21 5ports: 6- "3000:3000" 7redis: 8image: redis 9database: 10image: postgres 11environment: 12POSTGRES_USER: postgres 13POSTGRES_PASSWORD: some-long-secure-password 14POSTGRES_DB: myapp_development
- 点击运行按钮。
- 要启动数据库服务,请使用:
1$ docker-compose up -d database - 运行
docker-compose ps - 运行
docker-compose logs database