使用 docker 和 MySQL 设置 Ruby on Rails

Docker 是一项将彻底改变您的开发方式的技术。

如果您喜欢我所教的内容,如果您觉得这有帮助,请给它一个心和一个友好的评论。

我在本教程中教的是如何在 docker 容器中开发 rails 应用程序,这样您只需在 mac 上设置 docker 即可开发 rails 应用程序。 (启动时不需要 Rails 或 Ruby 操作系统配置。)

这在企业中很受欢迎,因为容器化或标准化软件单元是应用程序制作方式的一场革命。

如果您是 docker 新手,并且遵循本教程。这开启一段让您可以_无限地_扩展的应用程序运行的奇妙旅程。您可以通过 docker 容器开始开发所有内容,而无需担心主机系统配置。

这就是我要教的内容。

这是一个多部分系列的开始,它将教您如何制作 3 个 docker 容器并将它们发布到 heroku

  1. Ruby on Rails 后端。

2.mysql数据库

  1. 反应应用

提供面向初学者的有用资源。

我将向您展示如何在 mac 上安装 docker。

Docker 也可用于windows。

先决条件:

1.基本命令行。

2.一个文本编辑器。我将使用VS 代码。

3.注重细节。

有帮助但不是 nessesscary。

1.红宝石知识

  1. .yaml 或 .yml 文件的知识

  2. docker知识。

有用的网址。

码头工人文档

访问官网并安装docker。

docker for mac 桌面

入门

打开您的终端并验证 docker 安装是否正确。

docker --version

进入全屏模式 退出全屏模式

您的输出应该看起来像这样,但可能是不同的版本。

Docker version 19.03.8, build afacb8b

进入全屏模式 退出全屏模式

如果您没有看到任何版本或出现错误。返回到docker for mac desktop的链接,然后再次尝试执行这些步骤。

在继续之前,请确保您打开了 docker 桌面。

按命令+空格键打开可搜索视图。

然后搜索码头工人。

桌面右上角应该可以看到一个背面带有集装箱的小鲸鱼图标。

点击它。

现在点击打开桌面。

确保 docker 桌面一直在运行,如果 docker 关闭,则 docker 命令将不会执行。

系统将提示您执行 docker 的 hello world 版本,我强烈建议您进行简单的演练。

如果一切都与 hello world 应用程序一起工作,最后一项检查以确保您可以按照本教程学习 rails 应用程序是确保您可以访问 docker-compose,这应该与其余的 docker 命令行工具一起安装,并且这是要确保的命令。

docker-compose -v 

进入全屏模式 退出全屏模式

预期的输出。

docker-compose version 1.25.5, build some-hexadecimal

进入全屏模式 退出全屏模式

如果版本不同,一切都应该仍然有效。

教程开始。

首先,让我们创建一个名为 rails-docker 的空目录。

mkdir rails-docker

进入全屏模式 退出全屏模式

cd 进入目录。

cd rails-docker

进入全屏模式 退出全屏模式

我们要创建的第一个文件是 Gemfile,这是因为我们将让 docker 实例化整个开发环境,而不是直接通过我们的主机操作系统运行 rails 命令。

touch Gemfile

进入全屏模式 退出全屏模式

在 Gemfile 中,我们将编写获取 ruby gem 的源代码。

source 'https://rubygems.org'

进入全屏模式 退出全屏模式

在源代码下方为我们想要的 rails 版本添加一行。

gem 'rails', '5.0.7'

进入全屏模式 退出全屏模式

如果您想要最新版本的 rails(6.0.3.2 在撰写本文时),您可以安装您想要的任何版本,但这是我已经测试并推荐用于本教程的版本。

我们还需要清空 Gemfile.lock,这是 Rails 记录 Gemfile 版本的地方。

如果没有空的 Gemfile.lock,应用程序将无法运行

touch Gemfile.lock

进入全屏模式 退出全屏模式

