株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。
2019年2月20日のイベントでは「『マンガでわかるDocker』から学ぶ、DockerのキホンからDocker Hubへ自作イメージ公開まで」と題し、技術書典4で大人気だった『わかばちゃんと学ぶ』シリーズ『マンガでわかるDocker』の作者である湊川あいさんが、マンガの内容に沿って実践しながら「Dockerとは何か?」から基礎的な使い方までを、やさしく解説してくださいました。
・そもそもDockerとは?
・冪等性とは?
・コンテナを立ち上げてみよう
・開発環境を作ろう
・Dockerfileの書き方
・Docker Hubに自作イメージを公開してみよう

Twitterアカウント: https://twitter.com/llminatoll
そもそもDockerとは?
今回のイベントでは、湊川さんが書かれた「マンガでわかるDocker」に沿って、初心者にもわかりやすく説明してくれました。

まずは、Dockerとは何かという疑問から。Dockerは、サーバOSであるLinuxを仮想化する技術の一つで、例えるならば「Windowsパソコン上で、ゲームソフトが遊べるエミュレータ―のようなもの」と考えれば良いそうです。
Dockerでは、MacやWindowsといったパソコン用OSの上で、Ubuntu Linuxというサーバ用OSが動かせます。もともとLinux上で仮想的なLinuxサーバを運用するためのソフトだったので、もちろんLinuxの上でも動かせます。
では、パソコン上でLinuxを動かしたり、Linux上で同じLinuxを動かすのはどんなメリットがあるのでしょうか?
Linuxサーバ上で動かすアプリケーションは、開発時や実行時に、JavaやPHP、Rubyといったプログラミング言語や、Webサーバ、データベース管理ソフトなど、さまざまなソフトウェアを利用しています。こうした周辺ソフトウェアは、開発環境と実際に運用する本番環境で、できる限り同じものに揃えておかなければなりません。
Dockerが便利なのは、Docker上で作成した仮想的なLinux環境をコンテナという単位で入れ替えることができ、「冪等性(べきとうせい)」が担保されることだそうです。
冪等性とは?
湊川さんのマンガには、わかばちゃんという女の子が登場します。その女の子が私たちの代わりに、PHPさんという謎のお兄さんに教わりながら技術知識を身につけていくスタイル。難しい言葉が出てくると、必ずPHPさんが初心者にわかりやすく説明してくれます。
早速、「冪等性」についてですが、たとえば、ゲーム機のスイッチを入れたときに、毎回同じタイトル画面が立ち上がり、ゲーム機に差したカートリッジが同じならば、毎回同じ内容のゲームがスタートします。また、ゲーム内のショップで買い物をするときには、回復薬を1つ買えば100円が減り、もう1つ買えば同じように100円が減ります。このように、ある操作を1回行っても複数回行っても結果が同じであることを「冪等(べきとう)である」と言います。
「そんなの当たり前なのでは?」と思うかもしれません。しかし、Linuxサーバ上のプログラミング言語や連動するソフトの種類やバージョンはさまざまなものがあり、環境ごとに異なるケースも少なくありません。そうすると、自分の環境で作ったサイトデータやアプリケーションを相手に渡したときに、渡した先で動かないという状況が生じかねません。
こうした「こちらでは動くのに、あちらでは動かない」ということがないように、双方がDockerを使って冪等性を担保しておけば、余計なことに煩わされることが無くなります。
コンテナを立ち上げてみよう
Dockerの紹介が一通り終わると、実際のパソコンを使ったデモが始まりました。パソコンにDocker Desktop(for Mac/for Windows)をインストールするとパソコン上でDockerが使えるようになります。湊川さんがマンガの内容に沿って、実際にMacでDockerの操作を実演してくれました。
まずはDockerコンテナを立ち上げます。Macなら「ターミナル」、Windowsなら「コマンドプロンプト」を起動してコマンドラインから操作します。利用可能なコンテナの一覧を表示させるにはcontainer lsコマンドを実行します。
一覧に何も表示されません。これは今現在は利用可能なコンテナがローカルには存在していないということです。まだ何もしていないので当たり前ですね。では、早速はじめてのコンテナを立ち上げてみましょう。runコマンドでhello-worldというイメージをもとにコンテナを作成・起動します。
実行すると画面に「Hello from Docker!」というメッセージが表示されて終了しました。

該当のイメージ(今回はhello-worldイメージ)がローカルに無い場合、「Docker Hub」というネット上から自動でダウンロードしてきてくれるのです。
コンテナのライフサイクル
続いて、Alpine LinuxのイメージをDocker Hubからダウンロードして使ってみます。Alpine Linuxは、Linuxのディストリビューション(利用目的等に合わせてLinuxと必要な周辺ソフトを集めた配布パッケージ)の一つです。
Docker Hubからダウンロードするのですが、このとき、初心者はオフィシャルのイメージを使ったほうが安全とのこと。なぜなら、イメージは誰でもアップロードできるためです。個人が作ったアンオフィシャルのイメージを使うときは、Dockerfileの中身をちゃんと確認し「そのイメージが何をインストールしているか」「どんなコマンドを実行するか」理解してからにしましょう。

先ほどのhello-worldと同様に、run alpineとすれば良いのですが、ここではrunコマンドを分解して実行して見せてくれました。runコマンドは、pull、create、startをまとめたものなので、次のような手順になります。
まずpullコマンドでダウンロードします。
次にcreateコマンドでイメージをもとに、コンテナを作成します。
そしてstartコマンドでコンテナを実行します。
このときコンテナ識別子には、createコマンド実行時に表示されたidを指定します。
コンテナを停止するには、stopコマンドを使います。
では、Alpine Linuxを実際に使ってみましょう。Linuxを利用するにはシェルを起動する必要があります。そこでrunコマンド実行時に、シェル(bin/sh)の実行も指定しておきます。
これで、Alpine Linuxの起動と同時にシェルが実行され、Alpine Linux環境内でさまざまな操作が行えるようになります。
開発環境を作ろう
いよいよDockerで開発環境を作ります。なんと、コマンド1行で済みます。
コマンドラインの内容は、PHPのバージョン7,0とApacheを含むイメージ(php:7.0-apache)をrunコマンドでダウンロード・コンテナ起動しています。-dは、バックグラウンドでの実行を指示しています。
-p 80:80はポート番号指定で、パソコンのポート80に接続するとコンテナのポート80につながるようにしています。
--name myappは、作成したコンテナにmyappというコンテナ名を付けています。これにより、その後のコンテナの操作がこの名前を指定して行えます。
コンテナを停止すると、このコンテナの中で作ったファイル(index.phpなど)は失われてしまいます。そこで、これを防ぐために-vオプションでパソコンのローカルフォルダをコンテナ内($(pwd)/var/www/html)にマウントします。
これで環境が立ち上がりました。この環境を利用するために、次のコマンドでシェル(bash)を起動します。
そして、この環境内でPHPを使ってWebページを出力する簡単なプログラムを作成してみます。
この状態で、パソコンのブラウザから、下記のようなURLを指定すると、コンテナに接続され、ページが閲覧できます。


このほか、Dockerfileの書き方やDocker Hubへのアップロードについても学びました。Dockerが便利だとは聞くけれど、なんだか難しそうと思われている方は、ぜひマンガをとっかかりにするのもよさそうです。
