フューチャー技術ブログ

Dockerの基本的な概念とマイクロサービスについて

はじめに

こんにちは。流通・製造サービス事業部の添田です。

2023年1月から参画させていただいているプロジェクトで一番初めに躓いたのは、Dockerでした。

Dockerの基本的な概念と、Dockerを利用したマイクロサービスアーキテクチャを中心に解説します。

目次

  1. Dockerとは何か
  2. Dockerを使用することでどのようなメリットがあるのか
  3. Dockerの仕組みについて
  4. Dockerとマイクロサービスについて
  5. Dockerとオーケストレーションツールについて
  6. まとめ
  7. 最後に

1. Dockerとは何か

Dockerとはコンテナ型の仮想環境のことです。頭にコンテナ型とあるように通常の仮想マシンとは違います。ではDockerと仮想マシンとでどのような違いがあるのでしょうか?

結論、カーネルを共有しているか否かです。
下図で通常の仮想マシンを使用する場合の構成とDockerを使用する場合の構成を図解します。

  • 通常の仮想マシン
    ホストOS(Windows・Macなど)上の仮想化ソフトを介して仮想マシン(ゲストOS)を作成します。各仮想マシンは独立したOSとリソースを持ち、アプリケーションやサービスを実行することが可能です。
  • Docker
    ホストOS(Windows・Macなど)上のコンテナ管理ソフト(Docker・Kubernetes等)を介してコンテナを作成します。各コンテナはホストOSのカーネルを共有し、アプリケーションを実行するための必要なリソースのみを持ちます。

2. Dockerを使用することでどのようなメリットがあるのか

  • メリット(1):Dockerを使用することで以下の問題を解決することが可能である
問題 Dockerを使用することで解決すること
以前は上手くいっていた環境構築手順が上手くいかない 実行環境の冪等性の確保
他人の環境では上手くいくのに自分の環境では上手くいかない ポータビリティ性の向上
インフラ周りを構築し直すたび手順がよくわからなくなる 環境構成のコード化

では、なぜ上記のようなことが解決するのでしょうか。

理由はDockerを使用すると環境構築の手順をコードで表現できるからです。

例えば環境構築手順書上に「Dockerをインストールしてください」と記載があったとして、人によってインストールするバージョンが変わってしまうかもしれません。しかし適切にコード化された環境構築手順書が存在すれば誰がどこで実行しても同じ環境が出来上がります。

要は手順書の記載誤りや操作ミスなどのヒューマンエラーを無くすことができるということです。

  • メリット(2):起動が早い
    通常の仮想マシンとDockerの起動時間の差は、仮想マシンがOSを別途起動するのに対し、Dockerは共有のカーネルを使用するため起動が早いです。

3. Dockerの仕組みについて

次にDockerがどのような仕組みで動作しているのか解説していきます。

Dockerはホストマシンにインストールさせて動作させるものになります。ベースとなるのは下図中心部にある デーモン(Docker Demon) です。このデーモンがDockerイメージやコンテナの作成・管理・実行等を行うコントローラー的な役割を担っている存在です。

続いて下図右上にある、イメージ(Docker Image) について説明していきます。このイメージとはアプリケーションや依存関係、実行に必要なファイルなどのアプリケーションの実行に必要なものをパッケージ化したものであり、コンテナを作成するための指示が記載されたもの、いわばアプリケーションの実行環境を定義づける設計図のようなものです。DockerイメージはDockerFile と呼ばれるテキストファイル内に記載され、ビルドされます。このイメージはユニークに識別可能な識別子を持っており、この識別子を利用して識別されます。また、プログラムでいうところのクラスがイメージに当たります。

続いて下図上部のレジストリ(Doceker Registry) について説明していきます。レジストリとはイメージの保存・管理・配布を目的としたリポジトリであり、Docker公式のDocker Hubというレジストリや、Amazon Elastic Container Registryなど様々なレジストリが存在します。イメージは自分で作成することも可能ですが、上記のレジストリから既に作成済のイメージをPullして使用することも可能です。また、レジストリはチーム内だけのレジストリなど、プライベートレジストリとして作成することも可能です。

続いてコンテナ(Docker Container) について説明していきます。コンテナ型仮想環境と言われる所以であり、コンテナはイメージを元に作成され、デーモンによって管理されます。
コンテナは独立した仮想環境であり、イメージから作成された実体になります。つまりコンテナとは実際にアプリケーションやサービスを実行する場所ということになります。また、プログラムでいうところのインスタンスがコンテナに当てはまります。

