揭秘 Docker Compose
我最近的项目使用了 Rails 和 Postgres。在 Mac 和 Postgres 安装上纠结了一个小时之后,我放弃了,改用Docker。
Docker 对我来说一直有点神秘,这次我真的很想真正理解我的设置,而不是仅仅照搬快速入门指南。既然学习某种东西最好的方法就是教它,我就分享给你!
有三个关键文件:
- Dockerfile
- docker-compose.yml
- 数据库.yml
还有两个主要命令:
- docker-compose 构建
- docker-compose up
您需要安装 Docker。
我更喜欢使用VSCode的Docker 扩展与我正在运行的容器进行交互,因此如果您不使用该扩展,则可能需要更多命令。
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