こんにちは!「LINUX工房」管理人の「リナックス先生」です。
最新の「Ubuntu 26.04 LTS サーバー構築入門」、いよいよ大詰めの第7回を迎えました。前回はNginxをインストールし、世界最速クラスのWebサーバーを構築しましたね。
しかし、現代のWebシステム開発において、「サーバーに直接ソフトウェア(PHPやMySQLなど)をインストールして動かす」という伝統的な手法は、もはや過去のものになりつつあります。現在のクラウドインフラ、そしてモダンな開発現場における絶対的なデファクトスタンダード(事実上の標準)、それが「Docker(ドッカー)」を用いたコンテナ運用です。
先生!「Docker」って最近本当によく聞きます。求人情報の必須スキル欄にも絶対に書いてありますよね。
でも、コンテナって何ですか?VirtualBoxみたいな仮想マシン(VM)とは何が違うんでしょうか?わざわざOSの中に別の箱を作る意味がよくわかりません……。
コウ君、Dockerは現代のエンジニアにとって「読み書き」と同じくらい必須の教養よ!
仮想マシンが「家の中に別の家を建てる」ような重い処理だとすれば、コンテナは「部屋をパーティションで仕切るだけ」の超軽量な魔法なの。
『私のパソコンでは動いたのに、本番サーバーでは動かない!』というエンジニア永遠の悩みを完全に消し去ってくれるのがDockerよ。Ubuntu 26.04 LTSの最新カーネル(Linux 7.0)の機能をフル活用して、最強のコンテナ環境を構築していくわよ!
本記事では、仮想マシンとコンテナの決定的な違いから始まり、Ubuntu 26.04へのDocker Engineの公式インストール手順、データ永続化の仕組み、そして「Docker Compose」を用いた複数サーバーのオーケストレーションまで、プロの現場のノウハウを8000文字超えの圧倒的ボリュームで完全解説します。
🚀 Ubuntu 26.04サーバー構築入門・連載ロードマップ(全8回)
- 【第1回】RHELとの違いとUbuntu 26.04 OSインストール完全ガイド
- 【第2回】公開サーバーへの道:SSH鍵認証(量子耐性暗号対応)とsudo権限の厳格化
- 【第3回】UFWとFail2ban:強固なファイアウォールと不正アクセス対策
- 【第4回】不要なサービスの停止とOSカーネル(Linux 7.0)のセキュリティチューニング
- 【第5回】Netplanによる高度なネットワーク設定とIPv6完全対応
- 【第6回】Nginxのインストールと最新Webサーバーの構築
- 【第7回】Dockerの導入:Ubuntuの強みを最大限に活かすコンテナ運用(本記事)
- 【第8回】システム監視と自動アップデート(Unattended Upgrades)の自律運用(公開予定)
目次
- 1. なぜDockerなのか? 仮想マシン(VM)とコンテナの決定的な違い
- 2. Ubuntu 26.04 LTSへのDocker Engine公式インストール手順
- 3. sudoなしでDockerを動かす設定と、そのセキュリティリスク
- 4. Dockerの三大要素:イメージ・コンテナ・レジストリ
- 5. 実践:Nginxコンテナを立ち上げてポートマッピングを学ぶ
- 6. コンテナの弱点を克服する「ボリューム(データ永続化)」の魔法
- 7. 複数コンテナを指揮する「Docker Compose」のアーキテクチャ
- 8. プロが教えるDocker環境のセキュリティ・ベストプラクティス
- 9. AIを活用した完璧なDockerfileとdocker-compose.ymlの自動生成
- 総まとめ:クラウドネイティブ・インフラの完成
- 1. なぜDockerなのか? 仮想マシン(VM)とコンテナの決定的な違い
- 2. Ubuntu 26.04 LTSへのDocker Engine公式インストール手順
- 3. sudoなしでDockerを動かす設定と、そのセキュリティリスク
- 4. Dockerの三大要素:イメージ・コンテナ・レジストリ
- 5. 実践:Nginxコンテナを立ち上げてポートマッピングを学ぶ
- 6. コンテナの弱点を克服する「ボリューム(データ永続化)」の魔法
- 7. 複数コンテナを指揮する「Docker Compose」のアーキテクチャ
- 8. プロが教えるDocker環境のセキュリティ・ベストプラクティス
- 9. AIを活用した完璧なDockerfileとdocker-compose.ymlの自動生成
- 総まとめ:クラウドネイティブ・インフラの完成
1. なぜDockerなのか? 仮想マシン(VM)とコンテナの決定的な違い
Dockerの操作を覚える前に、まずは「コンテナ技術とは何なのか」を正確に理解しましょう。これを理解せずにコマンドだけ暗記しても、トラブルシューティングはできません。
1-1. 仮想マシン(VM)の重さの正体
VirtualBoxやVMware、AWSのEC2などは「仮想マシン(VM)」と呼ばれる技術です。これは、物理的なサーバーの上に「ハイパーバイザー」というソフトウェアを置き、その上で「別のゲストOS(Windowsや別のLinux)を丸ごと立ち上げる」仕組みです。
完全に独立しているため安全ですが、「OSを丸ごと動かす」ため、起動に数分かかり、メモリを数GBも無駄に消費します。
1-2. コンテナの軽さの正体
一方、Dockerに代表されるコンテナ技術は、ゲストOSを立ち上げません。ホストOS(今回構築したUbuntu 26.04)の「カーネル(OSの脳みそ)」を共有し、Linuxの機能(namespaces と cgroups)を使って、プロセス(プログラム)から見える空間だけを隔離します。
「あたかも別のOSの上で動いているように錯覚させる」技術なのです。
| 比較項目 | 仮想マシン(VM) | Dockerコンテナ |
|---|---|---|
| アーキテクチャ | ゲストOSを丸ごとエミュレートする | ホストOSのカーネルを共有し、プロセスを隔離する |
| 起動速度 | 数分(OSのブートプロセスが必要) | 数秒〜ミリ秒(単なるプロセスの起動と同じ) |
| データサイズ | 数GB〜数十GB(OSのシステムファイルを含むため) | 数十MB〜数百MB(必要なライブラリのみ) |
| リソース消費 | 非常に重い(あらかじめメモリを占有確保する) | 非常に軽い(必要な分だけ動的に消費する) |
| ポータビリティ | 別環境への移行が面倒 | 最強。 イメージさえあれば世界中どのPCでも一瞬で同じ環境が作れる |
この「圧倒的な軽さ」と「環境の再現性」こそが、世界中のエンジニアがDockerに熱狂している理由です。Ubuntu 26.04が搭載するLinux Kernel 7.0は、このコンテナの隔離機能(cgroups v2など)が極限まで最適化されており、Dockerを動かすための世界最高の舞台と言えます。
2. Ubuntu 26.04 LTSへのDocker Engine公式インストール手順
それでは、あなたのUbuntuサーバーにDockerをインストールしましょう。Ubuntuの標準リポジトリ(apt install docker.io)にもDockerは存在しますが、バージョンが古いためプロは使いません。必ずDocker公式リポジトリから最新の「Docker Engine」をインストールします。
2-1. 古いバージョンのアンインストール(念のため)
もし過去の古いDockerパッケージが入っていれば、コンフリクト(競合)を防ぐために削除しておきます。
sudo apt-get remove docker docker-engine docker.io containerd runc
2-2. 公式GPGキーの追加とリポジトリの設定
Docker公式のパッケージを安全にダウンロードするための証明書(GPGキー)を登録し、UbuntuのパッケージリストにDocker公式のソースを追加します。
# 必要な依存パッケージのインストール sudo apt-get update sudo apt-get install ca-certificates curl gnupg lsb-release -y # Docker公式のGPGキーを保存するためのディレクトリ作成 sudo install -m 0755 -d /etc/apt/keyrings # GPGキーのダウンロードと配置 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 # aptリポジトリにDocker公式ソースを追記 echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
2-3. Docker Engineのインストール
リポジトリが追加できたら、最新のパッケージリストを取得し、Docker本体と関連ツールをインストールします。
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
これで、最新のDocker Engineと、後述するDocker Composeプラグインのインストールが完了しました!
3. sudoなしでDockerを動かす設定と、そのセキュリティリスク
インストール直後の状態では、Dockerデーモンは root 権限で動いているため、一般ユーザーが docker コマンドを打つと「Permission denied」と怒られます。毎回 sudo docker と打つのは非常に面倒です。
毎回sudoを打つのは指が疲れます!ネットの解説記事を見ると、sudo usermod -aG docker $USER というコマンドを打てば、sudoなしでDockerが使えるようになるって書いてありました。これをやってもいいですか?
コウ君、そのコマンドは確かに便利だけど、プロとして「それが何を意味しているか」を絶対に理解しておかなければならないわ。
Dockerグループにユーザーを追加するということは、実質的にそのユーザーに『パスワードなしのroot権限を与える』のと同じくらい危険なことなのよ。なぜなら、Dockerコンテナを使ってホストOSのファイルシステムをマウント(後述)すれば、root権限で何でも書き換えられてしまうからね。
個人開発環境ならOKだけど、複数人が触る本番サーバーでは絶対にやってはいけない設定よ。今回は学習目的だから特別に許可するわ!
3-1. ユーザーをdockerグループに追加する
自分のユーザー(例: kou)を docker グループに追加します。
sudo usermod -aG docker $USER
※重要※ グループへの追加をシステムに認識させるため、一度SSHからログアウト(exit)し、再度ログインし直してください。
再ログイン後、docker ps と打ってエラーが出なければ成功です。
4. Dockerの三大要素:イメージ・コンテナ・レジストリ
Dockerを自由自在に操るためには、3つの核となる概念を覚える必要があります。
| 用語 | 概念(料理に例えると) | 解説 |
|---|---|---|
| Image(イメージ) | 料理の「レシピと材料セット」 | OSのファイルシステムや必要なライブラリ、アプリケーションのソースコードがすべてパッケージ化された「金型」です。イメージ自体は動きません。 |
| Container(コンテナ) | 完成した「料理(実体)」 | イメージ(金型)をもとに、メモリとCPUを割り当てて実際に実行(起動)された状態のプロセスです。1つのイメージから、同じコンテナを100個でも立ち上げることができます。 |
| Registry(レジストリ) | レシピが置いてある「クックパッド」 | 世界中の開発者が作った「イメージ」が保存されているクラウド上の倉庫です。代表的なものが Docker Hub です。ここからイメージをダウンロード(pull)して使います。 |
5. 実践:Nginxコンテナを立ち上げてポートマッピングを学ぶ
百聞は一見に如かず。実際にDocker HubからNginxのイメージをダウンロードし、コンテナとして立ち上げてみましょう。
※第6回でインストールしたホストOSのNginxが動いているとポート(80番)が衝突してしまうため、一時的に止めておきます。
# ホストOSのNginxを停止 sudo systemctl stop nginx
5-1. docker run コマンドの実行
以下のたった1行のコマンドで、Webサーバーが立ち上がります。
docker run -d --name my-nginx -p 8080:80 nginx
5-2. 魔法のコマンドの解剖
このコマンドが裏側で行っている驚くべき処理を解説します。
docker run: イメージからコンテナを作成し、起動せよという命令です。-d (detach): バックグラウンド(裏側)で動かし続けろ、という指示です。これがないと、ターミナルを閉じた瞬間にサーバーが止まってしまいます。--name my-nginx: コンテナにわかりやすい名前(my-nginx)をつけます。-p 8080:80: これが「ポートマッピング」です。[ホストOSのポート]:[コンテナ内のポート]を意味します。「外部からUbuntuの8080番ポートに来た通信を、コンテナの中の80番ポートに繋いでね」という指示です。nginx: 使用するイメージの名前です。手元になければ、自動的にDocker Hubから最新版をダウンロード(Pull)してくれます。
ブラウザで http://サーバーのIPアドレス:8080 にアクセスしてみてください。「Welcome to nginx!」の画面が表示されるはずです。あなたは今、OSを汚すことなく、完全に隔離された箱の中でWebサーバーを立ち上げたのです!
5-3. コンテナの確認・停止・削除
コンテナの管理には以下のコマンドを使います。息をするように使えるようになりましょう。
| コマンド | 役割 |
|---|---|
docker ps |
現在動いている(起動中の)コンテナ一覧を表示します。 |
docker ps -a |
停止中のものも含め、すべてのコンテナ一覧を表示します。 |
docker stop my-nginx |
コンテナを安全に停止させます。 |
docker rm my-nginx |
停止したコンテナを削除(破棄)します。(-f をつければ動いたまま強制削除も可能) |
docker images |
ダウンロード済みのイメージ一覧を表示します。 |
6. コンテナの弱点を克服する「ボリューム(データ永続化)」の魔法
コンテナには、インフラにおける「決定的な弱点」が一つだけあります。それは「コンテナを削除(rm)すると、中で変更したデータやファイルがすべて消滅してしまう」ということです。
もしMySQLのデータベースをコンテナで動かしていて、コンテナを作り直した瞬間に全顧客データが消滅したら大惨事ですよね。この問題を解決するのが「ボリューム(Volumes)」というデータ永続化の技術です。
6-1. バインドマウント(Bind Mounts)の概念
ホストOS(Ubuntu側)の特定のディレクトリを、コンテナの中の特定のディレクトリと「直結(同期)」させる仕組みです。四次元ポケットのように、外から入れたものが中に入り、中から書き込んだものが外に保存されます。
# ホストOSにHTMLを置くフォルダを作成 mkdir ~/my-html echo "Hello from Host OS!
" > ~/my-html/index.html # ボリューム(-v)を指定してコンテナを起動 docker run -d --name my-nginx2 -p 8080:80 -v ~/my-html:/usr/share/nginx/html nginx
解説:
-v ~/my-html:/usr/share/nginx/html という指定により、ホストOSの ~/my-html と、コンテナ内部のNginxドキュメントルートが直結されました。ブラウザで確認すると、先ほど作った「Hello from Host OS!」が表示されます。
これなら、コンテナを何度削除して作り直しても、ホストOS側にあるHTMLファイルやデータベースのファイルは絶対に消えません。コンテナ運用において、データの永続化は必須命題です。
7. 複数コンテナを指揮する「Docker Compose」のアーキテクチャ
実際のWebサービス(例えばWordPress)を動かすには、Webサーバー(Nginx等)とデータベース(MySQL)の「2つのコンテナ」を同時に立ち上げ、さらに「コンテナ同士をネットワークで繋ぐ」必要があります。
これを docker run コマンドで1つずつ立ち上げて設定するのは、引数が長すぎて人間の限界を超えます。ここで登場するのが、複数のコンテナの設計図を1つのファイルにまとめて一括管理できるオーケストレーションツール「Docker Compose(ドッカー・コンポーズ)」です。
先生、複数のサーバーを連携させるなんて難しそうです。IPアドレスをどうやって割り当てて、どうやって通信させるんですか?Netplanみたいに複雑な設定が必要になるんでしょうか?
それがDocker Composeの魔法なのよ!YAMLファイルに「このコンテナとこのコンテナを作れ」と書くだけで、Dockerが裏側で勝手に「専用の隔離ネットワーク(Bridge Network)」を作り、IPアドレスではなく「コンテナの名前」で通信できるようにDNSまで設定してくれるの。
第5回のNetplanでYAMLの書き方はマスターしたわよね?今回はWordPressとMySQLのセットを、たった1つのファイルで立ち上げてみせるわ!
7-1. docker-compose.yml の作成
作業用のディレクトリを作り、そこに docker-compose.yml というファイルを作成します。
mkdir ~/wordpress-docker cd ~/wordpress-docker nano docker-compose.yml
以下のプロ仕様のコードを貼り付けてください。
services:
# データベースコンテナの設定
db:
image: mysql:8.0
container_name: wp_db
restart: always
environment:
MYSQL_ROOT_PASSWORD: my_strong_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wp_user
MYSQL_PASSWORD: wp_password
volumes:
- db_data:/var/lib/mysql
# WordPressコンテナの設定
wordpress:
depends_on:
- db
image: wordpress:latest
container_name: wp_app
restart: always
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db:3306 # ←ここでDBコンテナの名前を指定するだけで通信可能!
WORDPRESS_DB_USER: wp_user
WORDPRESS_DB_PASSWORD: wp_password
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
# 永続化用の名前付きボリュームを定義
volumes:
db_data:
wp_data:
7-2. 魔法の実行:一斉起動
ファイルが保存できたら、以下のコマンドを打ち込みます。
docker compose up -d
これだけで、MySQLのイメージがダウンロードされ、WordPressのイメージがダウンロードされ、ボリュームが作られ、隔離ネットワークが構成され、DBが起動したのを確認してからWordPressが起動します。
ブラウザで http://サーバーIP:8080 にアクセスすると、もうWordPressの初期設定画面が表示されています。これがクラウドネイティブ時代の「インフラ構築の速度」です。
※使い終わったら、docker compose down コマンドで、綺麗にコンテナ群とネットワークを解体できます(データはボリュームに残ります)。
8. プロが教えるDocker環境のセキュリティ・ベストプラクティス
Dockerは便利ですが、一歩間違えるとホストOSの権限を乗っ取られる巨大なセキュリティホールになります。中級以上のインフラエンジニアとして、以下の原則は必ず守ってください。
| チェック項目 | 理由と対策 |
|---|---|
| 特権モード(–privileged)を使わない | これを付与すると、コンテナがホストOSのすべてのデバイス(ディスク等)にアクセスできてしまいます。コンテナの隔離性が完全に崩壊するため、絶対に使用してはいけません。 |
| ホストの /var/run/docker.sock をマウントしない | これをコンテナに渡すと、コンテナの中から「ホストOSに対してDockerコマンドを発行」できてしまいます。つまり、root権限で何でもできる状態になります。 |
| コンテナ内部でrootユーザーを使わない | Dockerfileを書く際は、最後に USER node や USER www-data などを指定し、コンテナ内部でも一般ユーザー権限でアプリを動かすのが最新のベストプラクティスです。 |
| Rootless Dockerの検討 | Dockerデーモン自体をroot権限ではなく、一般ユーザー権限で動かす「Rootlessモード」がUbuntu 26.04では強く推奨されています(導入難易度は少し上がります)。 |
9. AIを活用した完璧なDockerfileとdocker-compose.ymlの自動生成
Docker ComposeのYAML記述や、独自のイメージを作るための Dockerfile の記述は、OSの環境変数やディレクトリ構成の深い知識が求められます。ここでもAI(Gemini等)を「インフラのペアプログラマー」として使い倒しましょう。
9-1. Docker環境構築のプロンプト例
「あなたはシニアクラウドインフラアーキテクトです。 Ubuntu 26.04 LTS上で稼働させるための、以下の要件を満たす `docker-compose.yml` と、必要に応じた `Dockerfile` を作成してください。 【要件】 1. Webフレームワーク: PythonのFastAPI 2. データベース: PostgreSQL 16 3. Webサーバー(リバースプロキシ): Nginx 4. セキュリティ要件: - FastAPIのコンテナはrootユーザーではなく一般ユーザーで起動すること。 - Nginxはフロントエンドとしてポート80と443で待ち受け、PostgreSQLは外部にポートを公開しない(内部ネットワークのみでの通信)こと。 5. データ永続化: PostgreSQLのデータは名前付きボリュームに保存すること。 6. 各ファイルには、初学者が理解できるよう、その設定が何を意味しているかの詳細な日本語コメントを含めてください。」
このように具体的なセキュリティ要件を含めてAIに指示を出すことで、手作業では何時間もかかるような堅牢なインフラ構成ファイルが、わずか数秒で、しかもベストプラクティスに沿った形で手に入ります。これが現代のエンジニアリングのスピード感です。
総まとめ:クラウドネイティブ・インフラの完成
第7回の講座、本当にお疲れ様でした!情報量が非常に多く、新しい概念の連続でしたが、見事に完走しましたね。
仮想マシン(VM)の呪縛から解き放たれ、ホストOSのカーネルを共有する超軽量な「コンテナ」の仕組みを理解したこと。
docker run によるポートマッピングやボリュームの直結技術を身につけたこと。
そして何より、docker-compose.yml という「インフラの設計図(Infrastructure as Code)」を使って、複数のサーバーを一瞬で立ち上げ、繋ぎ合わせる魔法を使えるようになったこと。
これによって、あなたのUbuntu 26.04サーバーは、単なるOSの枠を超え、どんなアプリケーションでも一瞬でデプロイ(展開)できる「クラウドネイティブなコンテナホスト」へと究極の進化を遂げました。
全8回でお届けしてきたこの連載も、次がいよいよ**最終回(第8回)**です。
最後に立ちはだかるのは「運用の壁」。せっかく完璧に構築したサーバーも、日々のメンテナンスを怠ればすぐに脆弱性の塊になってしまいます。
最終回は、**「システム監視と自動アップデート(Unattended Upgrades)の自律運用」**と題し、あなたが寝ている間もUbuntu自身がセキュリティパッチを当て、システムの健康状態を守り続ける「不眠不休の自動化術」を解説します。感動のフィナーレをお見逃しなく!
▼ コンテナ環境を本番でぶん回そう ▼
Docker Composeや多数のコンテナを動かすなら
「メモリ8GB以上・NVMe対応の国内VPS」
Docker/クラウドネイティブの知識を武器に
「最先端のインフラエンジニアへ転職」

コメント