[摘要] 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