RaspberryPi

RaspberryPi2でDockerイメージをビルドしてみる

前回の記事ではラズパイ上で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の書き方さえ覚えてしまえば、既存のイメージをベースに簡単にオリジナルのイメージをビルドできるようになります。

考え方自体はオブジェクト指向の継承に近いので、イメージの階層構造を上手に設計できれば、パッケージ追加などもしやすい仮想環境群を構築できそうです(・∀・)

私自身、もう少し深いところまで勉強して実際に業務に役立てられないか考えてみたいと思います。

ではではノシ

関連記事

C言語 自作物 Linux プログラミング

wordleもどきのCUIアプリをつくってみた

最近、wordleという英単語当てゲームで遊んでいます。シンプルなゲームながら、通勤時間の暇つぶしや友人とのスコア比べなど意外と中毒性があり面白いです。 普通に英単語の勉強にもなるので、もっとたくさん ...

RaspberryPi Linux

Raspberry Pi4+Ubuntu ServerでGitLabを動かしてみる

お仕事でGitLabに触れる機会があったので、学習用に自宅にもGitLabが欲しくなりました。 手元にあるRaspberry Pi4+Dockerならお手軽に立ち上げられるはずと着手したものの、意外と ...

Flutter プログラミング

【Flutter】アプリ内の設定値を実装する方法

アプリ内で独自の設定を作る場合、そのデータを保持する方法を考える必要があります。 SQL、テキストファイルなど選択肢は多々ありますが、shared_preferencesというパッケージを使えば簡単に ...

RaspberryPi Linux

YoctoでRaspberryPi4のイメージをビルドしてみた

昨今、様々なデバイスでLinuxが動くようになっている中、組み込みLinuxのデファクトスタンダードとなりつつあるのが「Yocto」と呼ばれるビルドシステムです。 組み込みの現場ではその名前を聞くこと ...

C++ 自作物

言語処理系をつくろう(第7回):比較演算子を実装する

自作の言語処理系開発日記の第7回です。前回までで変数の実装が終わったので、ここからはいよいよ制御構文を実装…と思ったのですが、制御のためには比較演算子を実装する必要がありました。 ということで、今回は ...

Ryo Yoneyama

とある会社でソフトウェアエンジニアをしています。技術的な備忘録を中心にまとめてます。ネタがあれば日記も書きます。

    -RaspberryPi