初心者でも分かるDockerコンテナ
エンジニアの皆さんは、Dockerやコンテナという言葉を耳にしたことがあるでしょう。仮想化の一種であることは分かっても、なかなかイメージがつかみづらく、理解が難しく思えますが、実は意外にシンプルな概念です。
ここでは、Dockerコンテナに照準を当て、エンジニアの皆さんにぜひ知ってほしいことを中心に分かりやすく解説をしますので、ぜひ最後まで読んでください。
【参考】:ホーム-Docker
そもそもコンテナとは
皆さんは「コンテナ」と聞くと、何をイメージしますか?物流のコンテナをイメージする人も少なくないでしょう。確かに「コンテナ」は物流の世界ではよく利用されています。行き先ごとにコンテナに荷物をまとめ、コンテナ単位で船や列車、トラックにそのまま積み、目的地に運べます。
そのため、物流途上での積み替えや振り分けなど、無駄な作業が省け、効率的な物流を実現できます。Amazonはこのコンテナ物流を利用したことで今の地位を築いたとも言われています。
このように物流業界では「コンテナ」による物流革命が起きましたが、ITの世界でも「コンテナ」が1つの革命を起こしたのです。それが「Dockerコンテナ」です。イメージとしては、次のような関係になります。
【コンテナA】【コンテナB】
【Doker】
【OS】
【サーバー】
コンテナとはユーザー空間のこと
先ほどのイメージをより分かりやすく説明すると、サーバーにはOSがあり、さらにOSとコンテナを動かすためにDocker(エンジン)があります。コンテナはユーザー空間と呼んでも構いません。通常、ユーザー空間は1つのOSに対して1つですが、Dockerではユーザー空間をコンテナとして複数設けることが可能です。
コンテナの中身はアプリケーションとミドルウェア、OSの一部(ライブラリーなど)です。コンテナはOSのカーネルを利用して、それぞれが独立して動きます。
Dockerコンテナ環境と仮想マシン環境との違い
ここまでの説明で、多くの方は「ただの仮想環境と何が違うのか?」と思われたかもしれません。確かに仮想マシンを実現する「ハイパーバイザー」と「Docker」の機能は似ているように思いますが、実は次の点で大きく異なっています。
「仮想マシン環境」では「ハイパーバイザー」の下に「ゲストOS」を立て、その下でアプリケーションが動きます。つまり、仮想マシンはOSそのものの仮想化です。ハイパーバイザーの詳細については後述します。
一方の「コンテナ型仮想環境」では、「ハイパーバイザー」と同じ位置に「Docker」があり、その下に「コンテナ」が複数あります。「コンテナ」にはOSライブラリー、ミドルウェア、アプリケーションが搭載されていると説明しましたが、Dockerの仮想化対象はコンテナです。
「仮想マシン環境」では必ず「ゲストOS」が必要ですが、「コンテナ環境」ではアプリケーションを動かす際にサーバーOSのカーネル部分を、カーネル以外の部分はコンテナ自体のOSライブラリーを利用するため、ゲストOSを必要としません。
ハイパーバイザーの仕組み
上記の説明で簡単に紹介したハイパーバイザーについて、ここで詳しく解説します。ハイパーバイザーとは、物理サーバー上に仮想環境を構築するためのソフトウェアのことです。
ハイパーバイザーには、ホストOSにインストールして使うホスト型ハイパーバイザーと、ホストOSにインストールしないネイティブ型ハイパーバイザーの2種類があります。
ホスト型ハイパーバイザーはOS上でソフトウェアとして稼働することで、OSの上でいくつもの仮想環境を動作させることができます。ホスト型ハイパーバイザーにはVMware Workstation Player・VMware Fusionなどがあります。
一方ネイティブ型ハイパーバイザーは、ハードウェア上で直接プログラムを稼働することで仮想環境を構築します。ネイティブ型ハイパーバイザーにはVMware vSphere・KVMなどがあります。
【参考】:VMware Workstation Player のダウンロード | VMware | JP
【参考】:KVM
コンテナのDockerとは
コンテナ型の仮想化技術はさまざまあります。LinuxベースのOpenVZなどもコンテナ型仮想化の1つです。そうしたコンテナ型仮想化技術を用いたサービスの中で、最も利用されているのがDockerです。
Dockerは、2013年にDocker社からリリースされ、Windows、Linux、Macなどのさまざまな環境で動作できる点が特徴です。
またDockerにはKubernetes(クベルネテス)やDockerUIなどのGUI管理ツールを用いて、コンテナ管理や自動化が行えるメリットがあります。
現在、Dockerはクラウドの3大サービスであるAWS、Azure、GCPでも対応が進められています。
Dockerコンテナの利用メリット
コンテナ型仮想化技術を用いたDockerを利用すると、どんなメリットがあるのでしょうか?メリットを確認することで、Dockerに対する理解をさらに深めましょう。
起動までの時間を大きく短縮できる
一般的な仮想サーバーでは、ゲストOS単位で仮想サーバーが生成されるため、OSの起動から利用可能な状態になるまで分単位の時間を要しますが、コンテナ型仮想化では、コンテナ起動に掛かる時間は数秒程度です。この身軽さ、素早さは大きな利点です。
簡単に環境構築ができる
開発したシステムを動かすためには、同一環境を別のマシンで準備しなければなりません。同一環境の構築の手間、環境確認や環境テストなど、多くの手順が必要です。しかし、Dockerは環境が丸ごと提供されるため、少ない手順でスピーディーに同じ環境を再現できます。
Dockerイメージの配布により開発環境構築の時間が短縮できる
作成したDockerイメージはパッケージとして配布できます。これにより、システム開発などで別のアプリケーションを動かす際にも、Dockerイメージを利用すれば同一環境となり、環境のずれを防止できます。Dockerイメージは開発環境を準備する時間の短縮にもおすすめです。
ハードウェアリソースを削減できる
コンテナ自体は、アプリケーションの実行に必要なものだけに限定され、またホストOSのカーネル部分だけを使用するため、無駄がなくパフォーマンスが向上し、リソースの削減も実現します。
Docker Hubが利用できる
Dockerの特徴としてはコンテナ共有化サービスの『Docker Hub』があります。『Docker Hub』を通じて世界中の開発者の成果物が共有できます。これによって、よりレベルの高い優れたイメージを効果的、効率的に活用できます。
また、『Docker Hub』ではWebサイト構築に利用するWordPressやPHP、MySQLなどの環境がコンテナイメージとして提供されていますので、これらを利用してローカルに簡単にコンテナ環境を作成することも可能です。
【参考】:Docker Hub Container Image Library | App Containerization
インフラ調達は後回しにできる
一般的なシステム開発では、サーバーなどのインフラ環境を先に整えますが、Dockerコンテナでは、まずはアプリケーション作りから始めて問題がありません。アプリケーション開発が進んだところで、コンテナ単位で本番環境に乗せればよいので、システムエンジニアはインフラを気にせず開発に専念できます。
ロールバックが速い
ロールバックの時間が速く簡単なことも、Dockerのメリットの1つです。ロールバックとは、日本語で「後退」「巻き戻し」という意味で、PCの状態を指定したところまで戻すことを言います。
開発やテストを行う上で、バージョンアップや処理を繰り返すことは多いです。そのため、バージョンアップする前や処理を実行する前の状態に戻すのに時間がかかると、作業効率が悪くなります。
ロールバックが速く簡単なことは開発・テスト作業を行う上で重要です。Dockerコンテナは状態の差分を保存するため、ロールバックの時間が速く簡単なのがメリットです。
Dockerコンテナのデメリット
良いことだらけに見えるDockerコンテナですが、デメリットもあり、必ずしもオールマイティではありません。そのため利用する際には、デメリットを意識し、対策が必要な場合があります。以下、Dockerコンテナのデメリットを挙げますので、メリットと同様に認識しましょう。
OSの自由度が制限される
Dockerコンテナは1つのOSに依存するため、OSの自由度はありません。コンテナはホストOSのカーネルを使って動作します。したがってWindowsOS上で直接Linuxコンテナは動作させられません。同一マシン上で異なるOSを動作させるにはホスト型の仮想マシン環境が必要です。
分離レベルが落ちる
コンテナはホストOSへの依存度が高く、個別にOSを立てるホスト型の仮想マシンと比較して、OSとの分離レベルが低いというデメリットがあります。OSの脆弱性などに対する外部からの攻撃に対しては、すべてのコンテナが危険にさらされるため、細かいケアや対策が求められます。
Dockerファイルを作成するための知識が必要
Dockerコンテナは便利なシステムである一方、使いこなすのが難しいと感じることがあります。Dockerコンテナは使用する容量を少なく効率化するため、独自のファイルシステムを使用しています。このファイルシステムを理解するのが難しいと感じる場合があります。
Dockerコンテナに関する疑問を解消
Dockerコンテナに関して、ある程度理解は進んだでしょうか?ここでは、Dockerコンテナに関するよくある疑問について解説します。
Dockerコンテナの製品やサービス
Dockerコンテナを実際に製品やサービスとして提供しているものには何があるのか紹介します。
▪Docker Hub Docker Hubは、開発者が作成したコンテナをWeb上に公開・共有できるサービスです。公開されているコンテナはダウンロード可能で、他人が作成したコンテナを利用してローカルにコンテナ環境を作成することもできます。
なお、2019年にDocker Store・Docker CloudはDocker Hubに統合されました。
【参考】:DockerHub-Docker
▪AWS Fargate AWS Fargateとは、「Amazon ECS(Elastic Container Service)」および「Amazon EKS(Elastic Kubernetes Service)」 で動作する、コンテナ実行環境です。
コンテナ向けのサーバーを意識せずに利用できるクラウドサービスです。Googleの「Google Cloud Run」、Azureの「Azure Container Instances」なども同様のサービスです。
【参考】:AWS Fargate(サーバーやクラスターの管理が不要なコンテナの使用)| AWS
▪Docker Desktop パソコンなどのローカル環境で簡単にDockerコンテナの開発環境を構築、導入できるソフトです。WindowsやMacなどのOSに対応しています。個人向けプランは無償ですが、企業向けプランは有料化されています。
Dockerのインストールと実行方法
Dockerは皆さんのパソコンにインストールをして実際に試すことができます。インストールは『Docker Hub』から入手します。以下のサイトでインストール、実行方法などを確認してください。
【参照】Docker Desktop
Dockerコマンドとは
パソコンにインストールしたDockerを利用するには、コマンドを用います。Windowsであれば、コマンドラインを開いて、直接コマンドを打ち込みます。よく使うコマンドの例を挙げます。
>docker version インストールされているDocker Engineのバージョン情報を確認します。
>docker ps 動作中のコンテナ一覧を表示します。
>docker ps -a 停止中のコンテナも含めて全てのコンテナを一覧表示します。
>docker images 現在取得済みのDockerイメージの一覧を表示します。イメージは主に「Docker Hub」から取得できます。
>docker pull [イメージID] イメージをローカルに取得する際に使うコマンドです。
>docker create --name [コンテナID] [イメージID] 取得したイメージからコンテナ作成を行うコマンドです。
>docker start [コンテナID] コンテナを実行するコマンドです。
>docker stop [コンテナID] コンテナを停止するコマンドです。
>docker cp コンテナのコピー、ファイル転送するコマンドです。
いかがですか?すでにDockerイメージがあれば、以上のコマンドだけでDockerコンテナのイメージを取得し、コンテナの作成と実行ができます。
Dockerコンテナは必ず押さえておくべき技術
ここまで、できるだけ分かり易く「Dockerコンテナ」について解説しました。「Dockerコンテナ」にはさまざまなメリットがあることが理解頂けたと思います。
サーバー仮想化はクラウドサービスを中心に大きく普及しましたが、Dockerを中心とするコンテナ型仮想化は、さらに身近で便利な存在して、普及が進むと見られています。
エンジニアの皆さんは、ぜひDockerコンテナに関する知識を身に付け、システム開発や新たなビジネスで活用してください。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから