コンテナ型仮想化技術Dockerを使って開発環境を整備できるか その1

スタッフブログ

こんにちは。ITインフラエンジニアのキリヤマです。

これまで、物理サーバやクラウドサービスの経験はそれなりにしてきたものの、VirtualBoxなどの仮想マシンやDockerのようなコンテナ型の仮想化環境をあまり触ってきませんでした。
仮想化環境を使わなくても、物理サーバやクラウドサービスをいつでもたくさん使うことができる環境だったこともあり、使う必要がなかった(避けていたとも言う)のですが、今更ながらDockerを使って開発環境を整備できないか検討してみることにしました。

Dockerとは

Dockerは、Docker社が開発している、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームです。

仮想化技術には、ホスト型やハイパーバイザ型などの仮想マシン(VM)と言われるものがありますが、これらは仮想環境ごとに個別にOSを動かした上にミドルウェアなどをインストールして使用します。
一方、コンテナ型仮想化は、OSを個別に必要とせず、ホストマシンのカーネルを利用してプロセスやユーザなどを隔離することで別のマシンが動いているかのように動かすことができます。このため、仮想マシンと比べてシステムリソースの消費が少なく、軽量で高速に起動や終了することが可能です。
Dockerならではの特徴として、コンテナを生成する設定ファイルである「Dockerfile」を他のユーザーと共有できる「Docker Hub」があり、他人が作った環境を誰でも簡単に利用できることが人気となっているようです。

Dockerだと何が良いのか

Dockerの技術的な仕組みや仮想化技術の違いなどについては、ここで説明するよりも本家Dockerのドキュメントや他のサイト、技術書などでたくさん紹介されていますのでそちらを参照していただくとして、実際に弊社でDockerを使って環境を作ると何が良いのかについて考えてみます。

まず、物理コストをかけずに試すことができるという点です。普段使っているPCでも動かせるので、とりあえず動かしてみるといった際にコストをかけることなく試すことができます。
次に、環境の複製や共有が簡単にできる点です。同じコマンドを実行したり、作成したDockerfileを共有したりすることで、同一の環境を他の人のPCに構築できます。
もう一点、Dockerで作る環境は何か問題があればすぐに削除したり再構築することができます。たとえば環境がぐちゃぐちゃになってしまったという場合であっても、コンテナがホストOS上のプロセスでしかないので、簡単に捨てて簡単に再構築することができます。

Dockerを使ってみる

Docker DesktopをインストールしてCUI環境の準備ができたら、プログラミング入門の基本である「Hello World」をコンテナに出力させてみます。

$ docker run debian /bin/echo 'Hello World'
Unable to find image 'debian:latest' locally
latest: Pulling from library/debian
d6ff36c9ec48: Pull complete
Digest: sha256:1e74c92df240634a39d050a5e23fb18f45df30846bb222f543414da180b47a5d
Status: Downloaded newer image for debian:latest
Hello World

今回のDockerコマンドを簡単に説明すると、docker runがコンテナを起動するコマンドです。「debian」は動作させるDockerイメージ名、それ以後が実行するコマンドでechoコマンドで「Hello World」を出力しています。
Dockerではこのような形で簡単に仮想環境でコマンドを実行させることができます。

コンテナの組み合わせでWordpressを動かしてみる

次にWordpressを動かしてみようと思います。
MySQLが動作するコンテナと、WebサーバにWordpressがインストールされたコンテナの2つを組み合わせて使います。
まず、2つのイメージをDocker pullを使ってDocker Hubからダウンロードします。

$ docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
  :
  :
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
$ docker pull wordpress
Using default tag: latest
latest: Pulling from library/wordpress
  :
  :
Status: Downloaded newer image for wordpress:latest
docker.io/library/wordpress:latest

表示される内容は少し省略していますが、それぞれダウンロードできましたので、実際にイメージファイルをdocker runで起動してみます。

$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=test_pw -d mysql

$ docker run --name wordpress --link mysql:mysql -d -p 8080:80 wordpress

コマンドの詳細についてはマニュアルを確認していただくのが良いと思いますが、wordpressのコンテナ起動時に --link オプションでmysqlコンテナに接続、-pオプションでローカルの8080ポートがコンテナの80ポートに転送されるように指定をしています。

この状態でdocker psを実行すると、wordpressとmysql の2つのコンテナが起動していることが確認できます。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
49e41bed0432        wordpress           "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        0.0.0.0:8080->80/tcp   wordpress
7f1e80a50253        mysql               "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        3306/tcp, 33060/tcp    mysql

この状態でブラウザから http://localhost:8080 にアクセスするとWordpressの初期設定画面が表示され一通りWordpressを動かすことができました。

実際にDockerをつかってみて

今回はコンテナ型の仮想化ソフトウェアであるDockerを使って、簡単にWordpressを動かしてみました。たった4つのコマンドを実行するだけでWordpressの設定画面が表示されるという驚くべき速さと手軽さで、今まで使っていなかったのが勿体ないと思えるほど簡単に動かすことができました。
開発環境をDockerで整備できるぞ! という結論にはまだ至っていませんが、今後はもう少し複雑な構成をDockerfiledocker-composeを使って試してみようと思います。