こんにちは!
インフラエンジニアとして働いている方、またはこれからインフラエンジニアを目指している方で「仮想化やコンテナ技術ってよく聞くけど、実際どんなものなの?」「Dockerって何がすごいの?」と疑問に思っている方はいませんか?
私も最初は、仮想化もコンテナも「なんとなく便利らしい」程度の理解でした。しかし、実際に現場で使ってみると、その革新性と利便性に驚かされました。開発効率の向上、リソースの有効活用、そして何より運用の簡素化において、これらの技術は現代のIT基盤に欠かせない存在となっています。
現在のIT業界では、クラウドネイティブな開発・運用が主流となっており、仮想化・コンテナ技術の理解なしには、現代的なインフラ構築は困難です。特にDocker、Kubernetes、マイクロサービスアーキテクチャなどは、多くの企業で採用されている標準技術となっています。
今回は、「サーバ/インフラエンジニアの基本がこれ1冊でしっかり身につく本」の内容を参考に、仮想化・コンテナ技術の基礎から実践まで、インフラエンジニアが知っておくべき重要なポイントを詳しく解説していきます!
なぜ仮想化・コンテナ技術がインフラエンジニアに必要なのか
現代インフラを支える仮想化技術
仮想化技術は、現代のIT基盤における基盤技術として、あらゆる場面で活用されています。
仮想化技術の主なメリット:
- リソース効率の向上: 物理サーバのCPU、メモリを効率的に活用
- 運用コストの削減: 必要な分だけリソースを使用、電力・設置スペースの削減
- 柔軟性の向上: 迅速な環境構築、スケールアップ・ダウンが容易
- 可用性の向上: 物理障害時の迅速な復旧、ライブマイグレーション
- 開発効率の向上: 開発・テスト・本番環境の統一化
企業での活用例:
- サーバ統合: 複数の物理サーバを仮想サーバに集約
- 災害対策: 地理的に離れた場所でのバックアップサイト構築
- 開発環境: 開発者ごとの独立した環境提供
- レガシーシステム: 古いOSやアプリケーションの継続利用
クラウドネイティブ時代のコンテナ革命
特にコンテナ技術は、クラウドネイティブな開発において革命的な変化をもたらしました。
コンテナ技術の革新性:
- 軽量性: 従来の仮想マシンと比較して圧倒的に軽量
- ポータビリティ: 「どこでも動く」環境の実現
- スケーラビリティ: 秒単位での起動・停止
- 一貫性: 開発からプロダクションまで同じ環境
業界での採用状況:
- Netflix: マイクロサービスアーキテクチャの先駆者
- Google: Kubernetesの開発元、大規模コンテナ運用
- Amazon: AWS ECS、EKSでのコンテナサービス提供
- Microsoft: Azure Container Instances、AKSでの展開
現代のインフラエンジニアにとって、これらの技術理解は必須スキルとなっています。
体系的に仮想化・コンテナ技術を学びたい方には、「サーバ/インフラエンジニアの基本がこれ1冊でしっかり身につく本」がおすすめです。基礎から実践まで幅広くカバーされており、実務にすぐ活かせる内容となっています。
サーバ仮想化の基礎を理解しよう
仮想化技術の種類と特徴
仮想化技術には複数のアプローチがあり、それぞれ異なる特徴と用途があります。
仮想化の種類:
完全仮想化(Full Virtualization):
- ゲストOSを一切変更せずに動作
- ハードウェアを完全にエミュレート
- パフォーマンスは劣るが互換性が高い
- 例:VMware vSphere、VirtualBox
準仮想化(Para-virtualization):
- ゲストOSに軽微な変更が必要
- ハイパーバイザーとの効率的な連携
- 高いパフォーマンスを実現
- 例:Xen、Hyper-V
OS レベル仮想化:
- 単一OS上で複数の独立した実行環境
- 非常に軽量で高速
- 同一OS系統のみサポート
- 例:Docker、LXC、FreeBSD Jails
ハードウェア支援仮想化:
- CPU の仮想化支援機能を活用
- Intel VT-x、AMD-V
- 高性能な完全仮想化を実現
ハイパーバイザーとVMware・KVM
ハイパーバイザーは、仮想化を実現するための中核ソフトウェアです。
Type 1 ハイパーバイザー(ベアメタル型):
- 物理ハードウェア上で直接動作
- 高性能・高信頼性
- エンタープライズ環境で主流
主要製品:
- VMware vSphere ESXi: 業界標準、豊富な機能
- Microsoft Hyper-V: Windows環境との親和性
- KVM(Kernel-based Virtual Machine): Linux標準、オープンソース
- Citrix XenServer: 高性能、エンタープライズ向け
Type 2 ハイパーバイザー(ホスト型):
- 既存OS上で動作するアプリケーション
- 開発・テスト環境に適している
主要製品:
- VMware Workstation: 高機能、商用利用
- VirtualBox: オープンソース、クロスプラットフォーム
- Parallels Desktop: Mac環境でのWindows実行
KVMの特徴:
# KVMの確認コマンド
lsmod | grep kvm # KVMモジュール確認
virsh list --all # 仮想マシン一覧
virt-manager # GUI管理ツール
仮想化のメリットとデメリット
仮想化技術を適切に活用するには、メリットとデメリットを理解する必要があります。
メリット:
コスト削減:
- ハードウェアの統合による設備費削減
- 電力・冷却コストの削減
- データセンタースペースの有効活用
運用効率の向上:
- 迅速な環境構築(分単位でのサーバ作成)
- 標準化されたテンプレートによる構築
- 自動化による運用負荷軽減
可用性・継続性の向上:
- ライブマイグレーション(無停止での移行)
- スナップショット機能(瞬時バックアップ)
- 高可用性クラスタ構成
柔軟性:
- 動的なリソース割り当て
- 開発・テスト環境の迅速な準備
- 季節変動への対応
デメリット:
性能オーバーヘッド:
- ハイパーバイザーによる処理負荷
- I/O性能の劣化(特にストレージ)
- メモリオーバーヘッド
複雑性の増加:
- 仮想化レイヤーによる構成の複雑化
- トラブルシューティングの困難化
- 専門知識の必要性
セキュリティリスク:
- ハイパーバイザーへの攻撃リスク
- VM間の分離不備
- 集約によるリスクの集中
ライセンス問題:
- OS・アプリケーションライセンスの複雑化
- 仮想化対応ライセンスの必要性
これらを理解した上で、適切な仮想化戦略を立てることが重要です。
コンテナ技術の革新
コンテナとは何か
コンテナは、アプリケーションとその実行環境を軽量な形でパッケージ化する技術です。
コンテナの基本概念:
軽量性:
- OSカーネルを共有するため軽量
- 起動時間が数秒以下
- メモリ使用量が少ない
ポータビリティ:
- 「どこでも同じように動く」
- 開発者のマシンから本番環境まで一貫性
- クラウド間での移行が容易
分離性:
- プロセス分離によるセキュリティ
- リソース制限によるマルチテナント
- 依存関係の競合解決
スケーラビリティ:
- 水平スケールが容易
- 負荷に応じた自動スケーリング
- マイクロサービスアーキテクチャとの親和性
従来の仮想化との違い
コンテナと従来の仮想マシンの違いを理解することが重要です。
仮想マシン(VM)の特徴:
- 完全な OS を各VMで実行
- ハイパーバイザーによる管理
- 強い分離性
- 重い(GB単位のメモリ使用)
- 起動時間が分単位
コンテナの特徴:
- OSカーネルを共有
- コンテナランタイムによる管理
- 軽量な分離性
- 軽い(MB単位のメモリ使用)
- 起動時間が秒単位
比較表:
項目 | 仮想マシン | コンテナ
リソース使用量 | 大(GB) | 小(MB)
起動時間 | 分単位 | 秒単位
分離レベル | 強い | 中程度
ポータビリティ | 中程度 | 高い
管理複雑性 | 高い | 低い
Dockerの登場と普及
Docker は、コンテナ技術を普及させた革命的なプラットフォームです。
Docker登場前の状況:
- コンテナ技術は存在(LXC等)
- 複雑な設定と運用
- 限定的な普及
Dockerの革新性:
簡単性:
- 直感的なコマンド体系
- Dockerfileによる宣言的構成
- Docker Hubによるイメージ共有
エコシステム:
- 豊富な公式イメージ
- コミュニティによる活発な開発
- CI/CDとの統合
標準化:
- OCI(Open Container Initiative)の推進
- 業界標準としての地位確立
- クラウドプロバイダーのサポート
Dockerの構成要素:
Dockerエンジン:
- コンテナランタイム
- REST APIによる操作
- クライアント・サーバーアーキテクチャ
Docker イメージ:
- アプリケーションの実行環境
- レイヤー構造による効率化
- 不変(Immutable)な特性
Docker コンテナ:
- イメージから作成される実行インスタンス
- 軽量・高速な起動
- ステートレスな設計推奨
この革新により、DevOps、マイクロサービス、クラウドネイティブアプリケーションの普及が加速しました。
詳しいDocker活用方法や実践的なコンテナ運用については、「サーバ/インフラエンジニアの基本がこれ1冊でしっかり身につく本」で学ぶことができます。
Dockerの基本操作をマスターしよう
Dockerのインストールと基本コマンド
Dockerの基本操作を理解することで、コンテナ技術の実践的な活用が可能になります。
Dockerのインストール:
Ubuntu/Debian系:
# パッケージ更新
sudo apt update
# 必要なパッケージのインストール
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
# Docker公式GPGキーの追加
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# リポジトリの追加
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Dockerのインストール
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
CentOS/RHEL系:
# 必要なパッケージのインストール
sudo yum install -y yum-utils
# リポジトリの追加
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# Dockerのインストール
sudo yum install docker-ce docker-ce-cli containerd.io
# サービスの開始・有効化
sudo systemctl start docker
sudo systemctl enable docker
基本コマンド:
# Dockerの状態確認
docker version # バージョン確認
docker info # システム情報
sudo systemctl status docker # サービス状態
# イメージ操作
docker images # ローカルイメージ一覧
docker pull ubuntu:20.04 # イメージダウンロード
docker rmi ubuntu:20.04 # イメージ削除
# コンテナ操作
docker ps # 実行中コンテナ一覧
docker ps -a # 全コンテナ一覧
docker run -it ubuntu:20.04 bash # 対話的にコンテナ実行
docker stop [CONTAINER_ID] # コンテナ停止
docker rm [CONTAINER_ID] # コンテナ削除
イメージとコンテナの概念
Dockerにおける「イメージ」と「コンテナ」の関係を理解することが重要です。
Docker イメージ:
- アプリケーションの実行環境のテンプレート
- 読み取り専用(Read-only)
- レイヤー構造で効率的な管理
イメージの管理:
# イメージ検索
docker search nginx # Docker Hubでnginx検索
# イメージダウンロード
docker pull nginx:latest # 最新版ダウンロード
docker pull nginx:1.20 # 特定バージョン
# イメージ詳細確認
docker inspect nginx:latest # イメージ詳細情報
docker history nginx:latest # レイヤー履歴
Docker コンテナ:
- イメージから作成される実行インスタンス
- 書き込み可能レイヤーを持つ
- 停止しても設定・データは保持
コンテナの実行例:
# バックグラウンド実行
docker run -d --name web-server -p 80:80 nginx
# 環境変数の設定
docker run -d -e MYSQL_ROOT_PASSWORD=password mysql:8.0
# ボリュームマウント
docker run -d -v /host/data:/container/data nginx
# ポートフォワーディング
docker run -d -p 8080:80 nginx # ホスト8080 → コンテナ80
Dockerfileによるイメージ作成
Dockerfileを使用して、カスタムイメージを作成することができます。
基本的なDockerfile:
# ベースイメージの指定
FROM ubuntu:20.04
# メタデータ
LABEL maintainer="your-email@example.com"
LABEL description="Custom web application"
# 環境変数の設定
ENV DEBIAN_FRONTEND=noninteractive
ENV APP_DIR=/app
# パッケージのインストール
RUN apt-get update && \
apt-get install -y nginx python3 python3-pip && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 作業ディレクトリの設定
WORKDIR $APP_DIR
# ファイルのコピー
COPY requirements.txt .
COPY app.py .
COPY index.html /var/www/html/
# アプリケーションの設定
RUN pip3 install -r requirements.txt
# ポートの公開
EXPOSE 80
# 起動コマンド
CMD ["nginx", "-g", "daemon off;"]
イメージのビルド:
# Dockerfileからイメージ作成
docker build -t my-web-app:1.0 .
# タグ付け
docker tag my-web-app:1.0 my-web-app:latest
# レジストリへのプッシュ
docker push my-registry/my-web-app:1.0
Docker Composeによる複数コンテナ管理
複数のコンテナを連携させるアプリケーションには、Docker Composeが便利です。
docker-compose.yml の例:
version: '3.8'
services:
web:
build: .
ports:
- "80:80"
depends_on:
- db
environment:
- DATABASE_URL=mysql://user:password@db:3306/myapp
volumes:
- ./app:/app
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: myapp
MYSQL_USER: user
MYSQL_PASSWORD: password
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
redis:
image: redis:6-alpine
ports:
- "6379:6379"
volumes:
db_data:
Docker Compose コマンド:
# サービス起動
docker-compose up -d # バックグラウンド起動
docker-compose up --build # ビルドして起動
# サービス管理
docker-compose ps # サービス状態確認
docker-compose logs web # webサービスのログ
docker-compose exec web bash # webコンテナにシェル接続
# サービス停止・削除
docker-compose stop # サービス停止
docker-compose down # サービス停止・削除
docker-compose down -v # ボリュームも削除
これらの基本操作を習得することで、実践的なDocker活用が可能になります。
ストレージとネットワークの仮想化
ストレージ仮想化の基本
ストレージ仮想化は、物理ストレージリソースを抽象化し、効率的な管理を実現する技術です。
ストレージ仮想化の種類:
ブロックレベル仮想化:
- SAN(Storage Area Network): 高性能、企業向け
- iSCSI: IPネットワーク上でのSANプロトコル
- FCoE(Fibre Channel over Ethernet): Ethernetでファイバーチャネル
ファイルレベル仮想化:
- NAS(Network Attached Storage): ファイル共有専用
- NFS(Network File System): Unix/Linux標準
- SMB/CIFS: Windows標準プロトコル
オブジェクトストレージ:
- Amazon S3: クラウドストレージの標準
- OpenStack Swift: オープンソース実装
- MinIO: S3互換のオンプレミス解決策
仮想化環境でのストレージ管理:
# KVMでのストレージプール管理
virsh pool-list --all # ストレージプール一覧
virsh pool-create-as mypool dir --target /var/lib/libvirt/images
virsh vol-create-as mypool vm1.qcow2 10G --format qcow2
# Dockerでのボリューム管理
docker volume create my-volume # ボリューム作成
docker volume ls # ボリューム一覧
docker run -v my-volume:/data nginx # ボリュームマウント
ネットワーク仮想化(SDN)
SDN(Software Defined Networking)は、ネットワーク制御をソフトウェアで行う革新的な技術です。
従来のネットワークとの違い:
従来型ネットワーク:
- 各機器で個別に設定
- 静的な構成
- 手動での設定変更
SDN:
- 中央集権的な制御
- プログラマブルな設定
- 動的な構成変更
SDNの主要コンポーネント:
コントローラー:
- OpenDaylight: Linux Foundationプロジェクト
- ONOS: ONF(Open Networking Foundation)
- Floodlight: オープンソースコントローラー
南向きAPI:
- OpenFlow: SDNの標準プロトコル
- NETCONF: ネットワーク設定プロトコル
- OVSDB: Open vSwitchデータベース管理
北向きAPI:
- アプリケーションとコントローラー間のインターフェース
- REST API、GraphQLなど
仮想化環境でのネットワーク設定:
# Open vSwitchの設定
ovs-vsctl add-br br0 # ブリッジ作成
ovs-vsctl add-port br0 eth0 # ポート追加
ovs-vsctl show # 設定確認
# Dockerネットワーク管理
docker network create --driver bridge my-network
docker network ls # ネットワーク一覧
docker run --network my-network nginx
デスクトップ仮想化(VDI)
VDI(Virtual Desktop Infrastructure)は、デスクトップ環境を仮想化する技術です。
VDIの利点:
セキュリティ向上:
- データのクライアント端末保存なし
- 中央集権的なセキュリティ管理
- アクセス制御の強化
運用効率化:
- デスクトップ環境の標準化
- ソフトウェア配布の簡素化
- バックアップ・復旧の効率化
コスト削減:
- クライアント端末の軽量化
- ライセンス管理の最適化
- リモートワーク対応
主要なVDI製品:
VMware Horizon:
- 業界標準的なVDIソリューション
- 豊富な機能と高い性能
- Linked Cloneによる効率化
Citrix Virtual Apps and Desktops:
- アプリケーション仮想化も提供
- 優れたユーザーエクスペリエンス
- HDX技術による高速化
Microsoft Windows Virtual Desktop(Azure Virtual Desktop):
- クラウドネイティブなVDI
- Office 365との統合
- Azure基盤による拡張性
Red Hat Enterprise Virtualization:
- オープンソースベースの解決策
- KVMハイパーバイザー使用
- コスト効率の良いソリューション
これらの仮想化技術を適切に組み合わせることで、効率的で柔軟なインフラ基盤を構築できます。
実際の実装や運用については、「サーバ/インフラエンジニアの基本がこれ1冊でしっかり身につく本」で詳しく学ぶことができます。
Webシステムを支えるミドルウェア
Webシステムの構成要素
現代のWebシステムは、複数のミドルウェアが連携して動作する複雑なシステムです。
典型的な3層アーキテクチャ:
プレゼンテーション層(Web層):
- Webサーバ: Apache HTTP Server、Nginx
- リバースプロキシ: 負荷分散、SSL終端
- CDN: コンテンツ配信ネットワーク
アプリケーション層(AP層):
- アプリケーションサーバ: Tomcat、Node.js、Gunicorn
- アプリケーションフレームワーク: Spring、Django、Express
- ランタイム環境: JVM、Python、Node.js
データ層(DB層):
- RDBMS: MySQL、PostgreSQL、Oracle
- NoSQL: MongoDB、Cassandra、DynamoDB
- KVS: Redis、Memcached
マイクロサービスアーキテクチャ:
- サービス間通信: REST API、gRPC、Message Queue
- サービスディスカバリ: Consul、etcd
- API Gateway: Kong、AWS API Gateway
- 分散トレーシング: Jaeger、Zipkin
Webサーバ(Apache・Nginx)
WebサーバはHTTPリクエストを処理し、静的コンテンツの配信やアプリケーションサーバとの連携を行います。
Apache HTTP Server:
特徴:
- 豊富なモジュール
- 柔軟な設定
- 長い歴史と安定性
- .htaccessによるディレクトリ別設定
基本設定例:
# /etc/apache2/sites-available/mysite.conf
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html
# ディレクトリ設定
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# ログ設定
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# PHP連携
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
</VirtualHost>
Nginx:
特徴:
- 高性能・低メモリ使用量
- 非同期処理による効率性
- リバースプロキシ機能
- 負荷分散機能
基本設定例:
# /etc/nginx/sites-available/mysite
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.html index.php;
# 静的ファイル配信
location / {
try_files $uri $uri/ =404;
}
# PHP処理
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# ログ設定
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
}
パフォーマンス比較:
項目 | Apache | Nginx
同時接続数 | 中程度 | 高い
メモリ使用量 | 多い | 少ない
設定の柔軟性 | 高い | 中程度
モジュール | 豊富 | 限定的
学習コスト | 中程度 | 低い
アプリケーションサーバとプロキシ
アプリケーションサーバは、動的なコンテンツ生成とビジネスロジック実行を担当します。
主要なアプリケーションサーバ:
Apache Tomcat(Java):
<!-- server.xml設定例 -->
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="/myapp" docBase="/path/to/myapp" />
</Host>
</Engine>
</Service>
</Server>
Gunicorn(Python):
# Gunicorn設定
gunicorn --bind 0.0.0.0:8000 --workers 4 myapp:app
# systemdサービス設定
# /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/myapp
ExecStart=/usr/local/bin/gunicorn --bind unix:/var/www/myapp/myapp.sock myapp:app
ExecReload=/bin/kill -s HUP $MAINPID
[Install]
WantedBy=multi-user.target
Node.js:
// Express.js アプリケーション例
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello World!');
});
// PM2での運用
// ecosystem.config.js
module.exports = {
apps: [{
name: 'myapp',
script: './app.js',
instances: 'max',
exec_mode: 'cluster',
env: {
NODE_ENV: 'production',
PORT: 3000
}
}]
};
リバースプロキシ設定:
# Nginx リバースプロキシ設定
upstream backend {
server 127.0.0.1:8000 weight=3;
server 127.0.0.1:8001 weight=2;
server 127.0.0.1:8002 weight=1;
# ヘルスチェック
keepalive 32;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# タイムアウト設定
proxy_connect_timeout 10s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
}
}
これらのミドルウェアを適切に組み合わせることで、高性能で拡張性のあるWebシステムを構築できます。
データベースとKVSの基礎
RDBMS(MySQL・PostgreSQL)
リレーショナルデータベースは、多くのWebアプリケーションの中核を担う重要なミドルウェアです。
MySQL:
特徴:
- 高いパフォーマンス
- 豊富なストレージエンジン
- レプリケーション機能
- 大規模なコミュニティ
基本設定:
-- データベース・ユーザー作成
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON myapp.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
-- 設定確認
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'max_connections';
設定ファイル例(/etc/mysql/mysql.conf.d/mysqld.cnf):
[mysqld]
# 基本設定
bind-address = 0.0.0.0
port = 3306
# メモリ設定
innodb_buffer_pool_size = 1G
key_buffer_size = 256M
max_connections = 200
# ログ設定
log_error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
# レプリケーション設定
server-id = 1
log-bin = mysql-bin
binlog_format = ROW
PostgreSQL:
特徴:
- ACID準拠の信頼性
- 豊富なデータ型
- 拡張性(Extension)
- JSON/XML対応
基本設定:
-- データベース・ユーザー作成
CREATE DATABASE myapp ENCODING 'UTF8';
CREATE USER appuser WITH PASSWORD 'password';
GRANT ALL PRIVILEGES ON DATABASE myapp TO appuser;
設定ファイル例(postgresql.conf):
# 接続設定
listen_addresses = '*'
port = 5432
max_connections = 200
# メモリ設定
shared_buffers = 256MB
effective_cache_size = 1GB
work_mem = 4MB
maintenance_work_mem = 64MB
# ログ設定
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_min_duration_statement = 1000
NoSQLとKVS(Redis・MongoDB)
NoSQLデータベースは、従来のRDBMSでは対応困難な要件に対応する技術です。
Redis(Key-Value Store):
特徴:
- インメモリデータベース
- 豊富なデータ構造
- Pub/Sub機能
- 永続化オプション
基本操作:
# Redis CLI操作例
redis-cli
# 基本的なKV操作
SET key1 "value1"
GET key1
EXPIRE key1 3600 # 1時間後に期限切れ
# リスト操作
LPUSH mylist "item1"
LPUSH mylist "item2"
LRANGE mylist 0 -1
# ハッシュ操作
HSET user:1 name "John" email "john@example.com"
HGETALL user:1
# セット操作
SADD myset "member1" "member2"
SMEMBERS myset
設定ファイル例(redis.conf):
# ネットワーク設定
bind 127.0.0.1
port 6379
timeout 300
# メモリ設定
maxmemory 2gb
maxmemory-policy allkeys-lru
# 永続化設定
save 900 1 # 900秒で1回以上変更があれば保存
save 300 10 # 300秒で10回以上変更があれば保存
save 60 10000 # 60秒で10000回以上変更があれば保存
# AOF設定
appendonly yes
appendfsync everysec
MongoDB(Document Store):
特徴:
- JSONライクなドキュメント
- スキーマレス設計
- 水平スケーリング
- 豊富なクエリ機能
基本操作:
// MongoDB操作例
use myapp
// ドキュメント挿入
db.users.insertOne({
name: "John Doe",
email: "john@example.com",
age: 30,
tags: ["developer", "javascript"]
})
// ドキュメント検索
db.users.find({age: {$gte: 25}})
db.users.find({tags: "javascript"})
// ドキュメント更新
db.users.updateOne(
{email: "john@example.com"},
{$set: {age: 31}}
)
// インデックス作成
db.users.createIndex({email: 1})
db.users.createIndex({name: "text"})
ロードバランサによる負荷分散
高可用性と拡張性を実現するため、ロードバランサは重要な役割を果たします。
ロードバランシング方式:
Round Robin:
- 各サーバに順番にリクエスト配信
- 簡単で公平な分散
Weighted Round Robin:
- サーバの性能に応じた重み付け
- 異なる性能のサーバ混在環境に適用
Least Connections:
- 最も接続数が少ないサーバを選択
- 長時間接続があるアプリケーションに有効
IP Hash:
- クライアントIPのハッシュ値で決定
- セッション維持が必要なアプリケーション
HAProxy設定例:
# /etc/haproxy/haproxy.cfg
global
daemon
maxconn 4096
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend web_frontend
bind *:80
default_backend web_servers
backend web_servers
balance roundrobin
option httpchk GET /health
server web1 192.168.1.10:8080 check
server web2 192.168.1.11:8080 check
server web3 192.168.1.12:8080 check backup
Nginx ロードバランサ設定:
upstream backend {
least_conn; # 最少接続数方式
server 192.168.1.10:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 weight=2 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 weight=1 backup;
keepalive 32;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
これらのミドルウェア技術を組み合わせることで、スケーラブルで高可用性のあるWebシステムを構築できます。
実際の設計・構築・運用方法については、「サーバ/インフラエンジニアの基本がこれ1冊でしっかり身につく本」で詳しく学ぶことができます。
インフラエンジニアとしての実践活用
開発環境でのDocker活用
Dockerは開発環境において、環境の統一化と効率化を実現する強力なツールです。
開発環境の課題解決:
環境差異の解消:
- 「私の環境では動くのに…」問題の解決
- 開発者間の環境統一
- 新人の環境構築時間短縮
依存関係の管理:
- 言語・フレームワークバージョンの固定
- データベース・ミドルウェアの一元管理
- 競合する依存関係の分離
実践的なDocker活用例:
LAMP環境の構築:
# docker-compose.yml
version: '3.8'
services:
web:
image: php:8.0-apache
ports:
- "80:80"
volumes:
- ./src:/var/www/html
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: myapp
MYSQL_USER: appuser
MYSQL_PASSWORD: apppass
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
phpmyadmin:
image: phpmyadmin:latest
ports:
- "8080:80"
environment:
PMA_HOST: db
depends_on:
- db
volumes:
db_data:
Node.js + MongoDB環境:
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
environment:
- NODE_ENV=development
- MONGODB_URL=mongodb://mongo:27017/myapp
depends_on:
- mongo
mongo:
image: mongo:4.4
ports:
- "27017:27017"
volumes:
- mongo_data:/data/db
redis:
image: redis:6-alpine
ports:
- "6379:6379"
volumes:
mongo_data:
開発効率化のベストプラクティス:
ホットリロード対応:
# 開発用Dockerfile
FROM node:16-alpine
WORKDIR /app
# package.jsonをコピーして依存関係インストール
COPY package*.json ./
RUN npm install
# ソースコードをコピー
COPY . .
# 開発サーバ起動(ホットリロード有効)
CMD ["npm", "run", "dev"]
本番環境でのコンテナ運用
本番環境でのコンテナ運用には、開発環境とは異なる考慮事項があります。
本番運用の重要ポイント:
セキュリティ強化:
# セキュリティを考慮したDockerfile
FROM node:16-alpine
# 非rootユーザーでの実行
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
# 必要なファイルのみコピー
COPY --chown=nextjs:nodejs package*.json ./
USER nextjs
RUN npm ci --only=production && npm cache clean --force
COPY --chown=nextjs:nodejs . .
# ヘルスチェック
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3000/health || exit 1
EXPOSE 3000
CMD ["npm", "start"]
監視とログ管理:
# 本番用 docker-compose.yml
version: '3.8'
services:
app:
image: myapp:latest
deploy:
replicas: 3
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/nginx/ssl:ro
depends_on:
- app
Kubernetes活用:
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:latest
ports:
- containerPort: 3000
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
継続的な学習とスキルアップ
仮想化・コンテナ技術は急速に進歩しており、継続的な学習が重要です。
学習ロードマップ:
基礎レベル:
- Docker基本操作
- コンテナとイメージの概念
- 基本的なDockerfileの作成
- Docker Composeの活用
中級レベル:
- セキュリティベストプラクティス
- マルチステージビルド
- CI/CDパイプラインの構築
- 監視・ログ管理
上級レベル:
- Kubernetesオーケストレーション
- マイクロサービスアーキテクチャ
- サービスメッシュ(Istio、Linkerd)
- クラウドネイティブ技術
実践的な学習方法:
ハンズオン環境構築:
# Kind(Kubernetes in Docker)での学習環境
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
# クラスタ作成
kind create cluster --name learning-cluster
# kubectlでの操作
kubectl cluster-info
kubectl get nodes
プロジェクトベース学習:
- 個人プロジェクトのコンテナ化
- CI/CDパイプラインの構築
- モニタリングシステムの導入
- 複数環境(dev/staging/prod)の管理
コミュニティ参加:
- Docker/Kubernetes Meetup
- CNCF(Cloud Native Computing Foundation)イベント
- オンラインコミュニティ(Stack Overflow、Reddit)
- オープンソースプロジェクトへの貢献
資格取得:
- Docker Certified Associate (DCA)
- Certified Kubernetes Administrator (CKA)
- Certified Kubernetes Application Developer (CKAD)
- AWS Certified Solutions Architect
これらの技術を実務で活用することで、現代的なインフラエンジニアとしてのスキルを向上させることができます。
体系的に仮想化・コンテナ技術を学び、実践的なスキルを身につけたい方は、「サーバ/インフラエンジニアの基本がこれ1冊でしっかり身につく本」をぜひ活用してください。基礎から応用まで、現場で必要な知識が包括的にまとめられています。
まとめ
今回は、現代のインフラエンジニアにとって必須の仮想化・コンテナ技術について、基礎から実践まで幅広く解説しました。
これらの技術は、もはやインフラエンジニアにとって「知っていると便利」な技術ではなく、「知らないと仕事にならない」必須技術となっています。クラウドネイティブな開発・運用が主流となっている現在、適切な理解と実践経験なしには、現代的なシステム構築・運用は困難です。
今回カバーした主要なポイント:
- 仮想化技術の基礎: ハイパーバイザー、VM、仮想化の種類と特徴
- コンテナ技術: Dockerの革新性、従来仮想化との違い
- Docker実践: 基本操作、Dockerfile、Docker Compose
- インフラ仮想化: ストレージ、ネットワーク、デスクトップ仮想化
- ミドルウェア基礎: Webサーバ、アプリケーションサーバ、データベース
- 実践活用: 開発環境から本番環境まで
これらの技術習得により得られるメリット:
- 開発効率の向上: 環境構築の自動化、環境差異の解消
- 運用効率の向上: リソース効率化、デプロイの簡素化
- スケーラビリティ: 負荷に応じた柔軟なスケーリング
- 保守性: 標準化された環境、再現可能な構成
- キャリアアップ: 現代的な技術スキルの獲得
仮想化・コンテナ技術は、単独で使われることは少なく、通常は他の技術と組み合わせて活用されます。例えば:
- CI/CD: Jenkins、GitLab CI、GitHub Actions
- オーケストレーション: Kubernetes、Docker Swarm
- サービスメッシュ: Istio、Linkerd
- 監視: Prometheus、Grafana、ELK Stack
- インフラストラクチャコード: Terraform、Ansible
これらの関連技術も含めて学習することで、より包括的なインフラエンジニアリング能力を身につけることができます。
技術の進歩は速いですが、今回解説した基礎技術をしっかり理解しておけば、新しい技術にも対応しやすくなります。継続的な学習と実践を通じて、現代のIT基盤を支える優秀なインフラエンジニアを目指していきましょう!
今回の記事で紹介した内容をさらに深く学びたい方、実際の設計・構築・運用ノウハウを身につけたい方には、「サーバ/インフラエンジニアの基本がこれ1冊でしっかり身につく本」が最適です。仮想化・コンテナ技術に加えて、ネットワーク、セキュリティ、クラウドなど、現代のインフラエンジニアに必要な知識が体系的にまとめられており、実務にすぐ活かせる内容となっています。
コメント