概要
仮想マシンを用いる動機
アプリケーションのセットアップの手順といえば、通常はインストールマニュアルを書いてその通りインストールする、という流れをとるが、これが個人・環境ごとに差を生んでトラブルの原因となりやすい。一応、ChefやAnsibleのように、インストールを自動化するツールがあることにはあるが、依存するソフトウェア(やライブラリ・フレームワーク)のバージョン違いまでケアすることが難しい。あるアプリケーションのためにミドルウェアをアップデートしたら、そのミドルウェアに依存していた別のアプリケーションが動かなくなったというのはよくある話である。
仮想マシンを用いる動機は色々あるが、上記で述べたような問題を解決して、他のアプリケーションの依存関係に影響を受けない/与えない環境を確保するという目的で用いられることがある。
仮想マシンの問題点
しかし、通常の仮想マシンの場合、基盤(ハードウェアエミュレーター)・ゲストOS・ミドルウェア・アプリケーションをすべて兼ね備えた形で作成するが、これは非常に重厚である。また、ホストとゲストのOSが共通の場合、ホストと同じOSをゲストに重ねて持たせるのも無駄である。
Dockerによる解決
一方、Dockerではコンテナという軽量の箱の中でアプリケーションを動かす。Dockerでは下図のように基盤(ハードウェアエミュレーター)部分に関しては原則一切面倒を見なくてよいし、OS部分もできる限り共有可能。ミドルウェアやアプリケーション部分にだけ専念すればよい。
Docker | 仮想マシン方式 | |||
---|---|---|---|---|
アプリケーション | コ ン テ ナ |
仮 想 マ シ ン |
アプリケーション | |
ミドルウェア | ミドルウェア | |||
Dockerによる カーネルエミュレーション |
ゲストOS | |||
ハードウェアエミュレータ | ||||
ホストOS(カーネル) | ホストOS(カーネル) | |||
ハードウェア | ハードウェア |
上記のDockerによるカーネルエミュレーションは命令をほぼそのままホストOSのカーネルに渡すという作業になるため軽量の処理で済む。一方で、ホストOSと全く違うカーネルを動かすのは難しいので、Linux上でLinuxカーネルをエミュレーションするのが基本である。
2022年現在ではWindows上で動作するDockerも存在する。Windows版Dockerでは従来のLinuxカーネル用のコンテナ以外にWindowsカーネル用のコンテナの運用も可能である。
用途・効能
GUI出力機能はデフォルトでは付属しないので、サーバー用プログラムをコンテナ内で動作させるという用途が一般的。というかGUIが必要なら素直にVMWareやVirtualBoxなどの仮想マシンを使う。
従来の開発では開発環境で動いていたものが、ライブラリや細かい設定の違いにより実行環境で動かないという事態が頻発していたが、Dockerでは開発環境と同じ環境を実行先でも再現できるので、問題の発生が大きく軽減されるようになった。
また、1台のマシンで別々のソフトウェアに同じライブラリの異なるバージョンを使用させるということは弊害が大きかったが、Dockerではそれぞれを別のコンテナで実行すれば全く問題を生じない。
発展として、複数のコンテナを同時起動することが容易になったことにより、後述するKubernetesのように一つのコンテナが異常を起こしたら、バックアップコンテナに切り替える、といった耐障害性を持たせる運用が可能になった。
コンテナオーケストレーション
通常の仮想マシンでは、1台の物理マシン内に複数起動するとパフォーマンスの低下を招くので、強力なハードウェアを用意するか、あきらめて複数台の物理マシンに分散するという手段を取らざるを得なかった。
Dockerでは、コンテナの軽量化によりそこまで強力なマシンを用意しなくても仮想マシンより多くのの仮想コンテナを扱えるようになった。これにより粒度の細かい役割分担が可能になった。
たとえばWebサーバー機能ととそれに接続するデータベースサーバー機能を、仮想マシン2台分のリソースが用意できないのであれば、1台の仮想マシン内に同居させなければならないが、DockerならWebサーバーとデータベースサーバーを別々のコンテナに構築する方式が主流である。
複数のコンテナが相互に協働して一つのアプリケーションを構成する様を、オーケストラに例えてコンテナオーケストレーションと呼ぶ。
Docker Compose
1台の物理マシン(OS)上で複数のコンテナを扱う場合、Docker Composeを用いるのが2022年現在では主流である(以前は本家謹製のDocker Swarmというものがあった)。
yaml形式で設定を記述する。
Kubernetes
さらに高度なオーケストレーションを実現するツールにKubernetesがある。こちらはどちらかというと、メインの物理マシンが故障したらサブマシンの仮想コンテナに切り替える、といったような複数の物理マシンに分散配置されたコンテナを管理する目的に適している。
しばしばi18nの要領でk8sと略記される。
Kubernetesで用いるコンテナについては初期からDocker以外のコンテナを受け入れる設計だったものの、デファクトスタンダードであるDockerが主流だった。しかし、後発コンテナ技術の多様化が進んで2022年からはKubernetesにおいてDockerはむしろ非推奨になっている。
イメージとコンテナ
詳細な使い方は後述するが、OS(ディストリビューション)のインストールとミドルウェアやライブラリのセットアップが済んだ「イメージ」を元に「コンテナ」を作成し、「コンテナ」を運用するという使い方になる。
イメージは静的なものであるのに対し、コンテナは実行中・停止中などの状態を持つ。オプションなどで指定しなければ、コンテナは停止後も実行後の状態を保持して残り、再開することも可能である。
Docker Hub
Dockerの開発元であるDocker社が運営するDocker Hubという公式サイトがある。このサイトでは各種(言語やミドルウェア)処理系の開発元が各自の処理系を既にインストールした公式イメージ(Docker公式のものと処理系開発元の公式のものがある)などが多数公開されている。実際の開発では素のOSコンテナイメージではなく、そういった処理系の公式コンテナイメージを基盤にイメージを作成することが多い。従ってイメージ名は処理系+OS名+処理系バージョンのような命名になっていることが多い。
ただし、Docker Hubは公式サイトとはいえ、公式イメージ以外に誰が作ったのか分からないイメージも多数アップされているので、使用は自己責任で。
ちなみに、Docker Hubを見ていると頻繁に出てくる"alpine"は、超軽量のディストリビューションAlpine Linuxをベースにしたコンテナイメージであることを示している。
Dockerの使い方
インストール
Dockerのインストールであるが、各OSごとに異なるので簡単に説明すると、
- WindowsおよびMac OSでは公式サイトからインストーラをダウンロードしてインストールする(個人使用、もしくは250人以下かつ年間売り上げ1000万ドル(約11億5000万円)以下の組織であればDocker Desktopは無料で使用可能)。docker-composeは初めから付属している
- CentOS・Debian・Fedora・Ubuntuなどでは、レポジトリを追加してパッケージマネージャからインストールする。docker-composeはこの手順に従ってインストール可能である
といった具合である。
Dockerコンテナの動かし方
まずはdocker run --rm hello-world
とコマンドを打ってみよう。これで何が起きるかというと、
- ローカルにhello-worldというイメージがあるか確認する。なければ2へ、あれば3へ進む
- Docker Hubからhello-worldというイメージをダウンロードしてくる(pull)
- hello-worldというイメージをもとに、コンテナを立ち上げる
- 3で立ち上げたコンテナで、スクリプトを実行する
- スクリプトの実行が終了すると、通常はコンテナはそのまま残るが、
--rm
フラグをつけているので、コンテナを削除する
Dockerイメージの作り方
Dockerイメージを作るには、Dockerfileというファイルを作成する必要がある。簡単に言えば、設計図である。Dockerfileの構造は、
という、大きく3つのパートに分けられる。先ほどのhello-worldイメージのDockerfileを解説すると、
- scratchイメージをベースにする。このscratchイメージは、本当に何も入ってないイメージである。非常にシンプルなソフトウェアでない限りこれを基盤にすることはない。例えばUbuntu 20.04を基盤にしたいなら、
FROM ubuntu:20.04
と記述する - Dockerfileと同じディレクトリに置いてある、helloというファイルを、コンテナのルートディレクトリにコピーする。これでコンテナの構築は終わりである
- コンテナ起動時には、/helloのプログラムを実行する
という意味になる。Dockerfileを作成したら、docker build -t [イメージ名]:[イメージタグ] .
というコマンドを、Dockerfileのあるディレクトリで実行する。なお、イメージタグ部分は省略可能で、その場合は、latestタグが補完される。
関連動画
関連静画
Dockerのマスコットキャラはコンテナを背中に載せたクジラ。下記はDockerタグに引っかかってるが、クジラをモチーフにした潜水艦の絵という設定で直接の関係はない。
関連商品
関連リンク
- 公式サイト
- Docker Hub: 各種公式コンテナイメージが集まるHub
- Docker一強の終焉にあたり、押さえるべきContainer事情: 長文記事だが歴史についても詳しい
関連項目
- 1
- 0pt