コンテナ開発とは?
コンテナ開発のインプットとなる情報には以下の4つがあります。
- ベースイメージ
- ソフトウェアパッケージ
- アプリケーションのソースコード
- Dockerfile
簡単に上記4つを紹介して、コンテナ開発の基本的な部分を整理したいと思います。
ベースイメージ
アプリケーションを実行する際にベースイメージとなるものです。例えば、Webのサイトを構築する場合であれば、DockerHubのapacheやnginxなどのイメージを使えばよいでしょう。データベースであれば、mysqlやpostgresなどイメージでもよいと思います。独自のインストール方法や設定が必要な場合があり、OSから設定を変えたい場合はcentosやubuntuといったイメージから始めることも可能です。つまり、ベースイメージとは作業を始めるにあたったスタート地点のイメージのことを指します。
ソフトウェアパッケージ
アプリケーションを実行する際に必要なパッケージをコンテナへインストールする必要があります。RedHat系であれば「yum」または「dnf」、Debian系であれば「apt」を利用します。他にもnodeの「npm」などプログラミング言語系のパッケージ追加もこのことを指します。
アプリケーションのソースコード
開発時に使うソースファイルのことを言います。
Dockerfile
イメージを生成するためのコマンドが記述されたファイルで、このファイルを作ることがコンテナ開発と言えるのでは?と考えています。
docker build
イメージを作成する際にはdocker buildというコマンドを使います。ビルドコンテキストに記載されたパスの直下にある「Dockerfile」を読み込んで、イメージを作成します。「Dockerfile」には主に何をベースイメージとするのか、そのベースイメージに何のソフトをインストールするのか、また事前に用意したファイルをどこに配置するのかなどを記述しておきます。
ビルドコンテキストの注意点
ビルドコンテキストを記載することでdocker build時のカレントディレクトリを決定します。そのため、dockerfileの位置を記載しなくても自動的に読み込んでくれます。ただし注意点もあり、ビルドコンテキストに指定された場所にあるファイルは全てdocker deamonに渡されることです。不要なファイルなどがあると、それも含めてdocker deamonに渡されるため、ビルドに時間がかかってしまいます。ただし、deamonに渡されるだけで、ビルド後に作成されるイメージに渡されるわけではないため、そこだけは認識がしておきましょう。イメージに渡されるのはdockerfileに記載された内容だけで、deamonに渡されるのはあくまで処理の過程で一時的に渡されるだけとなります。※.dockerignoreファイルを用意しておけば対象ファイルのデーモンへの送信を除外できる。
Dockerfileを作る
Dockerfileベストプラクティスは読んでおきましょう
http://docs.docker.jp/engine/articles/dockerfile_best-practice.html
Dockerfileの書き方についてはベストプラクティスが提示されています。コンテナの設計思想の基本的な考え方になるかと思いますのでまずは読んでおきましょう。
Dockerfileを書いてみる
1 2 3 4 5 6 7 8 9 |
FROM centos:latest RUN dnf -y update & dnf -y install httpd COPY ./index.html /var/www/html/ EXPOSE 80 CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"] |
上記の内容で任意の作業フォルダに「dockerfile」として配置すればOKです。上記のファイルはcentosのイメージをベースにapacheをインストールし、起動させるといったことをしています。Dockerfileを作ったらファイルが配置されている作業フォルダまで移動して以下のコマンドを実行すれば、docker imageが作成できます。
1 2 |
#docker build リポジトリ名:タグ名 パス docker build -t httpd:custom . |
イメージができあがっったら、以下のコマンドでapacheを起動したいと思います。-pではポートフォワーディングをしているのですが、ここでの説明は割愛して次回以降でご説明をしたいと思います。
1 2 |
#docker run でコンテナを起動させます。 docker run -p 8080:80 -d IMAGEID |
まとめ
今回はdockerfileを自作し、それをもとにイメージを作成、起動するといったところをご紹介しました。dockerfileはこのファイルさえ共有できるようになっていれば、同じ環境をすぐに作ることができますし、またどのような手順で作ったイメージかがわかりやすいと思います。まさにInfrastructure as Codeですかね。dockerfileを作るときの注意点としては、RUNコマンドを記載する際は、可能な限りまとめることです。RUNを複数回実行するとイメージのレイヤーがRUNを実行した回数分追加されることになります。少しでもレイヤーを減らすことで、起動時の読み込まれるレイヤを減らすように心がけましょう。
コンテナ開発の本当に触り部分なので、もう少し勉強して詳しくなったら細かい話なども紹介したいと思います。