• TOP
  • ブログ
  • デザイナー、コーダーのための Docker 入門(1)導入

ブログ

デザイナー、コーダーのための Docker 入門(1)導入

はじめに

こんにちは、技術グループの marunaga です。イングスではサイトにCMSを導入する際、WordpressとともにMovable Type でサイト構築するケースが多いですが、その際デザイナー、コーダーのみなさまでローカル環境の作成に苦労された方は多いのではないかと思います。また、一旦ローカル環境を作成したあとに、OS 自体をバージョンアップしたら動作しなくなってしまった、なんていう経験はありませんでしょうか(私です)。

今回はWEB制作現場のみなさまに、 Docker を使って手軽で簡単に作り直しができ、いつ作成しても同じ環境を構築する方法のご紹介です。インフラのプロの方から見ると「...」もある内容かしれませんが、フロントエンド陣を暖かく見守る目線でご覧いただけると幸いです。

Docker とは


Docker は Linux の「コンテナ」という機能を利用したサーバ仮想化のための技術で、Immutable Infrastructure(不変のインフラ)という考え方を実現するために注目されています。Virtual Box や VMWare のような仮想マシンを使うイメージに近いですが、それらよりも軽量な仮想化技術という位置づけになります。

特長やメリットについてはいろいろなブログで紹介されていますので、この記事では思い切って省き、動作させるまでの一連のことについて順を追ってまとめていくことにします。

Docker を使うためには


Docker は Linux も「コンテナ」という機能を使用しているため、Mac や Windows では直接は動作させることはできません。そのため、それらのプラットフォーム上で使用するためには、一旦 Docker 専用の仮想マシンである Boot2Docker(boot2docker-vm)を VirtualBox 上で起動し、その上で Docker を使用するという方法を使います。(同じような方法に、Vagrant で VirtualBox 上に Linux の仮想マシンを作成し、その上で Docker を使用する、という方法もありますが、ちょっと敷居は高めです)

パッケージのダウンロード 〜 インストール


最新のインストーラーは Installing Docker on Mac OS X の「Docker for OS X Installer」リンクから、GitHub の boot2docker/osx-installer に移動して入手します。

今回は以下のバージョンで導入しました。VirtualBox も同時にインストールされる様ですが、すでにインストールしている場合も支障はありませんでした。

  • Boot2Docker 1.3.2 (Docker v1.3.2, Linux v3.16.7)
  • Boot2Docker Management Tool v1.3.2
  • Docker Client v1.3.2
  • VirtualBox v4.3.18-r96516


ここはおとなしく指示通りに進みます。

01.png02.png03.png

Boot2Docker の初期化

インストール完了後、Applications に入っている boot2docker を起動するか、コマンドラインで以下のコマンドを実行して初期化を行います。

$ boot2docker init

起動のためのコマンドは以下の通りです。

$ boot2docker start

無事に Boot2Docker が起動したら、docker コマンドを使用できるようにするために、以下のコマンドを実行します。

$ $(boot2docker shellinit)

これで docker コマンドを使うためのお膳立てが整いました。以下のコマンドを実行すると hello-world というイメージをダウンロードして起動することができます。

$ docker run hello-world

Unable to find image 'hello-world' locally
hello-world:latest: The image you are pulling has been verified
511136ea3c5a: Pull complete
7fa0dcdc88de: Pull complete
ef872312fe1b: Pull complete
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.
(Assuming it was not already locally available.)
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

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


では実際に Docker を動かしながら基本的な使い方について追っていきましょう。

公式の Apache のイメージを使ってみる


Docker にはさまざまな OS や言語、ミドルウェアがあらかじめ導入されたイメージを登録・公開するための Docker Hub Registory というサービスがあります。

自分自身でイメージを作成することも可能ですが、まずは Docker Hub で公開されているイメージをダウンロードして試してみることで、Docker がどのようなものかを体験してみると良いでしょう。

わかりやすそうな例として、最初に Apache のイメージを使ってみたいと思います。
まずは オフィシャルの Apache(httpd)イメージ を Docker Hub から取得しておきます。 コマンドは以下のとおりです。

