Docker 17
撰写 | Compose

Rails and PostgreSQL (Compose)

快速入门: Compose 和 Rails

这个快速启动指南将向您展示如何使用 DockerCompose 来设置和运行 Rails/PostgreSQL 应用程序。在开始之前,你需要组合安装...

定义项目

首先设置构建应用程序所需的四个文件。首先,由于您的应用程序将在包含所有依赖关系的 Docker 容器中运行,因此您需要准确定义容器中需要包含的内容。这是通过使用名为的文件完成的Dockerfile。首先,Dockerfile 由以下部分组成:

FROM ruby:2.3.3 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN mkdir /myapp WORKDIR /myapp ADD Gemfile /myapp/Gemfile ADD Gemfile.lock /myapp/Gemfile.lock RUN bundle install ADD . /myapp

这会将您的应用程序代码放入一个图像中,该图像将与 Ruby,Bundler 以及其内的所有依赖关系构建一个容器。有关如何编写 Dockerfiles 的更多信息,请参阅 Docker 用户指南和 Dockerfile 参考。

接下来,创建一个Gemfile只加载 Rails 的引导程序。它会在一瞬间被覆盖rails new

source 'https://rubygems.org' gem 'rails', '5.0.0.1'

你需要一个空的Gemfile.lock为了建造我们的Dockerfile

touch Gemfile.lock

最后,docker-compose.yml是魔术发生的地方。该文件描述了组成应用程序(数据库和 Web 应用程序)的服务,如何获取每个人的 Docker 镜像(数据库仅在预制 PostgreSQL 镜像上运行,Web 应用程序是从当前目录构建的),以及将它们链接在一起并公开 Web 应用程序的端口所需的配置。

version: '3' services: db: image: postgres web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/myapp ports: - "3000:3000" depends_on: - db

针尖::您可以使用.yml.yaml此文件的扩展名。

构建项目

有了这四个文件之后,现在可以使用以下方法生成 Rails 框架应用程序 docker-compose 运行。

docker-compose run web rails new . --force --database=postgresql

首先,撰写将为web使用Dockerfile.然后它会运行rails new在一个新的容器中,使用该图像。一旦完成,你就应该生成一个新的应用程序。

列出文件。

$ ls -l total 64 -rw-r--r-- 1 vmb staff 222 Jun 7 12:05 Dockerfile -rw-r--r-- 1 vmb staff 1738 Jun 7 12:09 Gemfile -rw-r--r-- 1 vmb staff 4297 Jun 7 12:09 Gemfile.lock -rw-r--r-- 1 vmb staff 374 Jun 7 12:09 README.md -rw-r--r-- 1 vmb staff 227 Jun 7 12:09 Rakefile drwxr-xr-x 10 vmb staff 340 Jun 7 12:09 app drwxr-xr-x 8 vmb staff 272 Jun 7 12:09 bin drwxr-xr-x 14 vmb staff 476 Jun 7 12:09 config -rw-r--r-- 1 vmb staff 130 Jun 7 12:09 config.ru drwxr-xr-x 3 vmb staff 102 Jun 7 12:09 db -rw-r--r-- 1 vmb staff 211 Jun 7 12:06 docker-compose.yml drwxr-xr-x 4 vmb staff 136 Jun 7 12:09 lib drwxr-xr-x 3 vmb staff 102 Jun 7 12:09 log drwxr-xr-x 9 vmb staff 306 Jun 7 12:09 public drwxr-xr-x 9 vmb staff 306 Jun 7 12:09 test drwxr-xr-x 4 vmb staff 136 Jun 7 12:09 tmp drwxr-xr-x 3 vmb staff 102 Jun 7 12:09 vendor

如果您在 Linux 上运行 Docker,则文件rails new所创建的是根用户拥有的。这是因为容器以根用户的身份运行。如果是这样,请更改新文件的所有权。

sudo chown -R $USER:$USER .

如果您在 Mac 或 Windows 上运行 Docker,您应该已经拥有所有文件的所有权,包括rails new

现在你已经有了一个新的 Gemfile,你需要再次构建图像​​。(这和Gemfile对 Dockerfile 的更改应该是唯一需要重建的时间。)

docker-compose build

连接数据库

