DockerでRails + Nginx + Postgresの環境を構築する。その①

2017年12月22日

タイトルのように、
何回かに分けてRails + Nginx + Postgresの環境を
Dockerで構築していきます。

構築を行う前に簡単にDockerの説明から。

※書いていたらそれなりの長さになったので、
Dockerをインストールして、
ちょっと触ってみるところまでで一旦切りました。

Dockerは、
PC上にコンテナという仮想のサーバを作成して、
その上にRailsやPostgres,Nginxなどの環境を構築するものです。

Dockerの基本的な仕組み -Virtual Machineとの違い-

下に図を貼りつけましたが、

dockerとvagrantの比較

「DockerはVirtual Boxなどの仮想マシンとどう違うの?」
というように比較して語られることが多いです。

図では、

左側がDocker
右側がVirtual BoxなどのVirtualMachineの
場合の構成になっています。

VMは図を見てわかるように
Hypervisor(ハイパバイザー)という仮想化技術を挟んで、
サーバを仮想的に構築します。
このHypervisor(ハイパバイザー)を使用する場合、
メモリなどのリソースをVMごとに割り当て、
ゲストOS上でアプリケーションを稼働させることになるため、
ゲストOSの分容量であったり、メモリなどのリソースを
大きく取られてしまうことになります。

対して、
Dockerのようなコンテナ型のものは、
リソースやカーネルをホストOSと共有するので、
VM型のように余分なリソースを食われることが
少なく、イメージサイズも小さい軽量なものとなります。
( Windows,Macなどの場合は、ホストOS上にハイパバイザー型の仮想マシンを立ち上げそのゲストOS上にDockerEngineを動かす形になるので、
Linux版にDockerをインストールをするのが、これらのメリットを
多く受けられるようです。)

 

このような軽量であることのメリット以外にも、
開発環境で作成したアプリケーションをイメージ化して本番にデプロイができるので、
本番環境と開発環境の差異を極限まで小さくできるという
メリットもあります。

本番環境にDockerさえ入っていれば、
本番環境にDockerのイメージを配置してそのまま、
動かすことができてしまいます。
コードでデプロイするのではなく、
コンテナごと配布する形になるそうです。

 

Dockerの仕組みやメリットについての説明は
これくらいにして、
次は実際の構築をやっていきます。

 

 

Dockerのインストール

 

今回は、
MacでのDockerのインストールの仕方だけ説明します。

インストールはこちらからできます。
https://store.docker.com/editions/community/docker-ce-desktop-mac

インストールの方法は簡単で、
リンク先からDocker.dmgをダウンロードして起動するだけです。

特段コマンドを打ったりする必要はありません。

 

 

Dockerを触ってみる。基本コマンドの説明

 

まずは簡単に触ってみてDockerのイメージを
掴んでいきます。
コンソールから以下コマンドを叩いてみましょう。

docker pull hello-world

 

実行結果は以下のようになります。

$docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9a0669468bf7: Already exists
Digest: sha256:cf2f6d004a59f7c18ec89df311cf0f6a1c714ec924eebcbfdd759a669b90e711
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the

    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

 

docker run は、コンテナの起動を行なうコマンドです。

実行結果を補足するために
以下に図を用意しました。

Dockerの概要

Dockerはクライアントーサーバ型のアーキテクチャになっており、
インストールした直後から起動している
Docker Daemonという
常駐型のプロセスがコマンドを待ち受けています。

そこに、
先ほどのようにrunコマンドを実行すると、
ClientからDockerデーモンにhello-worldというコンテナを
起動するように命令が飛びます。

デーモンは、命令の通りローカルに保存されているイメージ(コンテナを作成するための雛形のようなもの)を調べて、
命令どおりのhello-worldというイメージがすでに存在するか
確認します。

今回の場合。
実行結果にも”Unable to find image ‘hello-world:latest’ locally”と出力されているように
ローカルでイメージが見つからないので、
Registryからイメージを取得してコンテナを作成しています。

図でいうところの青色の矢印がこの流れ
になります。

 

ローカルにどのイメージが存在するか下記コマンドで
確認できます。

docker images

先ほどのrunコマンドを実行した後であれば、
hello-worldイメージが取得されていることを確認できる
と思います。

この状態でrunコマンドを実行すると
図の赤い矢印がさすようにすでに存在するイメージを
再利用してコンテナを作成します。

お次は、
railsのコンテナを作成していくので、
まずはrubyのイメージを取得しましょう。

docker pull ruby:2.4.2

取得できたら、
コンテナの中をみて見ましょう。

$docker run -it ruby:2.4.2 bin/bash
root@e77b7d2cc4a0:/#
root@e77b7d2cc4a0:/#
root@e77b7d2cc4a0:/# ruby -v
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux]
root@e77b7d2cc4a0:/#

 

 

runコマンドに -i と -t オプションを与えてあげて、
シェルを起動させると、
コンテナの中をみることができます。
railsサーバの構築とは直接関係ないですが、
何か詰まった時に確認できる方法なので、
知っておくと良いと思います。

また、
bashを起動した状態で別ウィンドウから

docker ps

と叩くと起動しているコンテナが確認できます。

dockerを扱うにあたり、
images, run , pull , ps あたりは基本のコマンドなので
覚えておくと良いと思います。

ここまでは、
コンテナを取得・起動して基本のコマンドについて
画像付きで説明しましたが、
このあとは実際にrailsサーバを立てていきます。

と思ったのですが、
長くなったのでこの記事は一旦ここまでと
します。

また別の機会に
続きを書いていきます。