揭秘 Docker Compose

2025-06-08

揭秘 Docker Compose

我最近的项目使用了 Rails 和 Postgres。在 Mac 和 Postgres 安装上纠结了一个小时之后,我放弃了,改用Docker

Docker 对我来说一直有点神秘,这次我真的很想真正理解我的设置,而不是仅仅照搬快速入门指南。既然学习某种东西最好的方法就是教它,我就分享给你!

有三个关键文件:

  • Dockerfile
  • docker-compose.yml
  • 数据库.yml

还有两个主要命令:

  • docker-compose 构建
  • docker-compose up

您需要安装 Docker。

我更喜欢使用VSCodeDocker 扩展与我正在运行的容器进行交互,因此如果您不使用该扩展,则可能需要更多命令。

Dockerfile

Dockerfile 是定义容器依赖项的地方。我会逐行解释我的代码。

FROM ruby:2.6.3
这是它从哪个图像开始,在本例中是 Ruby 2.6.3 图像。

RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN gem install bundler

Docker 容器非常简单,接下来几行是安装 Nodejs、Postgres 客户端和 Bundler。

WORKDIR /my-api
这应该是所有应用程序代码所在的文件夹。它设置工作目录,以便后续命令更容易执行。

COPY Gemfile /my-api/Gemfile
COPY Gemfile.lock /my-api/Gemfile.lock

将 Gemfiles 复制到容器中的工作空间。

RUN bundle install
这将在容器中运行捆绑器。

COPY . /my-api
将所有其他文件复制到工作空间。

COPY Docker/database.yml config/database.yml
这行可以跳过。该项目与其他本地安装了 Postgres 的用户共享,我不想覆盖存储库中的 config/database.yml 文件。我为特定的 database.yml 文件创建了一个 Docker 文件夹。此命令将我的 database.yml 文件复制到容器的标准位置。

EXPOSE 3000
仅打开您需要打开的端口。

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

启动轨道。

因此,对于这个 Rails 和 Postgres 项目,我的完整 Dockerfile 如下所示:

FROM ruby:2.6.3
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client 
RUN gem install bundler
WORKDIR /my-api
COPY Gemfile /my-api/Gemfile
COPY Gemfile.lock /my-api/Gemfile.lock
RUN bundle install
COPY . /my-api
COPY Docker/database.yml config/database.yml 
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

docker-compose.yml

该文件将我们新定义的 Rails 容器连接到 Postgres 数据库。

version: '3'
所有 docker-compose 文件都以此开头。请勿更改版本,保留原有版本即可。

services:
这定义了要构建的服务(又名容器)以及它们的连接方式。

db:
image: postgres

第一个服务是 Postgres 数据库。它会拉取基础 Postgres 镜像。我的数据库不需要任何插件或自定义,所以不需要为这个服务创建 Dockerfile。
如果希望数据持久化,则需要添加卷。 这个项目不需要持久化存储,所以没有使用卷。
volumes:
- ./tmp/db:/var/lib/postgresql/data

web:
下一个服务是 Rails Web 服务器。

`build: .`

从我们新定义的 Dockerfile 构建图像。

command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
在我们的新服务容器中运行此 bash 命令。此命令将删除 pid 文件并告诉 Rails 要使用哪些端口。

`ports:
  - "3000:3000"`

将 Rails 服务端口 3000 映射到我本地机器的 3000。

`depends_on:
  - db`

该服务只有在数据库服务启动后才会启动。

再一次,volumes这里可以有一条线,但我不需要它。

我的 docker-compose.yml 总体看起来像这样。

version: '3'
services:
  db:
    image: postgres
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    ports:
      - "3000:3000"
    depends_on:
      - db

数据库.yml

这是数据库连接文件。

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password:
  pool: 5

development:
  <<: *default
  database: my-api_development


test:
  <<: *default
  database: my-api_test

docker-compose 构建

此命令用于构建容器。按照我的设置,每次更新 Gemfile 时都必须重新构建。

构建可能需要一些时间。docker-compose.yml 中的每一行都是构建过程中的一个步骤,可以缓存,以便之后的每次构建都更快。

快速重建的示例输出。

$ docker-compose build
db uses an image, skipping
Building web
Step 1/11 : FROM ruby:2.6.3
 ---> d529acb9f124
Step 2/11 : RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
 ---> Using cache
 ---> 32e807d05964
Step 3/11 : RUN gem install bundler
 ---> Using cache
 ---> 0c1c757c6905
Step 4/11 : WORKDIR /my-api
 ---> Using cache
 ---> b305131f9c6b
Step 5/11 : COPY Gemfile /my-api/Gemfile
 ---> Using cache
 ---> 657fc337d0c4
Step 6/11 : COPY Gemfile.lock /my-api/Gemfile.lock
 ---> Using cache
 ---> 09154df316d8
Step 7/11 : RUN bundle install
 ---> Using cache
 ---> 7915826ca085
Step 8/11 : COPY . /my-api
 ---> 4ff482944c8e
Step 9/11 : COPY Docker/database.yml config/database.yml
 ---> 101f814ba0bc
Step 10/11 : EXPOSE 3000
 ---> Running in 45f91676a8f3
Removing intermediate container 45f91676a8f3
 ---> 9426b9097b78
Step 11/11 : CMD ["rails", "server", "-b", "0.0.0.0"]
 ---> Running in 3f262f9679a2
Removing intermediate container 3f262f9679a2
 ---> a056b93d4bc8
Successfully built a056b93d4bc8

docker-compose up

此命令启动容器。

$ docker-compose up
Starting my-api_db_1 ... done
Recreating my-api_web_1 ... done
Attaching to my-api_db_1, my-api_web_1

localhost:3000然后在浏览器中访问以确认它已启动并正在运行。

欲了解更多信息,请查看Rails 的官方快速入门指南。

鏂囩珷鏉ユ簮锛�https://dev.to/geekgalgroks/demystifying-docker-compose-b62
PREV
内向者办公室人际交往指南
NEXT
React 及其生命周期方法概述