Dockerに入門しました。複数回に分けて備忘録として記載していきます。本記事ではDockerの概要を記載していきます。
【参考記事】
- 【Udemy】米シリコンバレーDevOps監修!超Docker完全入門(2022)【優しい図解説とハンズオンLab付き】
- 【Udemy】現役Webエンジニアが教えるPHP,MySQL,dockerを使用したフルスクラッチ開発
【関連記事】
- 【第1回】Dockerインストール→Linux(CentOS7)を起動
- 【第2回】Linuxの概要/GCPでUbuntuをインストール
- 【第3回】WEBサーバを構築(Nginx)/ネットワークの概要
- 【第4回】WEBアプリ構築/Dockerでの環境構築準備
- 【第5回】Dockerの概要
- 【第6回】Dockerのインストール・作成・起動・停止
- 【第7回】PHPの開発環境を構築(PHPとApacheのみ)
- 【第8回】PHPの開発環境を構築(docker-composeで複数コンテナを一括で起動)
- 【第9回】PHPの環境構築_その2_(環境構築自動化)
Dockerとは
- コンテナ型の仮想化技術の一種
- コンテナにはゲストOSがないため、VMよりとても軽量
- コードとライブラリーやパッケージをパッキングすること
Dockerが注目される、普及している理由
- 2013年以降、普及は右肩上がり
- DevOpsのサイクルにはまっている
- ユーザーに早く正確にコードを届けることができる
従来
開発 開発エンジニア
↓
テスト インフラエンジニア
↓
本番 インフラエンジニア
環境、チームが異なり、
開発環境では動いていた→本番環境では動かない ということが起こった
運用面
従来は、ファイルやフォルダーをジェンキンスなどのCICDパイプラインを使って、本番環境にコピーしていた。
Dockerが解決する問題
- 開発チーム
コードとライブラリをパッケージングしてdocker-imageを作成(コンテナ化) - 運営チーム
docker-imageをもらって本番環境を構築 - 上記によりライブラリーや依存性の問題を防げる
Dockerを使用することで以下を実現
- 開発環境と運営環境を同一にする(コードと依存性をコンテナ化)
- 環境の違いによる不動作を防ぐことができる
運用面での変化
- コードとライブラリーをパッケージングしてdocker-imageを作成
- 本番環境のサーバーにドッカーイメージをダウンロード
- それを実行するだけでOK
- デプロイ先がコンテナ(コード+パッケージ)になる
- OS問わず同一の動作をする
仮想マシンによる仮想化とコンテナによる仮想化の違い
仮想マシンによる仮想化
┌─────────────┐ ┌─────────────┐
│ APP 1 │ │ APP 2 │
└─────────────┘ └─────────────┘
┌─────────────┐ ┌─────────────┐
│ Module 1 │ │ Module 2 │
└─────────────┘ └─────────────┘
┌─────────────┐ ┌─────────────┐
│ Guest OS 1 │ │ Guest OS 2 │
└─────────────┘ └─────────────┘
┌─────────────────────────────┐
│ VM SoftWare │
└─────────────────────────────┘
┌─────────────────────────────┐
│ Host OS │
└─────────────────────────────┘
仮想マシンによる仮想化特徴
- Guest OSがある
- CPUやメモリなどのリソース消費が多い
- 起動にかかる時間が長い
コンテナによる仮想化
┌─────────────┐ ┌─────────────┐
│ APP 1 │ │ APP 2 │
└─────────────┘ └─────────────┘
┌─────────────┐ ┌─────────────┐
│ Module 1 │ │ Module 2 │
└─────────────┘ └─────────────┘
┌─────────────────────────────┐
│ VM SoftWare │
└─────────────────────────────┘
┌─────────────────────────────┐
│ Host OS │
└─────────────────────────────┘
コンテナ型の仮想化の特徴
- ホストOS上にコンテナという環境を作る
- まるで別々のOS化のような環境を隔離する
- CPUのメモリなどのリソース消費量が少なく、起動時間も高速
OS仮想化と比べたDockerのメリット
- リソースが軽い
- ストレージの使用量が減る
- 起動時間が早い
- 複数環境で使用可能
リソースが軽い
- OSを複数使わないぶん、オーバーヘッド(複数のOSイメージとカーネル)が減る
- プロセッサやメモリの消費が少なくなる
ストレージの使用量が減る
- OSイメージの通常サイズが5-10GB docker-imageのサイズは1-2GBになる
起動時間が早い
- カーネルのロード時間がなくなるので、仮想マシンに比べて起動時間が早くなる
複数環境で使用可能
- Dockerがインストールされている環境ならホストOSに依存せずにアプリが起動する
Dockerのクライアントとサーバーアーキテクチャについて
Client
ls
docker build
docker pull
docker run
Server(Docker Daemon)
ls
Daemon process
Agent
Dockerが使われる理由
- 開発環境、本番環境とも非常によく使われている
- 環境構築で大きなメリットがあるため使われている
Dockerがない場合の環境構築
- 手順書を元に手作業で環境構築する方法
- ちょっとした手順のミスや環境の微妙な違いでエラーになることが少なくない
環境構築の再現性を高める2つの方法
IaC(Infrastructure as Code)
- 環境構築の内容をコード化する
- ツール例 Asible, Chef
デメリット
- 実行時にエラーになる場合がある
- サーバ起動時に実行すると時間がかかる
構築した環境をイメージ化して運搬
- 動く環境をイメージ化して運搬
- ツール例 Amazon AMI
デメリット
- VMイメージは作成にかかる時間が長い
- サイズが大きく、転送にかかる時間が長い
イメージとコンテナの違い
- 例1 ClassとObject
- 例2 車の設計図 実際の車
- つまり、テンプレートと実物の違い
Dockerのメリット
- VMより軽量な環境をイメージ化して運搬可能
- Infrastracture as Codeの機能もある
Dockerの開発環境での使用例
# 開発用のDBの起動コマンド例
# コマンド一行でコンテナ上のDBを起動することが可能
$ docker run -d -p 3306:3306 \-e MYSQL_ROOT_PASSWORD=root \mysql:8.-.29
# 開発用のWEBアプリ起動コマンド例
# コマンド一行でコンテナ上のNginxコンテナ、Rubyコンテナ、MySQLコンテナを起動することが可能
$ docker-compose up
# その他ちょっとしたツールの起動や機械学習など、Dockerは幅広い用途で利用されている
Dockerの仕組み
VMの仮想化の概要
- VM方式の仮想化ではホストOSの中でゲストOSを起動する
- ゲストOS内のプロセスは、OSとしてはゲストOSで実行される
コンテナの場合
- コンテナではプロセスは隔離される
ゲストOSを起動することなく、ホストOSの機能でプロセスをコンテナという単位で隔離
コンテナ内のプロセスはOSとしてはホストOSで実行される - コンテナではプロセスも隔離される
Linuxのルートディレクトリ以下と同様の構成イメージを元に起動
コンテナ内ではルートディレクトリが変更され、コンテナ内のファイルしか見えない
Dockerの構成要素
ホストOS
docker管理下
イメージ → コンテナ
「dockerコマンド」→「dockerd(dockerデーモン)」に指示してコンテナの起動やイメージの作成をする
DockerHubなどのレジストリ
イメージを保存、配布するサービス