应用程序现在可以启动,但你还没有完全到位。默认情况下,Rails期望数据库在其上运行。localhost-所以你需要把它指向db而是集装箱。您还需要更改数据库和用户名,使其与postgres图像。

替换config/database.yml的内容有以下几点:

default: &default adapter: postgresql encoding: unicode host: db username: postgres password: pool: 5 development: <<: *default database: myapp_development test: <<: *default database: myapp_test

您现在可以使用 docker 启动应用程序 - 撰写:

docker-compose up

如果一切顺利,您应该会看到一些 PostgreSQL 输出,然后几秒钟后是8212;您应该看到熟悉的重音:

Starting rails_db_1 ... Starting rails_db_1 ... done Recreating rails_web_1 ... Recreating rails_web_1 ... done Attaching to rails_db_1, rails_web_1 db_1 | LOG: database system was shut down at 2017-06-07 19:12:02 UTC db_1 | LOG: MultiXact member wraparound protections are now enabled db_1 | LOG: database system is ready to accept connections db_1 | LOG: autovacuum launcher started web_1 | => Booting Puma web_1 | => Rails 5.0.0.1 application starting in development on http://0.0.0.0:3000 web_1 | => Run `rails server -h` for more startup options web_1 | Puma starting in single mode... web_1 | * Version 3.9.1 (ruby 2.3.3-p222), codename: Private Caller web_1 | * Min threads: 5, max threads: 5 web_1 | * Environment: development web_1 | * Listening on tcp://0.0.0.0:3000 web_1 | Use Ctrl-C to stop

最后,您需要创建数据库。在另一个终端,运行:

docker-compose run web rake db:create

下面是该命令的输出示例:

vmb at snapair in ~/sandbox/rails $ docker-compose run web rake db:create Starting rails_db_1 ... done Created database 'myapp_development' Created database 'myapp_test'

查看 Rails 欢迎页面!

就这样,您的应用程序现在应该运行在您的 Docker 守护进程的端口3000上。

在 Docker for Mac 和 Docker for Windows 上,转到http://localhost:3000Web 浏览器以查看 Rails 欢迎。

如果您使用 Docker Machine,则docker-machine ip MACHINE_VM返回可添加端口(<Docker-Host-IP>:3000)的 Docker 主机 IP 地址。

二次

停止应用程序

若要停止应用程序,请运行码头工人在您的项目目录中。您可以使用启动数据库的同一终端窗口,也可以使用访问命令提示符的另一个终端窗口。这是停止应用程序的一种干净的方法。

vmb at snapair in ~/sandbox/rails $ docker-compose down Stopping rails_web_1 ... done Stopping rails_db_1 ... done Removing rails_web_run_1 ... done Removing rails_web_1 ... done Removing rails_db_1 ... done Removing network rails_default

您还可以用Ctrl-C在执行docker-compose up如果您以这种方式停止应用程序,并试图重新启动它,您可能会收到以下错误:

web_1 | A server is already running. Check /myapp/tmp/pids/server.pid.

若要解决此问题,请删除该文件。tmp/pids/server.pid,然后用docker-compose up

重新启动应用程序

要重新启动应用程序:

  • 运行docker-compose up在项目目录中。

  • 在另一个终端中运行此命令以重新启动数据库:docker-compose run web rake db:create

重建应用程序

如果对 Gemfile 或 Composed 文件进行更改以尝试一些不同的配置,则需要重新构建。有些更改只需要docker-compose up --build,但是完全重建需要重新运行docker-compose run web bundle install同步Gemfile.lock给主机,然后是docker-compose up --build

下面是第一个例子,在这种情况下,完全重建是不必要的。假设您只想将本地主机上的公开端口更改为3000在我们的第一个例子中3001更改撰写文件以公开端口。3000在新港口的集装箱上,3001,并保存更改:

ports: - "3001:3000"

现在,用docker-compose up --build,然后重新启动数据库:docker-compose run web rake db:create...

在容器内部,您的应用程序像以前一样运行在相同的端口上3000,但现在http://localhost:3001您的本地主机上仍可使用 Rails Welcome 。

更多撰写文档

  • 用户指南

  • 安装组合

  • 开始

  • 从 Django 开始

  • 从 WordPress 开始

  • 命令行引用

  • 合成文件引用

documentation, docs, docker, compose, orchestration, containers