现在我们需要创建一个 Dockerfile,这是我们定义 docker 镜像将具有哪些技术的地方,例如 ruby 版本 node.js 版本。

touch Dockerfile

进入全屏模式 退出全屏模式

在 Dockerfile 中,我们将指定 docker 制作镜像以运行 rails 应用程序的最低要求。每个新命令都可以被认为是一个脚本,使层成为一个操作系统。

首先是其他一切都需要在其上运行的编程语言。在我们的例子中,使用FROM命令。

FROM ruby:2.5.1 

进入全屏模式 退出全屏模式

Dockerfile

接下来是 RUN 命令,典型的 RUN 后缀是 apt-get update && apt-get install 可能会出现问题,因为更新应该发生在 dockerhub 上的 docker 映像之外。查看详细说明此处

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

进入全屏模式 退出全屏模式

build-essential是我们应用程序的可信编译器包。

libpq-dev是一个编译器系统,可帮助将端口从虚拟机转发到数据库。链接中有详细的解释。

nodejs是一个 javascript 引擎,可让您在浏览器之外运行 javascript。

我们将添加更多 RUN 命令,您可以将其视为命令行脚本的 docker 等效项。

RUN mkdir /app

进入全屏模式 退出全屏模式

这将仅在我们的 docker-image 的上下文中创建一个目录。

现在我们要使用WORKDIR命令使 /app 目录成为工作目录,它相当于 cd 进入文件夹的 bash。这意味着您在此行之后运行的所有命令都将发生在 /app 目录中。

WORKDIR /app

进入全屏模式 退出全屏模式

我们必须添加 Gemfile 和 Gemfile.lock 供 docker 参考,以构建我们的 rails 应用程序。

ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock

进入全屏模式 退出全屏模式

由于我们在将要构建的目录中有 Gemfile 和 Gemfile.lock,因此下一个命令是 RUN bundle install。这会添加所有的 rails 依赖项。

RUN bundle install

进入全屏模式 退出全屏模式

现在我们想在安装后将当前目录添加到应用程序目录中。

ADD . /app

进入全屏模式 退出全屏模式

完成的文件应该是这样的。

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

进入全屏模式 退出全屏模式

这是每次我们在命令行上使用 build 命令时都会引用的文件。

作为我们配置的下一步,让我们创建一个 docker-compose.yml。

touch docker-compose.yml

进入全屏模式 退出全屏模式

在这个文件中,我们将为这个应用程序中涉及的服务(例如数据库)定义一个配置对象。

在此文件中,由于 docker 对象的定义方式,不正确的缩进会导致构建失败。

在我引导您了解正确缩进的情况后,我将提供文件的完整列表。

version: '2'
services: 

进入全屏模式 退出全屏模式

在服务下,我们将为应用程序定义外部服务,例如数据库(MYSQL)。

db:
    image: mysql:5.7

进入全屏模式 退出全屏模式

这就是我们从 docker hub 中提取图像数据库的方式,在我们的例子中是 MySQL。

我们希望我们的数据库在重新启动和环境定义的访问时表现的一些配置:变量。

restart: always
    environment:
        MYSQL_ROOT_PASSWORD: password
        MYSQL_DATABASE: app
        MYSQL_USER: user
        MYSQL_PASSWORD: password

进入全屏模式 退出全屏模式

我们希望为我们的应用程序提供端口转发服务,以便 docker 正在运行的进程链接到主机操作系统正在运行的进程。

    ports:
       - "3307:3306"

进入全屏模式 退出全屏模式

让我们添加下一个名为 app 的服务:

app: 

进入全屏模式 退出全屏模式

在应用程序下方,我们希望我们的应用程序引用 rails 应用程序。这意味着不像我们使用 MySQL 那样从 docker hub 调用图像。我们将告诉 docker 构建我们在 Dockerfile 中配置的应用程序:

