簡単無料エンジニア登録 ご登録

Dockerとは?概要やメリットをわかりやすく解説

近年では、デジタルトランスフォーメーション(DX)の推進に伴い、先進企業を中心にコンテナ技術の導入が加速しています。その中で、Dockerはコンテナ技術のデファクトスタンダードとして広く認知されており、エンジニアにとって欠かせない技術です。本記事では、Dockerの概要やメリットに加え、コンテナ技術をさらに活用するためのコンテナオーケストレーションの概要について、分かりやすく紹介します。

Dockerとは
Dockerは、ホストOS上で動作するコンテナ型仮想化ソフトウェア。アプリケーションは、コンテナの中にパッケージ化されて動作します。
一方、仮想サーバは仮想化ソフトウェア(ハイパーバイザー)の上で動作。仮想サーバは独自のゲストOSが動作し、そのゲストOSの上でアプリケーションが実行されます。
下図は、コンテナと仮想サーバの違いを比較したものです。

仮想サーバは、ハイパーバイザーを介してハードウェアのリソースを割り当てるため、仮想サーバの台数が増えるとオーバーコミットになる可能性があります。この場合、リソース不足により仮想サーバのパフォーマンスが低下し、動作が重たくなります。

これに対して、Dockerはコンテナ単位でアプリケーションの実行環境が分離されており、アプリケーションが互いに干渉し合うことを防ぐことができるため安定した動作を実現。さらに、DockerはホストOSのカーネルを共有して動作するため、仮想サーバと比べて少ないリソースで効率的に動作します。

なお、WSL2(Windows Subsystem for Linux2)またはDocker Desktopを使用することで、WindowsでDockerを動かすことが可能です。WSL2は、WindowsにLinux環境を構築することができ、その上でDockerを動作させることができます。Docker Desktopは、WindowsおよびmacOSにインストールするだけで利用可能なソフトウェアです。

Dockerのメリット
Dockerは、高い可搬性(ポータビリティ)を備えており、オンプレミスからクラウドへの移行といった、異なる環境でも同じコンテナを再現できます。そのため、アプリケーション移行がスムーズに進みます。
また、スケーラビリティの面でも優れており、オーケストレーションツールを使用することで、コンテナの水平スケーリングや垂直スケーリングを実現。スケーラビリティの高いアプリケーション開発が容易です。
さらに、Dockerfileを活用することで、Dockerイメージをコードとして作成ができます。インフラをコード化(Infrastructure as Code)できるため、可読性が向上するとともにインフラの構成管理が効率化されます。

Dockerの基本要素

Dockerコンテナ


Dockerコンテナとは、アプリケーションを実行するための隔離された環境のことです。
その環境の中で動作する実行中のプログラムを「プロセス」と呼ぶ。
プロセスは、名前空間という仕組みによって、他のプロセスからファイルシステムやネットワークインターフェースなどを隔離できます。これにより、プロセスごとに独立した環境になります。
また、一般的には1コンテナにつき1プロセスが基本です。アプリケーションを同じコンテナに同居すべきかは、セキュリティ面や運用面を考慮して選択するとよいでしょう。

コンテナイメージ
コンテナイメージとは、コンテナを実行するうえで必要な設定が入っているテンプレートのことです。コンテナイメージは、複数のレイヤーの集まりでベースとなるコンテナイメージのファイルシステムに新しいレイヤーを重ねることによってコンテナイメージが作成されます。ファイルシステムとは、プロセスを実行するために必要なプログラムや設定などが格納され、プロセスが動作する環境を提供する仕組みです。
例えば下図に示すように、UbuntuをベースとしたコンテナイメージにNginxのプログラムや設定ファイルを含めたレイヤーが重なったイメージになります。

コンテナイメージの作成方法
コンテナイメージは、Docker Hubからダウンロードする方法やDockerfileに記述する方法があります。

Docker Hub
Docker Hubとは、Docker社が提供しているコンテナレジストリです。コンテナイメージを検索やダウンロードしたり、自身で作成したDockerイメージをプッシュして他のユーザーと共有したりできます。また、作成したDockerイメージを保管する場所としても活用可能。特に企業や団体が提供する公式イメージは、信頼性が高くプロジェクトなどで利用するのに適しています。