$ docker pull httpd


最後の http の部分がイメージの名前です。Docker イメージは様々なユーザーにより公開されていますが、初めのうちは Docker 社が用意している公式のイメージを使用するほうがよいでしょう。 公式のイメージには以下のスクリーンショットのように、イメージ名の横に青いバッジがついています。

04.png


イメージのダウンロードが完了したら、いよいよイメージを起動してみます。
コマンドは以下のとおりです。

$ docker run --name test-apache -p 8080:80 -itd httpd


起動しているかどうかは、以下のコマンドで確認できます。

$ docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
18c20f86d62f httpd:latest "httpd-foreground" 8 seconds ago Up 6 seconds 0.0.0.0:8080->80/tcp test-apache
STATUS 欄が Up となっていれば「起動中」です。

今度は、実際にブラウザからアクセスしてみましょう。
まずは以下のコマンドを使って、コンテナを起動させている Boot2Docker の IP アドレスを調べます。

$ boot2docker ip

The VM's Host only interface IP address is: 192.168.xx.xx
表示されたメッセージの 192.168.xx.xx の部分が目的の IP アドレスです。 この値を元に http://192.168.xx.xx:8080/ という URL を組み立ててブラウザのロケーションバーに入力して下さい。

05.png


確認できました!コンテンツが配置されていないので何も表示されませんが、Apache は起動しています。

一旦ここで、先ほどのコマンドの説明です。

$ docker run --name test-apache -p 8080:80 -itd httpd


docker run <image name> というのがコンテナを起動するコマンドの基本的な形です。上記の例では、これにいくつかのオプションを付け加えています。

  • --name <container name>:起動するコンテナの名前をつけるオプションです。
  • -p <host port>:<container port>:起動するコンテナが開放するポートを指定するオプションです。<host port> を合わせて設定することで、ポートフォワーディングを設定し、Boot2Docker のポートからアクセスできるようにしています。
  • -itd:ひとまとめになっていますが、それぞれ -i-t-d のオプションになります。
  • -i:コンテナの標準入力を開くためのオプションです。
  • -t:tty(端末デバイス)を確保するためのオプションです。
  • -d:バックグラウンドで実行するためのオプションです。


特別なことがない限り -i-t はセットで付けておいたほうがよいでしょう。 また --name は起動したコンテナを停止したり削除したりするときにも用いるので、付けておいたほうが無難です。

ローカルネットワーク内の端末からアクセスするためには


ここまでで、自分自身の端末からは Apache にアクセスすることができました。
しかし、起動した Apache を社内の人からもアクセスしてもらおうとして http://192.168.xx.xx:8080/ を誰かに伝えても、その人はアクセスすることができません。 これは使用している端末内限定のプライベートな環境(ホストオンリーネットワーク)でコンテナが動作しているためです。

これを解決するためには、Boot2Docker が動作している VirtualBox 側で、Boot2Docker と ホスト PC 間のポートフォワーディングを設定する必要があります。
コマンドは以下のものを使用します。

$ VBoxManage controlvm "boot2docker-vm" natpf1 "http,tcp,<host ip>,10080,,8080"


<host ip> の値にはローカルネットワーク内におけるホスト PC の IP アドレスを設定して下さい。上記の例では、http という名前で Boot2Docker の 8080 ポートをホスト PC の 10080 ポートにポートフォワーディングしています。組み立てた URL http://192.168.xx.xx:10080/ でアクセスしてみると...

06.png


のように、ローカルネットワーク内の端末からアクセスできます。 なお、設定を削除する場合は以下のようにコマンドを実行して下さい。

$ VBoxManage controlvm "boot2docker-vm" natpf1 delete http


参考:動いているVMにNatのポートフォワードの設定をCLIから変更する

Docker コンテナにホスト側のディレクトリをマウントするには


社内のメンバーにも見てもらえるように設定ができると、自ずとなにかコンテンツを載せてみたくなるものです。Docker コンテナ上にコンテンツを配置するにはおおまかに言うと2つの方法があります。

  1. ファイルをコンテナ内にコピーする
  2. ホスト側のディレクトリをコンテナにマウントする


