如何在 Docker上部署一个 Rails 应用

[摘要] Docker 官方镜像库已经提供了各种web应用而创建的Docker image,直接拿下来使用即可。如果自己创建Docker image的话,可以使用Docker的building tools来创建你的Docker容器,也可以通过Onbuild的命令行方式来创建Dockerfiles,而且这种使用更加纯粹的Dockerfiles方式会带给你更多的益处:

1. 你能够更多使用代码的方式控制和定义Docker镜像,即便你对操作系统本身不感冒,你仍然可以通过编辑Dockerfiles的方式来定制你的操作系统。
2. Docker内部标签提供了不同的语言或者框架版本,这样你将更容易的选则各种版本。
3. 如果你使用标准的Docker,你将会从Docker社区支持和贡献中获取更多的好处。

书归正传,现在我们就实战一下,看看如何在Docker中创建一个Rails应用:
#创建一个新的Rails app

$ rails new foobar
$ cd foobar
$ echo 'FROM rails:onbuild' > Dockerfile
$ docker build -t my-rails-app .
$ docker run -d -p 3000:3000 my-rails-app
$ curl 0.0.0.0:3000
<!DOCTYPE html>
<html>
  <head>
    <title>Ruby on Rails: Welcome aboard</title>
    …

如果不知道这个是用来做什么的? 可以先看看rails:onbuild Dockerfile:

FROM ruby:2.1.5

# 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

RUN apt-get update && \
  apt-get install -y nodejs --no-install-recommends && \
  rm -rf /var/lib/apt/lists/*
RUN apt-get update && \
  apt-get install -y \
    mysql-client postgresql-client \
    sqlite3 --no-install-recommends && \
  rm -rf /var/lib/apt/lists/*

EXPOSE 3000
CMD ["rails", "server"]

现在看上去就非常清晰明了:Ruby的版本,源文件所在的位置和应用是如何运行的。

如果你是用Mac系统,你需要Gemfile.lock文件来关联Linux库的版本,这有一个很简单的命令:

$ docker run --rm -v "$(pwd)":/usr/src/app -w /usr/src/app ruby:2.1.5 bundle install

这样启动一个包含一个关联你本地文件的文件系统的临时容器,所以Gemfile.lock文件被创建后将会被写到你本地的文件系统里面,而并不仅仅是写到了容器的文件系统中!

为什么使用Onbuild方式要比building tools更好? 我想其中一点就是定制化更容易些。例如你想让你的Rails应用使用thin server而不是webrick,你仅需要在你app的Dockerfile里面增加thin gem替换即可,如:

$ echo 'CMD ["thin", "start"]' >> Dockerfile
$ docker build -t my-rails-app .

总之,Docker的这种灵活性是最讨人喜欢的。
原文:how to deploy a rails app to docker

u2

Related Posts

rancher v2.x 初体验

rancher v2x

Read more

sqlalchemy.exc.TimeoutError: QueuePool limit of size 5 overflow 10 reached

Python3 + Flask + mysql5.7搭建的w…

Read more

You Missed

一年前让英伟达蒸发6000亿美元的中国AI,现在被黄仁勋请上了CES的PPT

  • u2
  • 6月 7, 2026
  • 28 views

当AI开始”破坏”:Anthropic告诉我们,每个用户都该重新审视自己的使用方式

  • u2
  • 6月 6, 2026
  • 33 views

10款大模型同台黑客测试:GPT-5.5拿了王冠,DeepSeek便宜15倍,Gemini直接退赛

  • u2
  • 6月 5, 2026
  • 35 views

30天,0天,90天:一纸行政令,把AI公司的”自由发布”踩了急刹车

  • u2
  • 6月 4, 2026
  • 44 views

AI很厉害,可你省的人力费还不够买Token!

  • u2
  • 6月 2, 2026
  • 61 views

RSI取代AGI成为新热词:AI能自我进化吗?

  • u2
  • 5月 30, 2026
  • 122 views