派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

【イベントレポート】便利だけど、難しそう?Dockerのキホンをマンガで学ぶ

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2019年2月20日のイベントでは「『マンガでわかるDocker』から学ぶ、DockerのキホンからDocker Hubへ自作イメージ公開まで」と題し、技術書典4で大人気だった『わかばちゃんと学ぶ』シリーズ『マンガでわかるDocker』の作者である湊川あいさんが、マンガの内容に沿って実践しながら「Dockerとは何か?」から基礎的な使い方までを、やさしく解説してくださいました。

■今回のイベントのポイント
・そもそもDockerとは?
・冪等性とは?
・コンテナを立ち上げてみよう
・開発環境を作ろう
・Dockerfileの書き方
・Docker Hubに自作イメージを公開してみよう
 
【講師】湊川 あいさん
【講師】湊川 あいさん
フリーランスのWebデザイナー・漫画家・イラストレーター。マンガと図解で、技術をわかりやすく伝えることが好き。著書『わかばちゃんと学ぶ Webサイト制作の基本』『わかばちゃんと学ぶ Git使い方入門』『わかばちゃんと学ぶ Googleアナリティクス』が全国の書店にて発売中のほか、動画学習サービスSchooにてGit入門授業の講師も担当。「マンガでわかるGit」「マンガでわかるDocker」「マンガでわかるUnity」といった分野横断的なコンテンツを展開している。
Twitterアカウント: https://twitter.com/llminatoll

そもそもDockerとは?

今回のイベントでは、湊川さんが書かれた「マンガでわかるDocker」に沿って、初心者にもわかりやすく説明してくれました。

f:id:itstaffing:20190410115527j:plain
▲イベントは、自身で技術面の記述から作画までを手掛けたマンガ「マンガでわかる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コマンドを実行します。

$ docker container ls

一覧に何も表示されません。これは今現在は利用可能なコンテナがローカルには存在していないということです。まだ何もしていないので当たり前ですね。では、早速はじめてのコンテナを立ち上げてみましょう。runコマンドでhello-worldというイメージをもとにコンテナを作成・起動します。

$ docker run hello-world

実行すると画面に「Hello from Docker!」というメッセージが表示されて終了しました。

f:id:itstaffing:20190410115532j:plain
▲Dockerでhello-worldを実行する。画面はWindows版

該当のイメージ(今回はhello-worldイメージ)がローカルに無い場合、「Docker Hub」というネット上から自動でダウンロードしてきてくれるのです。

コンテナのライフサイクル

続いて、Alpine LinuxのイメージをDocker Hubからダウンロードして使ってみます。Alpine Linuxは、Linuxのディストリビューション(利用目的等に合わせてLinuxと必要な周辺ソフトを集めた配布パッケージ)の一つです。

Docker Hubからダウンロードするのですが、このとき、初心者はオフィシャルのイメージを使ったほうが安全とのこと。なぜなら、イメージは誰でもアップロードできるためです。個人が作ったアンオフィシャルのイメージを使うときは、Dockerfileの中身をちゃんと確認し「そのイメージが何をインストールしているか」「どんなコマンドを実行するか」理解してからにしましょう。

f:id:itstaffing:20190410115536j:plain
▲Docker Hubのサイト画面。このサイトにさまざまなイメージがアップロードされており、手軽にダウンロードして使うことができる。

先ほどのhello-worldと同様に、run alpineとすれば良いのですが、ここではrunコマンドを分解して実行して見せてくれました。runコマンドは、pull、create、startをまとめたものなので、次のような手順になります。

まずpullコマンドでダウンロードします。

$ docker pull alpine

次にcreateコマンドでイメージをもとに、コンテナを作成します。

$ docker create -it alpine

そしてstartコマンドでコンテナを実行します。

$ docker start [コンテナ識別子]

このときコンテナ識別子には、createコマンド実行時に表示されたidを指定します。

コンテナを停止するには、stopコマンドを使います。

$ docker stop [コンテナ識別子]

では、Alpine Linuxを実際に使ってみましょう。Linuxを利用するにはシェルを起動する必要があります。そこでrunコマンド実行時に、シェル(bin/sh)の実行も指定しておきます。

$ docker run -it alpine bin/sh

これで、Alpine Linuxの起動と同時にシェルが実行され、Alpine Linux環境内でさまざまな操作が行えるようになります。

開発環境を作ろう

いよいよDockerで開発環境を作ります。なんと、コマンド1行で済みます。

$ docker run -d -p 80:80 --name myapp -v $(pwd)/var/www/html php:7.0-apache

コマンドラインの内容は、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)を起動します。

# docker exec -it myapp bash

そして、この環境内でPHPを使ってWebページを出力する簡単なプログラムを作成してみます。

# echo '<?php phpinfo();' > index.php

この状態で、パソコンのブラウザから、下記のようなURLを指定すると、コンテナに接続され、ページが閲覧できます。



f:id:itstaffing:20190410115540j:plain
▲ブラウザでlocalhostにアクセスするとPHPのバージョン情報が表示される。画面はWindows版

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

f:id:itstaffing:20190410115543j:plain