AQ Tech Blog

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

作成者: takeru.takahashi|2024年03月26日

はじめに

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

仮想化とは

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

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

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

仮想マシンとは

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

仮想マシンのメリット

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

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

従来の仮想マシンの課題

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

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

コンテナ

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

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

 

仮想マシンとの違い

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

コンテナのメリット

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

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

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

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

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

Docker

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

Dockerのメリット

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

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

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

Docker Compose

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

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を入力すると、、、

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

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でコンテナの起動状況を確認します。

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

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

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

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

docker rm $(docker ps -q -a)

まとめ

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

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