我们将使用 build: 添加当前目录。

  build: .

进入全屏模式 退出全屏模式

现在我们将使用以下命令运行 rails:然后将其绑定到端口 0.0.0.0

command: rails s -p 3000 -b '0.0.0.0'

进入全屏模式 退出全屏模式

我们需要一个叫做volumes的东西:

用来说宿主系统共享/app目录的目录。

        volumes: 
            - ".:/app"

进入全屏模式 退出全屏模式

我们要设置端口转发,以便当 docker 在容器中引用其端口 3000 时,它会将其转发到 3001 到操作系统,就像我们为数据库所做的那样。

    ports: 
       - "3001:3000"

进入全屏模式 退出全屏模式

让我们让应用程序服务依赖于 db: 服务,这样当我们使用我们的 rails 应用程序时,它会引用数据库来存储数据并链接到数据库。

depends_on:
      - db
links:
      - db

进入全屏模式 退出全屏模式

现在我们要为 rails 应用程序添加环境变量。

         environment:
             DB_USER: person
             DB_NAME: app
             DB_PASSWORD: password
             DB_HOST: db

进入全屏模式 退出全屏模式

整个文件应该是这样的。

version: '2'
services:
    db: 
        image: mysql:5.7
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: password
            MYSQL_DATABASE: app
            MYSQL_USER: user
            MYSQL_PASSWORD: password
        ports:
            - "3307:3306"
    app: 
        build: .
        command: bundle exec rails s -p 3000 -b '0.0.0.0'
        volumes: 
            - ".:/app"
        ports: 
            - "3001:3000"
        depends_on:
            - db
        links:
            - db
         environment:
            DB_USER: root
            DB_NAME: app
            DB_PASSWORD: password
            DB_HOST: db

进入全屏模式 退出全屏模式

码头工人-compose.yml

我们将再次与命令行交互,我们在所有普通的 rails 命令前加上 docker-compose run app

这是下载所有样板导轨的命令。

注意:第一次需要几分钟,但下次会很快。 --api 标志可以添加,是可选的,但如果您使用嵌入式 ruby 视图而不是前端框架,它会更容易上手。

docker-compose run app rails new . --force --database=mysql --skip-bundle

进入全屏模式 退出全屏模式

这应该已经创建了一个 Rails 结构和一个数据库结构来使用,但我们还有一些工作要做。

打开在 rails 安装中下载的 config 文件夹中的 database.yml。删除所有评论。

没有所有的评论。它应该看起来像这样。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password:
  host: localhost

#...rest of file... 

进入全屏模式 退出全屏模式

在 pool: 5 下,删除用户名、密码、主机并用此代码替换它们,以便它们引用 docker-compose.yml 中的 ENV 变量

database: <%= ENV['DB_NAME'] %>
  username: <%= ENV['DB_USER'] %>
  password: <%= ENV['DB_PASSWORD'] %>
  host: <%= ENV['DB_HOST'] %>

进入全屏模式 退出全屏模式

我们希望通过将文件的其余开发、测试和生产环境设置为默认环境来标准化命名约定。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  database: <%= ENV['DB_NAME'] %>
  username: <%= ENV['DB_USER'] %>
  password: <%= ENV['DB_PASSWORD'] %>
  host: <%= ENV['DB_HOST'] %>

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default


进入全屏模式 退出全屏模式

我们要让我们在 docker-compose.yml 中创建的数据库用户名、密码和主机引用环境变量

现在,在命令行中我们可以运行 docker-compose build

docker-compose build

进入全屏模式 退出全屏模式

这将捆绑安装从 rails 样板中提取的 rails 应用程序的所有 gem。

现在在命令行上运行 docker-compose up 以启动 MySQL 数据库和 rails 应用程序。

docker-compose up

进入全屏模式 退出全屏模式

当您转到localhost:3001时,您将看到 rails 徽标。

故障排除和重新配置。

