Docker で Web サーバーを動かすには?

記事
IT・テクノロジー

Docker で Web サーバーを動かすには?

前回は、いきなり Django のアプリを Docker 上で動かす例を紹介しました。 目的は、Django のような開発も、Docker が使えるという例で紹介しました。 少々設定は面倒ですが、Docker は便利な仕組みで、便利な仕組みです。 この記事ではもう少し詳しく Docker の仕組みを紹介します。

NGINX を利用した Web サーバー

NGINX を利用した Web サーバーの Docker イメージが予め準備されていて、Docker Hub からダウンロードして利用できます。 シンプルに以下のコマンドを実行するだけで、NGINX の基本機能を利用できます。

$ docker run --rm -d -p 8000:80 --name web nginx
これで、Docker が動作している PC で「localhost:8000」にアクセスすると、NGINX のデモページにアクセスできます。

具体的に何をしているかというと、「Docker のコンテナ(container)で NGINX のイメージを動かしている」という事になります。

何が便利かというと、利用している PC の設定に影響する事なく、「NGINX」のサーバーの機能を試したり利用したりできるのが特徴です。

このままでは、デモページのみの表示で不便ですが、指定したフォルダのファイルをサーバーにコピーして表示する事ができます。 NGINX の Docker イメージは、「/usr/share/nginx/html」のフォルダのファイルを表示できるようになっているので、開発用の PCno 指定したフォルダにファイルを用意しておいて、以下のような指定をすると、任意の HTML ファイルを表示できるようになります。これで、HTML ファイルを準備すれば、簡単な Web サイトになります。 「localhost:8000/index.html」のようにファイルを指定すれば、ページを表示できる Web サイトの出来上がりです。

$ docker run --rm -d -p 8000:80 --name ng -v /home/user/Documents/docker/nginx-sample/public:/usr/share/nginx/html nginx

サーバーを止めるには、

$ docker stop ng
で Docker の実行をストップできます。

Docker の設定を自動化する!

簡単に Web サイトのサービスを作ってテストなどが可能です。上の例では、「public」のホルダーからファイルをコピーするだけですが、実際にはもっと多くの作業が必要になる場合があります。例えば、CSS ファイルを別のフォルダに置く場合は、2つのフォルダをコピーする必要が出てきます。 そうした場合は、上の例のように、コマンドラインで全てを指定するのは面倒です。そこで、必要な操作を書いたファイルを予め用意して Docker の設定・処理の指定をする事ができます。

その必要な設定や処理を指定するファイルが「Dockerfile」です。

Dockerfile の例です。

FROM nginx:latest
COPY public /usr/share/nginx/html
上の例の処理を、Dockerfile で記述しています。 ここでは、必要なイメージ(nginx)の最新版を利用して、Dockerfile のあるフォルダにある、「public」というフォルダを、NGINX イメージの、「/usr/share/nginx/html」にコピーするというものです。 別のファイルやフォルダをコピーする場合は、同じような記述を追加すれば OK です。

Docker ファイルの情報を元に、「nginx」のイメージを元にして、新たなイメージを作成します。こうすることで、毎回、必要なファイルをコピーする必要がなくなります。

$ docker build -t myserver .
Sending build context to Docker daemon 6.144kB
Step 1/2 : FROM nginx:latest
latest: Pulling from library/nginx
69692152171a: Pull complete
49f7d34d62c1: Pull complete
5f97dc5d71ab: Pull complete
cfcd0711b93a: Pull complete
be6172d7651b: Pull complete
de9813870342: Pull complete
Digest: sha256:df13abe416e37eb3db4722840dd479b00ba193ac6606e7902331dcea50f4f1f2
Status: Downloaded newer image for nginx:latest
 ---> f0b8a9a54136
Step 2/2 : COPY public /usr/share/nginx/html
 ---> 76adf6f9d714
Successfully built 76adf6f9d714
Successfully tagged myserver:latest
上の例では、例に挙げた Dockerfile を使って、「myserver」という新しい Docker イメージを作成しています。処理は2つのステップで

* nginx のイメージを Docker Hub から取得
* nginx のイメージをコピーして、必要なファイルをコピーして新しいイメージを作成
という処理を行っています。一旦イメージを作成してしまえば、イメージを使ってサービスをコンテナ(container)で実行するだけになります。

上のコマンドを実行後に、開発 PC の Docker のイメージのリストをみると

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myserver latest 76adf6f9d714 4 seconds ago 133MB
nginx latest f0b8a9a54136 40 hours ago 133MB
2 つのイメージがあるのがわかります。オリジナルの nginx のイメージと、新たに作成した myserver のイメージです。サイズが同じですが、コピーした HTML のファイルのサイズが小さいので差がわからないだけで、新たなファイルが myserver のイメージには含まれています。

つまり、オリジナルのイメージには変更を加えず、「機能を追加した」イメージが新たに作成されるという仕組みです。

Web サーバーの起動は、以下のコマンドでできます。

$ docker run --rm -d -p 8080:80 --name web myserver
862c9cd715940e53b28fc65e725bb68be0c17fbe5d45b05d47e0c79eddd7a8d2
起動した後に、実行されている Docker の状況を見ると以下のようになっています。

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
862c9cd71594 myserver "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp web
myserver というイメージが実行されている事がわかります。

Docker Hub のコンセプトは GitHub と同じ!

Docker のイメージを集めた、Docker Hub というサイトがあります。このサイトには、GigHub と同様、よく利用されるような便利な機能のイメージが公開されていて、自分のサービスに取り込む事ができます。

GigHub 同様にアカウントが必要です。公開版の Docker イメージは無制限で利用できますが、プライベートのイメージは無料アカウントでは制限されています。年間契約すると、月当たり5ドルでプライベートのイメージも無制限で利用できるようになります。

GitHub 同様上手く利用すると便利です。

一旦イメージを作って仕舞えば、同じ OS の上で動作している Docker 上で簡単に実行できるようになります。似たような事が、VMWare や VirtualBox、Prallels などのハイパーバイザー(hypervisor)ベースの仮想マシーンでもできますが、仮想マシーンのイメージのサイズはどうしても OS 全部のイメージも入るのでサイズも大きくなりますし、起動ごとにホスト OS のリソースを割り当てる必要があるので、効率的に利用するには課題もたくさんあります。

また、OS を含んでいる関係上、Docker Hub のようにイメージの共有も難しいので再利用も限定的になります。

上級の開発者には便利な仕組み!

フロントエンド中心の開発では魅力が少ないですが、バックエンドやデータベースなどを含む開発を手がけるようになると、仮想マシーン(Virtual Machine)やコンテナ(Container)を利用できると開発がスムーズにできます。別の PC を持ってきて仮想サーバーを作る必要もありませんし、サーバー側の環境も独立した設定が簡単にできます。しかも、プロジェクトごとに違った設定ができるので、複数の開発を並行して同時にする場合も想定外の依存関係が起きにくいため、開発と実際の環境に違いによる問題も劇的に少なくまります。

設定に失敗しても、消して作り直せば良いのでいろいろな事をメインの PC の設定を壊さずにできるのも大きな魅力です。

まとめ
この記事では、仮想化技術の一つであるコンテナ(Container)を利用している Docker の仕組みを、NGINX の Web サーバーのサービスを活用したホスティングのためのコンテナを例に挙げて紹介してみました。

一旦コンテナを作成してしまえば、Web サーバーの引っ越しも簡単にできますし、テストのために別の環境を作るもの簡単になります。

一見面倒で難しそうに見える部分もありますが、一通りの手順を覚えれば大きな負担なしで便利な機能を利用できます。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す