コンテナ入門 前編:コンテナとは何者か? コンテナの概要
目次
はじめに
クラウドインテグレーション部の髙橋です。
本記事はコンテナ入門と題しまして、仮想化、コンテナ型仮想化(以下、コンテナ)、Dockerに関してざっくりまとめた内容となっています。最後にはDocker、Docker Composeのデモを行っています。
仮想化とは
仮想化は、コンピュータの物理的なリソース(CPU、メモリ、ディスクなど)を論理的なリソースに変換し、ハードウェアを再現するという技術です。
ざっくり言うと、パソコンの中にパソコンを用意することができます。
仮想化を利用すると、サーバやシステムを一つのハードウェアに集約できます。仮想化技術を利用しない場合では、全てのサーバやシステムごとにハードウェアを用意する必要があります。管理する手間などもあるので、仮想化を使う方がコンパクトに収まります。
仮想マシンとは
仮想マシンとは、仮想化を行った際に仮想化ソフトウェア上で起動しているサーバやシステムのことを言います。
下の図ではwebサーバやメールサーバなどが仮想マシンに該当します。
仮想マシンのメリット
以下のメリットがあります。
- サーバ管理コストの減少
- 管理するサーバ台数を減らすことができます。
- 様々なOSへの対応
- 仮想マシンごとにOSを変更できます。
- スペックの拡張・縮小の簡易化
- リソースの割り当てが仮想マシンごとに可能で、余っているものをそのままスペック拡張に利用できます。
従来の仮想マシンの課題
以下のような課題があります。
- 起動・停止が遅い
- 仮想マシンの起動にはカーネルの起動などの通常のパソコンを立ち上げるような工程が入ります。
- 仮想マシンの個別管理が大変
- 仮想マシン一つ一つに対して、物理リソースの割り当てやパッチ適用など対応が必要になります。
- バックアップや移行に時間がかかる
- 仮想マシンを丸ごと対象に行わなければいけないので、数GB~数十GBのイメージファイルが必要になります。
コンテナ
コンテナとは、アプリケーションとその実行環境を1つにまとめあげる技術のことです。動作に必要なOSをコンテナエンジンを通して、コンテナ同士が共有します。これによって、ハードウェアのリソースと切り離した仮想環境を作り出すことができます。
ざっくり言うと、アプリケーションに必要な機能を一つにまとめることができる技術です。
仮想マシンとの違い
コンテナが仮想マシンと大きく違う部分は、仮想マシンのOSレイヤーに当たる部分がないことです。仮想化では仮想化ソフトウェア上に複数のOSを起動するのに対し、コンテナでは1つのOSで複数のシステムを動かします。
コンテナのメリット
次に仮想マシンと比較した、コンテナのメリットについて説明します。
- 起動・停止の高速化
- 仮想マシンのOSレイヤーがないので、それにより起動・停止は高速化されます。
- 管理が必要なレイヤーの減少
- 仮想マシンを利用するより、管理レイヤーが少ないです。
- バックアップ・移行のコンパクト化
- 仮想マシン丸ごとのバックアップではなくなったので、よりコンパクトに実施できます。
また、開発/実行環境をラップできることもメリットとして挙げられます。
これによって、ライブラリやミドルウェアをホストOSにインストールする必要がなくなります。
例えば、同一ソフトの異なるバージョンを同じPCで利用したい場合、コンテナを使わないと以下のような手順を実行しなければいけません。
- 元のバージョンをアンインストール
- アンインストールで消せなかった設定ファイルなどの削除
- 新しいバージョンを再インストール
一方でコンテナを利用する場合、元々使っていた環境はそのままに、異なるバージョンのソフトを立ち上げることができます。それぞれは完全に独立した環境になってまして、互いに干渉することがありません。
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は利用できます。
- 各コンテナのビルド内容をDockerfile内に記載(自分でイメージを用意する場合)
- 各コンテナの設定などをdocker-compose.yamlに定義
- docker-compose upコマンドを実行
- 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について紹介させて頂きました。
現在では、コンテナでのアプリ実装も主流になりつつあると感じるので、今回紹介したものを使っていただけたらと思います。
後編では、クラウドにおけるコンテナ利用について説明します。
→後編はこちら:コンテナ入門 後編: クラウドにおけるコンテナ
アジアクエスト株式会社では一緒に働いていただける方を募集しています。
興味のある方は以下のURLを御覧ください。