これまで、物理サーバやクラウドサービスの経験はそれなりにしてきたものの、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で整備できるぞ! という結論にはまだ至っていませんが、今後はもう少し複雑な構成をDockerfile
やdocker-compose
を使って試してみようと思います。