クラウドインテグレーション部の髙橋です。
本記事はコンテナ入門と題しまして、仮想化、コンテナ型仮想化(以下、コンテナ)、Dockerに関してざっくりまとめた内容となっています。最後にはDocker、Docker Composeのデモを行っています。
仮想化は、コンピュータの物理的なリソース(CPU、メモリ、ディスクなど)を論理的なリソースに変換し、ハードウェアを再現するという技術です。
ざっくり言うと、パソコンの中にパソコンを用意することができます。
仮想化を利用すると、サーバやシステムを一つのハードウェアに集約できます。仮想化技術を利用しない場合では、全てのサーバやシステムごとにハードウェアを用意する必要があります。管理する手間などもあるので、仮想化を使う方がコンパクトに収まります。
仮想マシンとは、仮想化を行った際に仮想化ソフトウェア上で起動しているサーバやシステムのことを言います。
下の図ではwebサーバやメールサーバなどが仮想マシンに該当します。
以下のメリットがあります。
以下のような課題があります。
コンテナとは、アプリケーションとその実行環境を1つにまとめあげる技術のことです。動作に必要なOSをコンテナエンジンを通して、コンテナ同士が共有します。これによって、ハードウェアのリソースと切り離した仮想環境を作り出すことができます。
ざっくり言うと、アプリケーションに必要な機能を一つにまとめることができる技術です。
コンテナが仮想マシンと大きく違う部分は、仮想マシンのOSレイヤーに当たる部分がないことです。仮想化では仮想化ソフトウェア上に複数のOSを起動するのに対し、コンテナでは1つのOSで複数のシステムを動かします。
次に仮想マシンと比較した、コンテナのメリットについて説明します。
また、開発/実行環境をラップできることもメリットとして挙げられます。
これによって、ライブラリやミドルウェアをホストOSにインストールする必要がなくなります。
例えば、同一ソフトの異なるバージョンを同じPCで利用したい場合、コンテナを使わないと以下のような手順を実行しなければいけません。
一方でコンテナを利用する場合、元々使っていた環境はそのままに、異なるバージョンのソフトを立ち上げることができます。それぞれは完全に独立した環境になってまして、互いに干渉することがありません。
Dockerは、2013年に最初にリリースされたコンテナ管理ソフトウェアです。
Docker以外にもコンテナエンジンはいくつかあるのですが、現状はDockerの利用が約半数を占めているようです。
Dockerは実行環境をテキストファイルとして共有できます。それにより、以下のようなメリットがあります。
公式や有志がDocker Hub(イメージを共有しているサービス)上にイメージファイルを保存してくれています。ユーザーはDocker Hubから目的のイメージファイルを探し、コンテナの起動ができます。
Docker Composeは、複数のコンテナのビルドや起動・停止をより簡単に行うためのソフトウェアです。YAMLファイルで定義したコンテナを作成でき、コンテナ同士のネットワーク構築も可能です。
Docker Composeは、コンテナを複数立てる場合に手間を減らすことができます。Dockerで複数コンテナを立てる際には、その分コマンドを打ち込まなければいけません。Docker Composeでは、YAMLファイルに複数のコンテナやコンテナ間のネットワークを定義でき、効率的に作成・管理ができます。
以下の流れで、Docker Composeは利用できます。
テンプレートの例
以下では、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: {}
では、実際に使ってみましょう。
以下のような流れで作成していきます。
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について紹介させて頂きました。
現在では、コンテナでのアプリ実装も主流になりつつあると感じるので、今回紹介したものを使っていただけたらと思います。
後編では、クラウドにおけるコンテナ利用について説明します。
→後編はこちら:コンテナ入門 後編: クラウドにおけるコンテナ