©
This document uses PHP Chinese website manual Release
这个快速启动指南将向您展示如何使用 DockerCompose 来设置和运行 Rails/PostgreSQL 应用程序。在开始之前,你需要组合安装...
首先设置构建应用程序所需的四个文件。首先,由于您的应用程序将在包含所有依赖关系的 Docker 容器中运行,因此您需要准确定义容器中需要包含的内容。这是通过使用名为的文件完成的Dockerfile
。首先,Dockerfile 由以下部分组成:
FROM ruby:2.3.3RUN 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 publicdrwxr-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: 5development: <<: *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:3000web_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: 5web_1 | * Environment: development web_1 | * Listening on tcp://0.0.0.0:3000web_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'
就这样,您的应用程序现在应该运行在您的 Docker 守护进程的端口3000上。
在 Docker for Mac 和 Docker for Windows 上,转到http://localhost:3000
Web 浏览器以查看 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 开始
命令行引用
合成文件引用