前回の記事ではラズパイ上でDockerイメージからコンテナを作ってみましたが、今回はDockerイメージそのものをビルドして、オリジナルのDockerイメージを作ってみたいと思います。目標はhttpサーバーのlighttpdを動かせるイメージを作ることにしました。
Dockerfileの準備
Dockerイメージをビルドするには、そのイメージのレシピになるDockerfileを作る必要があります。逆に、Dockerfileさえ作ればそれだけで準備は完了です。
今回作ったDockerfileはこんな感じになりました。このDockerfileの解説は後ほど。
FROM jsurf/rpi-raspbian:latest MAINTAINER Ryo Yoneyama <yoneyama.ryo.dev@gmail.com> RUN apt-get update && apt-get install lighttpd EXPOSE 80 CMD ["lighttpd", "-D", "-f", "/etc/lighttpd/lighttpd.conf"]
Dockerイメージのビルド
次は、Dockerfileからイメージをビルドします。イメージのビルドには「docker build」コマンドを使います。
docker build -t <イメージ名> <Dockerfileのあるディレクトリ>
今回はカレントディレクトリのDockerfileを使い、「rpi-lighttpd」という名前でイメージをビルドしたいのでこうなります。
docker build -t rpi-lighttpd ./
ビルドには少し時間がかかるので、のんびり待ちます。ビルド後「docker images」コマンドで確認すると、たしかに「rpi-lighttpd」というイメージが出来ていました。
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE rpi-lighttpd latest 02086ffeaa17 5 minutes ago 172.6 MB <none> <none> 756fec52e6a4 9 minutes ago 172.6 MB <none> <none> e5f9bb5731a4 14 minutes ago 172.6 MB <none> <none> d665ffa56292 19 minutes ago 172.6 MB tobi312/rpi-nginx latest b5b033635fe6 9 hours ago 181.9 MB jsurf/rpi-raspbian latest b4a7100d4d38 3 days ago 131.7 MB
Dockerイメージの起動
あとは前回と同様、イメージからコンテナを作成して起動します。
# docker run --name lighttpd -d -p 80:80 rpi-lighttpd
コンテナ起動後、ラズパイの80番ポートにアクセスしたときに、以下のようなlighttpdのトップページが表示されれば実験成功です。
なんとか自分でDockerイメージをビルドして動かすことができました(・∀・)
Dockerfileの解説
作成したDockerfileの簡単な解説です。
Dockerfileは命令を羅列する形で記述します。ここで紹介する以外にも色々な命令が用意されていますが、詳しくはDockerのリファレンスを見てみてください。
FROM命令
作成するイメージの元となるイメージを指定します。Dockerは既存のイメージに対して拡張と修正をすることで新しいイメージを作ることができます。この仕組みのおかげで、Dockerfileには差分だけを記述すればよいので、必要最低限の記述で必要なイメージが作れるようになっています。
FROM jsurf/rpi-raspbian:latest
今回は元イメージとしてラズパイ用のOSである「jsurf/rpi-raspbian」を指定しています。後ろに付いている「latest」はイメージのタグです。この場合は最新版を使うという意味になります。
MAINTAINER命令
Dockerイメージの作者を設定します。特に機能に関わるものではありませんが、イメージの所在を明らかにする意味でもあった方が良さそうです。
MAINTAINER Ryo Yoneyama <yoneyama.ryo.dev@gmail.com>
RUN命令
おそらく最もよく使われる命令がRUN命令です。指定したコマンドを実行してイメージの中身を触りたいときに使います。コマンド自体はコマンドラインで実行しているものが使えます。
RUN apt-get update && apt-get install lighttpd
ここでは、パッケージのアップデートとlighttpdのインストールを行っています。&&でつないで1行で書いていますが、それぞれ別々にRUN命令で実行してもOKです。
EXPOSE命令
コンテナがListenするポート番号を設定することができます。コンテナ内のlighttpdで使うために80番ポートをEXPOSEしています。
EXPOSE 80
CMD命令
コンテナが起動したときに実行したいコマンドを指定します。Dockerは仮想環境で特定のアプリケーションを実行する用途で使われることが多いため、CMD命令によりコンテナの起動と同時にそのアプリケーションを起動できるようになっています。
CMD ["lighttpd", "-D", "-f", "/etc/lighttpd/lighttpd.conf"]
今回はlighttpdを起動させたいので、lighttpdの起動コマンドを設定しています。
まとめ
Dockerfileの書き方さえ覚えてしまえば、既存のイメージをベースに簡単にオリジナルのイメージをビルドできるようになります。
考え方自体はオブジェクト指向の継承に近いので、イメージの階層構造を上手に設計できれば、パッケージ追加などもしやすい仮想環境群を構築できそうです(・∀・)
私自身、もう少し深いところまで勉強して実際に業務に役立てられないか考えてみたいと思います。
ではではノシ