第2回Dockerとは?Docker fileのサンプルも紹介
第2回 Docker解説 コラム
この連載コラムでは、仮想化技術のDockerとは?について、数回に分けてわかりやすくお伝えします。
今回は、環境構築や、Dockerの構成要素、ユースケースについて見ていきます。
入門編は、次のような想定・目的で記述しています。
想定する読者 |
|
想定する読者の 知識レベル |
|
本連載を読んだ後に得られる期待値 |
|
目次
1. 環境構築手順
まず、Dockerとの比較のために、オンプレミス環境やハイパーバイザ型・ホスト型仮想化など、従来方式の構築手順を確認しておきます。
環境構築―従来方式
- PC購入&設置または仮想マシンセットアップ
- OSインストール
- 依存パッケージインストール
①ライブラリ
②ミドルウェア - 依存パッケージ各種設定
- アプリケーションインストール
- アプリケーション基本設定
- イメージファイル配布(数GB~数十GB)
従来方式は、マシンのセットアップ、OSのインストール、依存パッケージのインストールと設定を準備として行い、それから本来動かしたいアプリケーションのインストールと設定を行ったうえで、イメージファイルを作成してそれを配布する、という流れです。
このうち3〜6については、AnsibleやPuppetなどの構成管理ツールで自動化することが可能です。しかし開発初期は特に、メンテナンスが遅れがちなマニュアル頼りというところがあり、それなりの手間がかかります。
では、Dockerの場合はどのようになるでしょうか。
環境構築―Docker
- ベースとなるコンテナ(Dockerイメージ)を指定
- アプリケーション実行環境構築指示を記述(ベースコンテナからの変更点)
- Dockerレジストリに登録(push)し、使用ユーザーがダウンロード(pull)
- ファイルによる配布も可能(save→ load)
これだけです。
ステップ1で、ベースとなるコンテナ、たとえば Ubuntu:18.04 などを、Dockerイメージで指定すると、インストール作業自体が不要になります。また、データベースにデータを投入した状態でイメージを作りたいという場合も、公式のデータベースのイメージをベースとして、2番目のステップでデータの投入の部分を指定すると、それでもう初期状態データ投入済のデータベースイメージができあがります。
ステップ2では、ベースとなるDockerイメージからの差分、目的とする環境を作るために必要なコマンド類、設定類を、Dockerfileというファイルに記述します(Dockerfileについては後で取り上げます)。
あとはDockerイメージのビルドを行って、Dockerレジストリというところに登録して置いておくと、ユーザーがイメージを指定するだけで自動的にダウンロードして使用できます。
Dockerイメージを作成するときに配布可能にしておくと、次のような状態で利用できるようになります。
- 利用者は設定不要
- 同じ実行環境
- 一瞬で入手(ダウンロード時間のみ)
- どこでもデプロイ(docker の実行環境が入っていれば)
これが「開発環境とリリース環境が同じになる」という肝の部分です。
Dockerの利点/欠点
Dockerの利点と欠点をまとめておきます。
利点 |
|
欠点 |
|
ただし、欠点の2番目の「コンテナ同士の連携、ホストをまたがる設定が困難」については既に過去の話になっています。
Docker SwarmやKubernetesといったオーケストレーションツールにより、複数のコンテナの組み合わせや、全体をコピーするレプリケーションのようなことも、簡単にできるようになっています。(ただし、これらについては今回の連載では扱いません。)
商用サービスの仮想化環境
参考までに、それぞれの仮想化環境を使用している商用サービスにどのようなものがあるかをまとめてみました。
- XEN
- AWS EC2 AMI (ただしC5インスタンスはKVM を使用)
- KVM
- さくらのVPS
- GMOクラウドVPS
- お名前.com VPS
- Hyper-V
- Microsoft Azure
※IBM CloudはこれらのType1ハイパーバイザを選択可能
- Microsoft Azure
(商用で使用するようなタイプではないため、おそらくサービスとしては存在しない)
- Docker
- さくらArukas
- AWS ECS、ECR、Batch
Eureka Boxは厚生労働省が実施している助成金、人材開発支援助成金の適用対象となります。
2. Dockerの構成と機能
Dockerと仮想マシンの構成比較
以下は、Dockerの公式サイトにある、両者を比較した図です。
Dockerのコンテナは、アプリケーション層において動作環境を抽象化したもので、OS自体は他のコンテナや他のアプリケーションと共有されます。それに対して仮想マシンは、物理ハードウェアを抽象化したもので、仮想マシンごとにOSを丸ごと持っています(ゲストOS)。
大きな違いは、Dockerにおいては、OSやアプリケーションといった層に関わらず、異なるコンテナでも同一リソース階層を共有しているという点です。仮想マシンでは、ハイパーバイザ層でリソースが完全に分離されており、異なる仮想マシン間で共有することは不可能です。
Dockerの場合でも、実行時リソースはコンテナ内に限られるので、コンテナ間での実行の独立性が確立されています。UnionFSのように、リードオンリーの共有リソースの上に該当コンテナのみリードライト可能な実行リソースを被せている構成をイメージしていただくとよいでしょう。
Dockerの基本構成要素
さて、ここから、Docker自体の詳細に入っていきます。
まずはDockerイメージです。第1回で、Pythonやgccの例を出したときに、自動的にダウンロードされると説明したものです。
Dockerイメージとは、あるアプリケーションの実行環境のスナップショットです。階層(レイヤー)構造で、階層ごとにIDを持ち、異なるイメージが階層を共有していることもあります。
https://member.eureka-box.com/products/4/categories/2147775733/posts/2152282638
たとえば、Jenkinsイメージの場合には、Ubuntuの上にJRE、その上にJenkinsが乗っています。Jellyイメージの場合は、同様にUbuntuとJREがあり、その上にJellyがあります。このUbuntuとJREに関しては、まったく同じものを使用でき、ホストマシンのリソースとしては、差分であるJenkinsとJellyの分だけが余分に必要になります。 同様に、GitLabイメージの場合にはRuby&GoとGitLabが、MySQLイメージの場合はMySQLだけが異なっていて、Ubuntuの部分は4つのイメージで共有される層(レイヤー)になります。構成比較のセクションで「同一リソース階層を共有」と言ったのはこのことです。
このような形でリソースを少なくする工夫がされています。ただし、レイヤーは無限に持てるわけではなく限度があるので、レイヤーの作り方には工夫が必要です。(本連載では扱いません。)
次にDockerコンテナです。Dockerコンテナとは、Dockerイメージを元に生成される実行中のインスタンスを指します。同じイメージから複数のコンテナを生成できます。
ある時点のコンテナの状態をイメージにすることも可能です。ただし、イメージを作るときは、通常、Dockerfileというものを使用します。実行したコンテナからイメージを生成する場合として考えられるのは、コンテナを使って検証を行っているときに、何らかの確認がとれたものをいったんイメージとして保存する、といった使い方になるかと思います。
DockerfileはDockerイメージを作成するための指示書です。このDockerfileを見れば、どのようにDockerイメージが作られたかがすべてわかります。つまり、OS、ミドルウェア、アプリケーションなど、ベースとする既存のイメージをまず指定し、そこからの差分を記述します。
このDockerfileでは、かなり高度な指定ができます。環境変数(ENV)、イメージ作成変数(ARG)、パッケージインストールなどコマンド実行(RUN)、コンテナ実行時に起動するコマンドなどを記述します。
例を挙げると、プロキシーの有無などは環境によって異なります。たとえば2つのネットワーク環境があって、片方はプロキシーを使用する、片方は直接インターネット環境に接続できるという場合に、そのネットワークの情報をイメージの作成変数にしておくと、同じDockerfileでイメージ生成コマンドを実行することができます。
ただし、レイヤーを意識しないと、効率の良いDockerイメージになりません。効率の良いDockerイメージにするには、開発中のソースコードや、アプリケーションインストール時の中間ファイルは削除するのが通常です。
以下は、公式サイトで公開されているDockerfileのサンプルです。
# 親イメージとして公式イメージを使う
FROM node:current-slim
# 作業用(working)ディレクトリを指定
WORKDIR /usr/src/app
# ホスト上のファイルを現在の場所にコピー
COPY package.json .
# イメージのファイルシステム内でコマンドを実行
RUN npm install
# 実行時、コンテナが特定のポートをリッスンするよう Docker に通知
EXPOSE 8080
# コンテナ内で指定したコマンドを実行
CMD [ "npm", "start" ]
# 残りのソースコードをホスト上からイメージのファイルシステム上にコピー
COPY . .
Docker Hubは、公開されているDockerイメージを配布しているサイトです。Dockerをインストールすれば、登録されているイメージを使用できるようになります。
Dockerのユースケース
Dockerがどのような場合に利用できるか、役立つかを整理しましょう。
- 常に同じ状態から始めたい(使用後は破棄)
- インストールスクリプトの動作確認:まっさらな状態から動作確認できるので、環境変数の定義もれがないかなどのチェックが可能
- 開発環境を開発者に配布:開発者独自の手順や癖に影響されず、常に同じ環境を配布可能
- CI環境用:完全に同じ環境から開始でき、問題点の切り分けが容易
- 使用状況に合わせて、リソースを柔軟に変更したい
- サービスのスケールアウト/イン(オーケストレーション)
- 並列ビルド時のスケール調整
- 開発用に手っ取り早くサンドボックスが欲しい
- サーバでは許可されていない権限でのプロトタイピング(Dockerで確認用のサーバを起動)
- 動作確認用DB(データ投入済)
- 言語、コンパイラのバージョン違いの確認環境
- みんな使っていると聞いて!
- 偉い人に言われたから……
- 最近ホットなので、追従しないとっ!
- プロダクション環境
- サービスのスケールアウト/イン(オーケストレーション)
- 並列ビルド時のスケール調整
- ゼロダウンタイムが容易(バージョンアップ/ロールバック時)
マイクロサービスを起動し、使用後破棄するので、他のコンテナへの影響が限りなく少なく、接続についても柔軟に設定できるため - 開発環境でも同じ実行環境を使用するため、動作環境要因の不具合を限りなくゼロに近づけることが可能
- 初期設定済の状態でイメージを作成し、リリースすることが可能
- デモ環境
- デモの準備を整えたイメージを作成し、Docker Hubに登録 → ユーザーによるPull型デモ
- CI環境
- Jenkins、GitLabがDockerをサポート
- プロトタイピング
- 軽量であることを利用し手軽に環境構築することが可能(公式イメージは一瞬で起動可能)
例:sh/ruby/pythonスクリプトの確認、Jenkins上での動作確認など
- 軽量であることを利用し手軽に環境構築することが可能(公式イメージは一瞬で起動可能)
Docker参考サイト(入門編)
最後に、このあと皆さんがご自身で調べたり勉強したりするためのサイトをご紹介します。
- 公式チュートリアル(英語)
https://docs.docker.com/get-started/ - 日本語チュートリアル(旧バージョン)
http://docs.docker.jp/get-started/get-started.html - 開発向けベストプラクティス
https://docs.docker.com/develop/dev-best-practices/ - Dockerfileベストプラクティス
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
個別のポイントについては、検索すればQiitaやブログ記事などに書かれているものが見つかりますが、全体的にどのような機能があるかを見るには、これら公式のチュートリアルやベストプラクティスが役立つと思います。
Dockerを使ってみる
Dockerの技術を実際に学んでみたいという方に、まずは無料でお試しいただけるオンライン学習プラットフォームをご提供しております。
業務が多忙なエンジニアでも、スキマ時間で効率的に実践的な学習が出来るEureka Boxは、エンジニアの現場の声から生まれたツールです。
ソフトウェア開発を改善するための開発技術を“知り・学び”“実践する”
超実践的オンライン学習プラットフォーム
Eureka Box(ユーリカボックス)
以上で入門編を終了します。実践編では、具体的なインストール方法やコマンドなどをご紹介していますので、ご興味のある方、続きを読みたい方はEureka Boxの会員登録をお勧めいたします。Eureka Boxは無料の会員登録だけでも以下の特典が受けられます。
- 各連載コラムの全容、未公開コラムも一気にまとめて読める(一部動画解説付!)
- USDM(要求記述)、MBD(モデルベース開発)、システムズエンジニアリング、AWS Greengrass(新世代エッジエンジニアのための技術講座)など、ソフトウェア開発に関わる知識がギュッと凝縮、困った時のお助けアイテムとしても長期で活用出来る
- ソフトウェア開発に関わる無料お試しコンテンツも充実
執筆者プロフィール
株式会社エクスモーション シニアエキスパート
専門分野:
DevOps(CI/CD)、クラウドコンピューティング、Quick Hack(Quick Fix), Agile、ロボティクス、ネットワーク、防衛システム