14.7 Ruby
Ruby是一种动态的面向对象的脚本语言,具有支持反射、跨平台、设计精简等特点,在Web应用领域应用颇多。Ruby的设计受到Perl、Smalltalk、Eiffel、Ada和Lisp的影响。Ruby支持多种编程范式,如函数编程、面向对象编程、CLI交互式编程。Ruby还有动态的数据类型系统和自动的内存管理。

14.7.1 使用Ruby官方镜像
首先,在Ruby项目中创建一个Dockerfile:
- FROM ruby:2.1.2-onbuild
- CMD ["./rb-sample.rb .rb"]
然后,新建rb-sample.rb例子程序:
- say = "I love Ruby"
- 3.times { puts say }
将以上文件放在app的根目录(与Gemfile同级)。
注意
使用的官方镜像带有onbuild标签,意味着包含了启动大部分Ruby项目所需的基本指令。在构建镜像的时候,Docker会执行COPY./usr/src/app以及RUN bundle install。
然后,构建名为ruby-image的镜像:
- $ docker build -t ruby-image .
最后,创建并运行此镜像:
- $ docker run -it --name ruby-container ruby-image
由于在构建时使用了带有onbuild标签的镜像,所以在app目录下需要有Gemfile.lock文件。可以在App的根目录运行以下命令:
- $ docker run --rm -v "$(pwd)":/usr/src/app -w /usr/src/app ruby:2.1.2 bundle
- install --system
如果读者只需要运行单个的Ruby脚本,那么无需使用Dockerfile构建自定义镜像,而是通过以下命令直接使用官方Ruby镜像,带参数运行容器:
- $ docker run -it --rm --name my-running-script -v "$(pwd)":/usr/src/myapp -w
- /usr/src/myapp ruby:2.1.2 ruby your-daemon-or-script.rb
14.7.2 JRuby
JRuby类似于Python的Jython,它可运行于JVM上并支持Java的接口和类。

第一步,用户在JRuby项目中创建一个Dockerfile:
- FROM jruby:.1.7.24-onbuild
- CMD ["./jruby-sample.rb"]
第二步,新建Ruby示例代码jruby-sample.rb:
- say = "I love JRuby"
- 3.times { puts say }
将此文件放在app的根目录(与Gemfile同级)。
注意
使用的官方镜像带有onbuild标签,意味着包含了启动大部分JRuby项目所需的基本指令。在构建镜像的时候,会执行COPY./usr/src/app以及RUN bundle install。
第三步,构建自定义镜像:
- $ docker build -t jruby-image .
第四步,创建并运行此镜像:
- $docker run -it --name jruby-container jruby-image
由于在构建时使用了带有onbuild标签的镜像,所以在app目录下需要有Gemfile.lock文件。这时可以在app的根目录运行以下命令:
- $ docker run --rm -v "$(pwd)":/usr/src/app -w /usr/src/app jruby:1.7.15 bundle
- install --system
如果读者只需要运行单个的JRuby脚本,那么无需使用Dockerfile构建自定义镜像,而是通过以下命令直接使用官方JRuby镜像,带参数运行容器:
- $ docker run -it --rm --name my-running-script -v "$(pwd)":/usr/src/myapp -w
- /usr/src/myapp jruby:1.7.15 jruby your-daemon-or-script.rb
14.7.3 Ruby on Rails
Rails是使用Ruby语言编写的网页程序开发框架,目的是为开发者提供常用组件,简化网页程序的开发。只需编写较少的代码,就能实现其他编程语言或框架难以企及的功能。经验丰富的Rails程序员会发现,Rails让程序开发变得更有乐趣。

1.使用官方镜像
第一步,用户在Rails项目中创建一个Dockerfile,将此文件放在项目根目录(与Gemfile同级),Dockerfile内容如下:
- FROM rails:onbuild
可见用户使用了onbuild标签,即此基础镜像会自行完成一些基本的构建工作并包含了大部分启动一个Rails项目所需的基本指令。
Dockerfie内容如下:
- FROM ruby:2.3
- # throw errors if Gemfile has been modified since Gemfile.lock
- RUN bundle config --global frozen 1
- RUN mkdir -p /usr/src/app
- WORKDIR /usr/src/app
- ONBUILD COPY Gemfile /usr/src/app/
- ONBUILD COPY Gemfile.lock /usr/src/app/
- ONBUILD RUN bundle install
- ONBUILD COPY . /usr/src/app
第二步,构建自定义镜像:
- $ docker build -t rails-image .
第三步,创建并运行此镜像:
- $ docker run --name rails-container -d rails-image
此时用户可以使用浏览器访问http://container-ip:3000查看服务,当然,也可以映射到本地主机端口。
- $ docker run --name some-rails-app -p 8080:3000 -d my-rails-app
现在读者可以使用浏览器访问http://localhost:8080或者http://host-ip:8080。
2.使用Compose搭建Rails应用
下面使用Docker Compose来配置和运行一个简单的Rails+PostgreSQL应用。
第一步,确定项目文件夹内容。新建一个名为rails-compose-example的项目文件夹,在其根目录新建一个Dockerfile文件,内容如下:
- FROM ruby:2.2.0
- RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
- RUN mkdir /code
- WORKDIR /code
- ADD Gemfile /code/Gemfile
- ADD Gemfile.lock /code/Gemfile.lock
- RUN bundle install
- ADD . /code
- Gemfile内容如下:
- source 'https://rubygems.org'
- gem 'rails', '4.2.0'
下面用户新建docker-compose.yml文件,内容如下:
- version: '2'
- 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
第二步,构建Rails项目。可以使用docker-compose run指令构建并启动此Rails项目:
- $ docker-compose run web rails new . --force --database=postgresql --skip-bundle
