Logo
Section 1 / 7

启动 Postgres 服务器

在这里,我们将开始学习我们想要添加到应用中的数据库。

导入

启动 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 日志文件的输出。

🍀 练习

现在让我们尝试所有这些更改。

  1. 在 docker-compose.yml 中添加数据库服务。

  2. 点击运行按钮。

  3. 启动数据库服务。

  4. 验证数据库服务已启动并运行。

  5. 查看数据库容器的输出。

No configuration found for ID: abdcf3a4aad6684e784588ee7778af53baff644dcb0b6b4ad2fb7e2de54e3858

解决方案是:

  1. 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. 点击运行按钮。
  2. 启动数据库服务,请使用:
    1$ docker-compose up -d database
  3. 运行 docker-compose ps
  4. 运行 docker-compose logs database

解决方案是:

  1. 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. 点击运行按钮。
  2. 要启动数据库服务,请使用:
    1$ docker-compose up -d database
  3. 运行 docker-compose ps
  4. 运行 docker-compose logs database

一个崭新的世界

从独立容器连接 Postgres