最後に上記の説明を簡単にまとめます。

  • 実際のアプリケーションやサービスが実行される場所がコンテナである
  • コンテナを生成するためにはコンテナの設計図となるイメージが必要である
  • イメージは自分で作成することもできるが、イメージの保管場所であるレジストリからPullしても良い
  • コンテナやイメージの作成・管理・実行を行うのはデーモンというコントローラー的役割のプロセスである
Docker仕組み

4. Dockerとマイクロサービスについて

近年、Dockerはその性質からマイクロサービスというアーキテクチャと非常に相性が良く様々な企業でDockerを利用したマイクロサービスアーキテクチャの採用がされていることからDockerを利用したマイクロサービスアーキテクチャの概念について説明していきます。

  • マイクロサービスとは

ソフトウェア開発におけるアーキテクチャの一種であり、アプリケーションを複数の小さな独立したサービスに分割し開発・デプロイ等を行う概念となります。マイクロサービスの主なメリットデメリットを以下に解説します。

メリット デメリット
柔軟性・スケーラビリティ システム全体の複雑化
異なる言語やDBが使用可能 システムやアプリケーション設計の難易度の上昇
障害に強いシステムの開発 結合テスト・デバッグの難易度の上昇

上記が主なメリットとデメリットです。

マイクロサービスアーキテクチャを導入することで、例えばチーム内にJavaしかできない人、Goしかできない人が居たとしても独立したサービスに分割して作成するため、問題なく開発を進めることができます。それぞれのサービスに適した技術要素を選択して柔軟に開発を進めることも可能ですね。

このようなメリットがある一方、デメリットも存在します。それぞれのサービスが分割して作成されていれば当然システム全体は複雑化し、さらに開発言語も分かれていたとしたらPL・PM等の管理者はそれぞれの言語に精通している必要があります。つまり単一のサービスの開発はスピーディーに行える一方で、システム全体のテストや設計などの難易度は上がります。

  • Dockerを利用したマイクロサービスについて

なぜDockerを利用したマイクロサービスが導入されているのか、解説していきます。

  1. 環境の統一性
    Dockerを利用したマイクロサービスでは、各マイクロサービスが独立したDockerコンテナ内で実行されます。これにより、異なる環境でもコンテナが一貫した方法で実行されるため、環境の違いによる問題を最小限に抑えることができます。一方、Dockerを利用しない場合、開発環境や本番環境などの環境の違いによる問題が発生する場合があります。
  2. デプロイとスケーリングの容易さ
    Dockerを利用したマイクロサービスでは、各マイクロサービスを個別のコンテナとしてデプロイできます。これにより、新しいバージョンのマイクロサービスを迅速かつ簡単にデプロイできます。また、必要に応じてコンテナの数をスケーリングすることも容易です。一方、Dockerを使用しない場合、各マイクロサービスのデプロイとスケーリングは手動で行う必要があり、手間や時間がかかる可能性があります。
  3. 開発効率の向上
    Dockerを利用したマイクロサービスでは、開発者は環境のセットアップや依存関係の管理に時間を費やす必要がありません。Dockerイメージを利用することで、素早く開発を進めることができます。

上記のような理由からDockerとマイクロサービスは相性がよく、組み合わせることでより開発効率がよくなるため導入されていると言えるでしょう。

5.Dockerとオーケストレーションツールについて

Dockerの便利で素晴らしい点をこれまで解説してきましたが、例えばコンテナ数が大量に存在するようなシステムの場合、人手による管理は現実的ではないです。

そこで使用されるのがオーケストレーションツールというものです。オーケストレーションツールはコンテナのスケーリングや、コンテナの強制終了・再起動等の管理、負荷分散などの管理運用を自動的に行ってくれるツールです。

代表的なものとしてKubernetesというオーケストレーションツールがあります。今回は詳細な解説は行いませんが、DockerとKubernetesなどのオーケストレーションツールはよく組み合わせて使用されます。

コンテナを作成をするのがDockerコンテナの管理を行うのがKubernetes という認識で問題ないです。

5.まとめ

いかがでしたでしょうか。私は現在のプロジェクトに参画して一番最初に躓いたところがDockerでした。

しかし学習を進めていけばいくほど非常に素晴らしい技術ということが分かり力を入れて学んできた技術です。

正直、プログラミング言語の習得より難易度が高いなぁ、と思っていますが、難易度が高い故にこれらの技術を使いこなせる人材は貴重だということもわかりました。

そのため、今後も継続的に学習を行い、しっかり使いこなせるような人材になっていきたいと思います。

6.さいごに

今回はDockerの基礎的な部分とマイクロサービス、オーケストレーションツールの概要について解説をさせていただきました。

Dockerに関しても、オーケストレーションツールに関してもまだまだ解説できていない箇所がありますが、次回以降の投稿で解説していこうと思います。