我将通过一个多部分系列来跟进这一点,展示如何将多个容器部署到 Heroku 以制作全栈容器化应用程序。

为了轻松地做到这一点,我们必须知道如何拆掉这个应用程序并重做它,也许你想知道这是否适用于最新版本的 ruby 和 rails。或者使用 PostgreSQL 数据库代替。

第一步是打开 docker 仪表板并清除数据。

[

](https://res.cloudinary.com/practicaldev/image/fetch/s--VzhIiToe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/2lsn1kl0wfidhd0uvey4.png)

单击屏幕左上角的错误图标。

[

单击红色的清理/清除数据,是的,我们确定。

一旦您确认这将重新启动 docker,而不是打开仪表板,而是在后台运行,以便您可以使用命令行。

现在从文件目录中删除 rails 应用程序,小心不要删除任何与 docker 相关的文件,Gemfile 或 Gemfile.lock

您可以在 vscode 中通过在按住命令键的同时单击文件和文件夹来执行此操作。

右键单击所选文件并选择删除并确认。

 

](https://res.cloudinary.com/practicaldev/image/fetch/s--UUyy98OL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/6q3ckcr9a0dcvplcu47x.png)

打开Gemfile并删除除source和rails gem之外的所有内容,您可以删除Gemfile的内容并将这两行代码复制并粘贴到文件中。

您还可以尝试使用不同的 rails 版本进行其余的重建,如果没有成功,您可以重复上述步骤进行故障排除和重新配置。

source 'https://rubygems.org'
gem 'rails', '~> 5.0.7', '>= 5.0.7.2'

进入全屏模式 退出全屏模式

现在我们想让 Gemfile.lock 为空,因为当我们运行 docker-compose build 时它会再次被填充。

这可以通过单击文件内容并按 command + a 来轻松完成,突出显示所有内容,然后按删除,将文件留空。

现在您可以转到命令行并运行创建新图像的步骤。确保首先运行 docker

这些命令是。

docker-compose run app rails new . --force --database=mysql --skip-bundle

进入全屏模式 退出全屏模式

这将需要一段时间,因为它就像第一次一样。

建立你拉进来的东西。

docker-compose build

进入全屏模式 退出全屏模式

在重新安装时,进入 database.yml 并用这个引用环境变量的文件替换它。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  database: <%= ENV['DB_NAME'] %>
  username: <%= ENV['DB_USER'] %>
  password: <%= ENV['DB_PASSWORD'] %>
  host: <%= ENV['DB_HOST'] %>

development:
  <<: *default


test:
  <<: *default


production:
  <<: *default

进入全屏模式 退出全屏模式

为了确保它运行...

docker-compose up

进入全屏模式 退出全屏模式

如果第一次这不起作用,您可能需要重新启动 docker,这可以通过单击桌面右上角的图标并退出应用程序来完成。

访问localhost:3001,您会看到自己回到了起点。

结论

Docker 有一个学习曲线,但从长远来看,它将为您节省大量时间,而不必担心与操作系统相关的错误。

我将做更多从这个分支出来的教程,向您展示如何使用 Rails 和 react 将全栈 Web 应用程序制作到生产环境中。

如果您在使其正常工作时遇到问题,请发表评论,我会回复您。

这里有一些额外的资源。

在github上完成教程。

查看以下内容。

码头工人-compose.yml

Dockerfile

和 config 文件夹中的 database.yml

一个优秀的 youtube 来自

Chandra Shetigar做了出色的教程关于如何使用 docker 设置 ruby on rails 应用程序,但将 docker 的设置留给您,并且没有向您展示如何拆卸,

重建或重新配置。

如果这有助于您开始使用 docker,请给它一颗心、独角兽和一个标签。

在本系列的下一部分中,我将向您展示如何在 docker 容器中设置 React 应用程序。

猜你喜欢

转载自blog.csdn.net/zhishifufei/article/details/127907841