公式のイメージを利用した今回のような場合では 2. の方法を選択するほうが、動作させながらコンテンツ調整することもできるので取り回しがいいのですが、実現するためには以下の様な手順を踏む必要があります。

  1. boot2docker-vm と、ホスト側のディレクトリを VirtualBox の「共有フォルダ」機能で関連付ける
  2. boot2docker-vm 上で、ホスト側のディレクトリをマウントする
  3. Docker コンテナに 2. でマウントした boot2docker-vm のディレクトリをマウントする


Boot2Docker のバージョンが 1.3 以降の場合、Mac 側の /Users ディレクトリは自動的に boot2docker-vm 上の /Users ディレクトリに関連付けられていて、自動マウントが実行されているので、docker コマンド実行時に -v オプションを使うことでマウントすることができます。

$ docker run -v $(pwd):/current -itd <image name>


-v オプションは -v <host dir>:<container dir> というように指定することで、<container dir><host dir> をマウントすることができます。 上記の例では、$(pwd) の部分で現在のカレントフォルダを取得し、コンテナ上の /current ディレクトリにマウントしています。

ただ、/Users 以外のディレクトリにマウントしたいコンテンツを配置している場合は、VirtualBox の「共有フォルダ」を自動でマウントすることができないため以下の様な手順が必要となります。

  1. VirtualBox の「共有フォルダ」手動で設定する。
    $ VBoxManage sharedfolder add boot2docker-vm --name <volume name> --hostpath <path> --transient
  2. boot2docker-vm にログインする。
    $ boot2docker ssh
  3. マウント用のディレクトリを作成して、ホスト側のディレクトリをマウントする
    $ sudo mkdir -p <path>
    $ sudo mount -t vboxsf <volume name> <path>


...ちょっと毎回はやっていられないですね。そこで、上記の一連の処理をまとめたシェルスクリプトを作成しましたので、そのご紹介をします(長い前置きでしたが...)。
まずは、以下の一連のコードを mount_cd.sh という名前で保存して下さい。

#!/bin/bash

# 仮想マシンの名前
VMNAME="boot2docker-vm"

# 作業ディレクトリ(カレントディレクトリ)
WORKDIR=`pwd`

# VirtualBox に一時的な共有フォルダ設定を追加
VBoxManage sharedfolder \
add $VMNAME \
--name $(basename $WORKDIR) \
--hostpath $WORKDIR \
--transient

# vboxsf モジュールのロード
boot2docker ssh "sudo modprobe vboxsf"

# 現在のディレクトリが `/Users` 以下に属するかどうかで条件分岐
# `/Users` 以下に属していない場合は、仮想マシン上にカレントディレクトリと同じ構造でディレクトリを作成する
# `/Users` 以下のディレクトリは Boot2Docker のデフォルトですでにディレクトリ自体は作成されている
if !(echo $WORKDIR | grep "^/Users") ; then
boot2docker ssh "sudo mkdir -p $WORKDIR"
fi

# カレントディレクトリをマウントする
# コンテナ上で動作する様々なユーザーに対応するため、権限は緩めている
boot2docker ssh "sudo mount \
-t vboxsf \
-o uid=1000,gid=1000,dmode=777,fmode=777 \
$(basename $WORKDIR) $WORKDIR"
次に、ファイルに実行権限を与えます。

$ chmod +x ./mount_cd.sh


そして、Boot2Docker が起動している状態で mount_cd.sh を実行します。

$ ./mount_cd.sh


この段階でエラーが出ていなければ、コンテナからマウントする準備が整っています。試しに、先ほどの Apache コンテナにカレントフォルダをマウントさせてみましょう。 以下のように実行することで、Apache のドキュメントルートとしてカレントディレクトリがマウントされます。

$ docker run --name <container name> -v $(pwd):/usr/local/apache2/htdocs/ -p 8080:80 -d httpd


index.html を用意して、先ほどの手順でブラウザを確認してみると...

07.png


無事に表示されますね!成功です!

参考:macでdockerとboot2docker

次回はいよいよ自分でコンテナをつくってみましょう。

目次