コンテナ入門 前編:コンテナとは何者か? コンテナの概要

    コンテナ入門 前編:コンテナとは何者か? コンテナの概要

    目次

      はじめに

      クラウドインテグレーション部の髙橋です。
      本記事はコンテナ入門と題しまして、仮想化、コンテナ型仮想化(以下、コンテナ)、Dockerに関してざっくりまとめた内容となっています。最後にはDocker、Docker Composeのデモを行っています。

      仮想化とは

      仮想化は、コンピュータの物理的なリソース(CPU、メモリ、ディスクなど)を論理的なリソースに変換し、ハードウェアを再現するという技術です。

      ざっくり言うと、パソコンの中にパソコンを用意することができます。

      仮想化を利用すると、サーバやシステムを一つのハードウェアに集約できます。仮想化技術を利用しない場合では、全てのサーバやシステムごとにハードウェアを用意する必要があります。管理する手間などもあるので、仮想化を使う方がコンパクトに収まります。

      202404_container _overview_01

      仮想マシンとは

      仮想マシンとは、仮想化を行った際に仮想化ソフトウェア上で起動しているサーバやシステムのことを言います。
      下の図ではwebサーバやメールサーバなどが仮想マシンに該当します。

      202404_container _overview_02

      仮想マシンのメリット

      以下のメリットがあります。

      • サーバ管理コストの減少
        • 管理するサーバ台数を減らすことができます。
      • 様々なOSへの対応
        • 仮想マシンごとにOSを変更できます。
      • スペックの拡張・縮小の簡易化
        • リソースの割り当てが仮想マシンごとに可能で、余っているものをそのままスペック拡張に利用できます。

      202404_container _overview_03

      従来の仮想マシンの課題

      以下のような課題があります。

      • 起動・停止が遅い
        • 仮想マシンの起動にはカーネルの起動などの通常のパソコンを立ち上げるような工程が入ります。
      • 仮想マシンの個別管理が大変
        • 仮想マシン一つ一つに対して、物理リソースの割り当てやパッチ適用など対応が必要になります。
      • バックアップや移行に時間がかかる
        • 仮想マシンを丸ごと対象に行わなければいけないので、数GB~数十GBのイメージファイルが必要になります。

      コンテナ

      コンテナとは、アプリケーションとその実行環境を1つにまとめあげる技術のことです。動作に必要なOSをコンテナエンジンを通して、コンテナ同士が共有します。これによって、ハードウェアのリソースと切り離した仮想環境を作り出すことができます。

      ざっくり言うと、アプリケーションに必要な機能を一つにまとめることができる技術です。

       

      仮想マシンとの違い

      コンテナが仮想マシンと大きく違う部分は、仮想マシンのOSレイヤーに当たる部分がないことです。仮想化では仮想化ソフトウェア上に複数のOSを起動するのに対し、コンテナでは1つのOSで複数のシステムを動かします。

      202404_container _overview_04

      コンテナのメリット

      次に仮想マシンと比較した、コンテナのメリットについて説明します。

      • 起動・停止の高速化
        • 仮想マシンのOSレイヤーがないので、それにより起動・停止は高速化されます。
      • 管理が必要なレイヤーの減少
        • 仮想マシンを利用するより、管理レイヤーが少ないです。
      • バックアップ・移行のコンパクト化
        • 仮想マシン丸ごとのバックアップではなくなったので、よりコンパクトに実施できます。

      また、開発/実行環境をラップできることもメリットとして挙げられます。
      これによって、ライブラリやミドルウェアをホストOSにインストールする必要がなくなります。
      例えば、同一ソフトの異なるバージョンを同じPCで利用したい場合、コンテナを使わないと以下のような手順を実行しなければいけません。

      1. 元のバージョンをアンインストール
      2. アンインストールで消せなかった設定ファイルなどの削除
      3. 新しいバージョンを再インストール

      一方でコンテナを利用する場合、元々使っていた環境はそのままに、異なるバージョンのソフトを立ち上げることができます。それぞれは完全に独立した環境になってまして、互いに干渉することがありません。

      202404_container _overview_05

      Docker

      Dockerは、2013年に最初にリリースされたコンテナ管理ソフトウェアです。
      Docker以外にもコンテナエンジンはいくつかあるのですが、現状はDockerの利用が約半数を占めているようです。

      202404_container _overview_06

      Dockerのメリット

      Dockerは実行環境をテキストファイルとして共有できます。それにより、以下のようなメリットがあります。

      • 複数人での開発で同じ環境を一瞬で揃えられる
      • インターネット上に公開されている先人の環境を利用できる 

      公式や有志がDocker Hub(イメージを共有しているサービス)上にイメージファイルを保存してくれています。ユーザーはDocker Hubから目的のイメージファイルを探し、コンテナの起動ができます。

      202404_container _overview_07

      Docker Compose

      Docker Composeは、複数のコンテナのビルドや起動・停止をより簡単に行うためのソフトウェアです。YAMLファイルで定義したコンテナを作成でき、コンテナ同士のネットワーク構築も可能です。

      202404_container _overview_08

      Docker Composeのメリット

      Docker Composeは、コンテナを複数立てる場合に手間を減らすことができます。Dockerで複数コンテナを立てる際には、その分コマンドを打ち込まなければいけません。Docker Composeでは、YAMLファイルに複数のコンテナやコンテナ間のネットワークを定義でき、効率的に作成・管理ができます。

      実行方法

      以下の流れで、Docker Composeは利用できます。

      1. 各コンテナのビルド内容をDockerfile内に記載(自分でイメージを用意する場合)
      2. 各コンテナの設定などをdocker-compose.yamlに定義
      3. docker-compose upコマンドを実行
      4. YAMLファイルで定義したアプリケーションが実行

      テンプレートの例

      以下では、webとredisの二つのコンテナが定義されています。webコンテナのlinks:でredisを指定していますが、これでコンテナ間のネットワークが構築できます。

      また、build:は自分で用意したDockerfileから構築したイメージを指定し、image:では公開されているイメージを指定します。

      version: "3.9"
      services:
      web:
      build: .
      ports:
      - "8000:5000"
      volumes:
      - .:/code
      - logvolume01:/var/log
      links:
      - redis
      redis:
      image: redis
      volumes:
      logvolume01: {}

      使い方

      では、実際に使ってみましょう。
      以下のような流れで作成していきます。

      • Docker
        • Dockerのインストール
        • Nginxを立ち上げる
      • Docker Compose
        • Docker Composeのインストール
        • WordPressを立ち上げる

      Ubuntuを使って構築していきます。

      Docker

      まず、Dockerのインストールから行います。
      Dockerのインストールに必要なライブラリをインストールします。

      参考サイト:Install Docker Engine on Ubuntu

      sudo apt-get install ca-certificates curl gnupg

      Docker公式のGPGキーをインストールします。

      sudo install -m 0755 -d /etc/apt/keyrings
      curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
      sudo chmod a+r /etc/apt/keyrings/docker.gpg

      リポジトリを追加します。

      echo \
      "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
      "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
      sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

      リポジトリを追加したので、aptをアップデートします。

      sudo apt update

      Dockerをインストールします。

      sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

      Dockerをインストールした際に、Dockerグループが自動的に作成されます。今のままでは、Dockerを利用できない(権限がない)ので、ubuntuユーザをdockerグループに入れます。

      sudo adduser ubuntu docker

      ユーザ追加後は、再ログインします。

      次に、nginxを立ち上げていきます。「docker run nginx」だけでも起動はできるのですが、今回はブラウザで確認したいので、ポートを指定して起動してみます。

      docker run -p 80:80 nginx

      ブラウザでIPを入力すると、、、

      202404_container _overview_09

      デフォルトページが表示されたので、立ち上げに成功しました。

      Docker Compose

      Docker Composeをインストールしていきます。

      sudo apt install docker-compose -y

      続いて、WordPressを作っていきます。コンテナ定義を行うYAMLファイルを作成します。用意されたイメージのみを利用するので、Dockerfileの作成はしません。

      vi docker-compose.yaml
      version: '3.9'
      services:
      db:
      image: mysql:latest
      volumes:
      - db_data:/var/lib/mysql
      restart: always
      environment:
      - MYSQL_ROOT_PASSWORD=(MYSQLルートユーザのパスワード)
      - MYSQL_DATABASE=(DB名)
      - MYSQL_USER=(MYSQLユーザ名)
      - MYSQL_PASSWORD=(MYSQLユーザのパスワード)
      wordpress:
      image: wordpress:latest
      depends_on:
      - db
      ports:
      - 80:80
      restart: always
      environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
      - WORDPRESS_DB_NAME=wordpress
      volumes:
      db_data:

      保存したら、YAMLファイルからコンテナを作成します。

      docker compose -f docker-compose.yaml up -d

      docker psでコンテナの起動状況を確認します。

      202404_container _overview_10

      二つのコンテナが起動していることがわかります。

      ブラウザでIPを入力すると、、、

      202404_container _overview_11

      WordPressの初期画面が表示されました。

      最後にコンテナの削除も行なっておきます。

      docker rm $(docker ps -q -a)

      まとめ

      コンテナを中心に、仮想化やDockerについて紹介させて頂きました。
      現在では、コンテナでのアプリ実装も主流になりつつあると感じるので、今回紹介したものを使っていただけたらと思います。

      後編では、クラウドにおけるコンテナ利用について説明します。
      →後編はこちら:コンテナ入門 後編: クラウドにおけるコンテナ