Dockerfile
Dockerfileは、コンテナイメージの設計図のようなもので、テキスト形式で記述します。Dockerfileをもとにビルドを行うことで、Dockerイメージを作成。
本記事では、Dockerfileのサンプルを使い、WebサーバとしてApacheを起動し「Hello World!」を表示させる手順を説明します。
①Dockerfileを任意フォルダに保存します。
<ファイル名:Dockerfile>

FROM ubuntu:latest

# パッケージのアップデートとApache2のインストール
RUN apt-get update && apt-get -y install apache2

# Hello Worldページ作成
RUN echo 'Hello World!' > /var/www/html/index.html

# Apacheを起動
CMD ["apachectl", "-D", "FOREGROUND"]

②Dockerイメージをビルドするために、以下のコマンドを実行します。
 ※「-t」オプションは、イメージに名前を付けます
 #docker build -t my-apache .

③ビルドしたイメージからコンテナを起動します。
 ※「-p 8080:80」コマンドは、ローカルポート:8080をコンテナ内のポート80にマッピングします
 #docker run -p 8080:80 my-apache

④ブラウザで以下のURLにアクセスして、「Hello World!」が表示されることを確認します。
 http://localhost:8080

Docker Compose
Dockerは、1つのコンテナごとに操作する必要がありましたが、Docker Composeを利用すると複数のコンテナを一度に操作ができます。Docker Composeで設定を記述する場合は、YAML形式で定義ファイルを作成します。定義ファイルのファイル名は、あらかじめ決められており「docker-compose.yml」です。注意点として、定義ファイルは1つのCompose用フォルダに対して1つしか置けません。

コンテナオーケストレーションとは
コンテナオーケストレーションは、複数のコンテナの管理・運用を行い、負荷分散や死活監視、スケーリングなどの作業を自動化する仕組みになります。

負荷分散は、コンテナへの負荷を軽減するために、複数のコンテナへリクエストを振り分けて負荷を分散する仕組みです。コンテナの前段に負荷分散装置を設けて負荷分散します。これにより、システムの処理時間が短縮され、全体的な性能が向上します。

死活監視は、システムを構成しているコンテナが正常に稼働しているかを監視する仕組みです。負荷分散と組み合わせて利用され、正常に稼働していないコンテナに振り分けられないように防ぎます。

スケーリングは、システムを構成しているコンテナに対して処理能力を超えるリクエストがきた場合に、コンテナを水平スケーリングや垂直スケーリングしてくれる仕組みです。水平スケーリング(スケールアウト/スケールイン)は、コンテナの数を増減する方法です。一方、垂直スケーリング(スケールアップ/スケールダウン)はコンテナの性能を上下する方法。

Kubernetes
複数の物理サーバや仮想サーバにまたがるコンテナを、1台ずつ手作業で管理・運用するのは現実的ではありません。そのため、オーケストレーションツールのKubernetes(K8s)でコンテナの管理・運用を行います。
Kubernetesには、ワーカーノードとマスターノードの2種類の役割があり、ワーカーノードは、Pod(ポッド)を起動する役割を担います。Podとは、Kubernetesがコンテナを管理するための最小単位です。
一方、マスターノードはワーカーノードに対して、Podをどこに配置するかのコントロールを司ります。これらのワーカーノードとマスターノードで構成された一群をクラスターと呼ぶ。マスターノードは自動的にワーカーノードの管理を行い、利用者はマスターノードの初期設定や調整を行います。これにより、大規模なコンテナの運用・管理が効率的に行えるようになります。

まとめ
Dockerの概要やメリットに加えてコンテナオーケストレーションツールであるKubernetesについて紹介しました。

Dockerは、異なる環境でも同じコンテナを再現できる高い可搬性を備えています。また、Dockerfileを用いることでインフラのコード化を実現ができ、アプリケーション開発において、再現性と生産性が大幅に向上。さらに、Docker Composeを活用すれば、複数のコンテナをまとめて操作できるため、小規模な開発環境における運用・管理が容易になります。

一方、オーケストレーションツールであるKubernetesを活用することで、負荷分散や死活監視、スケーリングなどの作業を自動化し、大規模なコンテナの運用・管理を実現します。

開発規模やプロジェクトの要件に応じて、DockerやKubernetesを柔軟に使い分けることが大切です。ぜひ、本記事を参考にして、実際のプロジェクトでDockerやKubernetesを活用してみてください。イーランサーではフリーランスエンジニアのサポート、企業様のプロジェクトをお受けしております。お気軽にご相談下さいませ。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次