1からのWEBサーバ作り Dockerのインストールと実践
はじめに
この記事ではDockerのインストールを行います、また、簡単な実践も行います。
前回はローカルにApacheサーバをインストールし、実際に動作させました。これをDocker上で動かすための準備となります。
前回の記事はこちらです。
この記事はシリーズの第5回です。シリーズ全体の目次は以下からご覧ください。
シリーズ目次: 1からのWEBサーバ作り - 完全ガイドシリーズ
1. 目的と完成条件の定義
1.1 目的
Dockerを用いてApacheサーバを建てる準備段階を行います。
また、Dockerは最近のプログラミングで主要な技術となっています。その学習も兼ねております。
ここでは以下のことを学習します
- Dockerとは
- Dockerのインストール
- コンテナの作成、削除
- コンテナの起動、停止
1.2 完成条件
以下の条件をすべて満たすこと:
| No | 検証項目 | 合格条件 |
|---|---|---|
| 1 | インストール |
sudo docker run hello-worldを実行し、「Hello from Docker!」という出力を得る |
| 2 | コンテナの作成と削除 |
docker ps -aでコンテナ名が表示される、消える |
| 3 | コンテナの起動と停止 |
docker psでコンテナ名が表示される、消える |
2. 前提条件
2.1 環境情報
- 対象OS: Ubuntu 24.04.3 LTS
- CPU: AMD RYZEN 7 7840HS
- 実行環境: ローカルマシン(物理サーバ)
- ネットワーク: ローカルネットワーク(192.168.x.x)
2.2 必要なマシン構成
- サーバマシン: Ubuntu 24.04.3 LTS がインストール済み
- メモリ: 最低2GB以上推奨
- ディスク: 10GB以上の空き容量
3. Dockerとは
システム開発において、実行環境の違いというのは大きな問題です。OS、バージョンが違うだけで動いていたものが動かなくなることはよくあることです。
Dockerはアプリケーションとその実行環境ごと一つの「コンテナ」という単位でまとめて、どこでも同じように動かす技術です。
これにより、開発環境と本番環境の差異による不具合を防ぐことができます。
3.1 Dockerの主要概念
Dockerを理解するには、以下の3つの概念を把握することが重要です。
イメージ(Image)
コンテナを作成するための「設計図」のようなものです。OS、ライブラリ、アプリケーションなど、必要なものがすべて含まれています。
Docker Hubなどのレジストリから公開されているイメージをダウンロードして使用できます。
コンテナ(Container)
イメージから作成された実行環境です。イメージという設計図から実際に動作する「実体」を作り出したものがコンテナです。
1つのイメージから複数のコンテナを作成することができます。
Dockerfile
イメージを作成するための設定ファイルです。どのベースイメージを使うか、どんなソフトウェアをインストールするか、どのファイルをコピーするかなどを記述します。
3.2 仮想マシンとの違い
従来の仮想マシン(VM)とDockerコンテナには大きな違いがあります。
主な違い:
- 仮想マシン: ゲストOSごと仮想化するため、起動に時間がかかり、リソース消費が大きい
- Docker: ホストOSのカーネルを共有するため、軽量で高速に起動できる
3.3 Dockerのメリット
- 環境の一貫性: 「自分の環境では動くのに...」という問題を解決
- 軽量で高速: 仮想マシンと比べて起動が数秒で完了
- ポータビリティ: 同じイメージを使えば、どこでも同じ環境を再現可能
- スケーラビリティ: 必要に応じてコンテナを増減させることが容易
- バージョン管理: イメージのバージョンを管理しやすい
4. 事前準備
4.1 システムの更新
まず、パッケージリストとシステムを最新の状態に更新します。
sudo apt update
sudo apt upgrade -y
apt upgradeを実行すると、カーネルのアップデートが含まれる場合があります。その際は再起動が必要になることがあります。
4.2 必要なパッケージのインストール
Dockerのインストールに必要な前提パッケージをインストールします。
sudo apt install -y \
ca-certificates \
curl \
gnupg \
lsb-release
各パッケージの役割:
-
ca-certificates: HTTPS通信のための証明書 -
curl: データ転送ツール -
gnupg: GPG鍵の管理 -
lsb-release: Linuxディストリビューション情報の取得
5. Dockerのインストール
5.1 Docker公式GPG鍵の追加
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
5.2 Dockerリポジトリの追加
Docker公式のAPTリポジトリをシステムに追加します。
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
5.3 Docker Engineのインストール
リポジトリを更新し、Docker Engineとその関連パッケージをインストールします。
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
インストールされるパッケージ:
-
docker-ce: Docker Engine本体 -
docker-ce-cli: Dockerコマンドラインツール -
containerd.io: コンテナランタイム -
docker-buildx-plugin: 拡張ビルド機能 -
docker-compose-plugin: Docker Composeプラグイン
5.4 インストールの確認
Dockerが正しくインストールされたか確認します。
sudo docker run hello-world
期待される出力:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
...
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
初回実行時は、hello-worldイメージがローカルに存在しないため、Docker Hubから自動的にダウンロードされます。
5.5 sudo なしでDockerを実行できるようにする
現在の状態では、Dockerコマンドを実行するたびにsudoが必要です。これを解消するため、現在のユーザーをdockerグループに追加します。
sudo usermod -aG docker $USER
変更を反映させる:
newgrp docker
または、一度ログアウトして再ログインすることでも反映されます。
確認:
docker run hello-world
sudoなしで実行できることを確認します。
セキュリティ上の注意: dockerグループに所属するユーザーは実質的にroot権限を持つことになります。信頼できるユーザーのみを追加してください。
6. Dockerの基本操作
6.1 イメージの操作
イメージの検索
Docker Hubでイメージを検索します。
docker search ubuntu
イメージのダウンロード
docker pull ubuntu:22.04
ubuntu:22.04という形式で、イメージ名:タグを指定します。タグを省略するとlatestが使用されます。
ローカルのイメージ一覧を表示
docker images
出力例:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 22.04 3b418d7b466a 2 weeks ago 77.8MB
hello-world latest 9c7a54a9a43c 6 months ago 13.3kB
イメージの削除
docker rmi ubuntu:22.04
または、イメージIDを指定:
docker rmi 3b418d7b466a
6.2 コンテナの操作
コンテナの作成と起動
方法1: docker runコマンド(作成+起動を同時に行う)
docker run -it --name my-ubuntu ubuntu:22.04 /bin/bash
オプションの説明:
-
-i: 対話モードを有効にする(標準入力を開いたままにする) -
-t: 疑似TTYを割り当てる(ターミナル操作を可能にする) -
--name my-ubuntu: コンテナに名前を付ける -
ubuntu:22.04: 使用するイメージ -
/bin/bash: 実行するコマンド
方法2: docker createとdocker startを分けて実行
# コンテナの作成のみ
docker create -it --name my-ubuntu2 ubuntu:22.04 /bin/bash
# コンテナの起動
docker start my-ubuntu2
バックグラウンドでコンテナを起動
docker run -d --name my-nginx nginx:latest
-dオプションでデタッチドモード(バックグラウンド実行)になります。
実行中のコンテナ一覧を表示
docker ps
出力例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 nginx:latest "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 80/tcp my-nginx
すべてのコンテナ一覧を表示(停止中も含む)
docker ps -a
コンテナの停止
docker stop my-nginx
または、コンテナIDを指定:
docker stop a1b2c3d4e5f6
コンテナの再起動
docker restart my-nginx
コンテナの削除
docker rm my-nginx
実行中のコンテナは削除できません。先にdocker stopで停止させるか、-fオプションで強制削除します。
強制削除:
docker rm -f my-nginx
コンテナに接続
実行中のコンテナに接続します。
docker exec -it my-ubuntu /bin/bash
コンテナ内で作業を終えたら、exitコマンドまたはCtrl+Dで抜けます。
コンテナからの切断(コンテナは実行中のまま)
コンテナ内でCtrl+P、Ctrl+Qを順に押すと、コンテナを停止せずに抜けられます。
6.3 コンテナのログ確認
docker logs my-nginx
リアルタイムでログを表示:
docker logs -f my-nginx
6.4 コンテナの詳細情報表示
docker inspect my-nginx
JSON形式で詳細な設定情報が表示されます。
7. 実践: Nginxコンテナの起動
実際にNginxのWebサーバをコンテナで起動してみます。
7.1 Nginxイメージの取得と起動
docker run -d -p 8080:80 --name web-server nginx:latest
オプションの説明:
-
-d: バックグラウンドで実行 -
-p 8080:80: ホストの8080番ポートをコンテナの80番ポートにマッピング -
--name web-server: コンテナにweb-serverという名前を付ける -
nginx:latest: 使用するイメージ
7.2 動作確認
Webブラウザで以下のURLにアクセスします:
http://localhost:8080
または、コマンドラインから:
curl http://localhost:8080
期待される結果: Nginxのデフォルトページ「Welcome to nginx!」が表示される
7.3 コンテナの状態確認
docker ps
出力例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b2c3d4e5f6g7 nginx:latest "/docker-entrypoint.…" 30 seconds ago Up 29 seconds 0.0.0.0:8080->80/tcp web-server
7.4 カスタムHTMLの配置
Nginxコンテナに独自のHTMLファイルを配置してみます。
ホストマシンでHTMLファイルを作成:
mkdir ~/nginx-html
echo '<h1>Hello from Docker Nginx!</h1>' > ~/nginx-html/index.html
シングルクォート(')を使用することで、!などの特殊文字がBashの履歴展開として解釈されるのを防ぎます。
ボリュームマウントして起動:
# 既存のコンテナを停止・削除
docker stop web-server
docker rm web-server
# ボリュームマウントして起動
docker run -d -p 8080:80 --name web-server \
-v ~/nginx-html:/usr/share/nginx/html \
nginx:latest
403 Forbiddenエラーが出る場合
ボリュームマウントしたディレクトリの権限が不足している可能性があります。以下のコマンドで権限を設定してください:
# ファイルとディレクトリに適切な権限を設定
chmod 755 ~/nginx-html
chmod 644 ~/nginx-html/index.html
コンテナを再起動:
docker restart web-server
それでも解決しない場合は、SELinuxが原因の可能性があります(Ubuntuでは通常無効ですが、念のため):
# SELinuxのコンテキストを設定(SELinux有効時のみ)
chcon -Rt svirt_sandbox_file_t ~/nginx-html
動作確認:
curl http://localhost:8080
期待される出力:
<h1>Hello from Docker Nginx!</h1>
7.5 コンテナの停止と削除
docker stop web-server
docker rm web-server
8. 動作確認と検証
8.1 完成条件の検証
課題で定義した完成条件をすべて満たしているか確認します。
検証1: インストール確認
docker run hello-world
確認ポイント: 「Hello from Docker!」のメッセージが表示される
検証2: コンテナの作成と削除
# コンテナ作成
docker create --name test-container ubuntu:22.04
# 確認(test-containerが表示される)
docker ps -a
# 削除
docker rm test-container
# 確認(test-containerが表示されない)
docker ps -a
検証3: コンテナの起動と停止
# コンテナ起動
docker run -d --name test-nginx nginx:latest
# 確認(test-nginxが表示される)
docker ps
# 停止
docker stop test-nginx
# 確認(test-nginxが表示されない)
docker ps
# クリーンアップ
docker rm test-nginx
8.2 リソース使用状況の確認
docker stats
実行中のコンテナのCPU、メモリ、ネットワーク使用状況をリアルタイムで確認できます。
Ctrl+Cで終了します。
8.3 Dockerシステム情報の確認
docker system info
Dockerのバージョン、ストレージドライバ、イメージ数、コンテナ数などの情報が表示されます。
8.4 ディスク使用量の確認
docker system df
イメージ、コンテナ、ボリューム、キャッシュが使用しているディスク容量を確認できます。
9. トラブルシューティング
9.1 「permission denied」エラー
症状:
Got permission denied while trying to connect to the Docker daemon socket
原因: 現在のユーザーがdockerグループに所属していない
対処法:
sudo usermod -aG docker $USER
newgrp docker
それでも解決しない場合は、一度ログアウトして再ログインします。
9.2 ポート競合エラー
症状:
Error: Bind for 0.0.0.0:8080 failed: port is already allocated
原因: 指定したポートがすでに使用されている
対処法:
他のコンテナが使用していないか確認:
docker ps
別のポートを使用する:
docker run -d -p 8081:80 --name web-server nginx:latest
9.3 イメージのダウンロードが遅い、または失敗する
症状: docker pullが非常に遅い、またはタイムアウトする
原因: ネットワーク接続の問題、またはDocker Hubへの接続問題
対処法:
- インターネット接続を確認
- Docker Hubのステータスを確認(https://status.docker.com/)
- プロキシ設定が必要な環境では、Dockerのプロキシ設定を行う
9.4 コンテナが起動しない
症状: docker startしてもすぐに停止する
原因: コンテナ内でエラーが発生している
対処法:
ログを確認:
docker logs <container-name>
詳細情報を確認:
docker inspect <container-name>
9.5 ディスク容量不足
症状: 「no space left on device」エラー
原因: 不要なイメージやコンテナが蓄積している
対処法:
未使用のリソースを一括削除:
docker system prune -a
-aオプションを付けると、未使用のイメージもすべて削除されます。必要なイメージまで削除されないよう注意してください。
個別に削除する場合:
# 停止中のコンテナをすべて削除
docker container prune
# 未使用のイメージをすべて削除
docker image prune
# 未使用のボリュームをすべて削除
docker volume prune
9.6 ボリュームマウント時の403 Forbiddenエラー
症状: ボリュームマウントしたHTMLファイルにアクセスすると403エラーが出る
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.29.3</center>
</body>
</html>
原因: マウントしたディレクトリやファイルの権限が不足している
対処法:
- ファイルとディレクトリの権限を確認:
ls -la ~/nginx-html
- 適切な権限を設定:
# ディレクトリに実行権限を付与
chmod 755 ~/nginx-html
# ファイルに読み取り権限を付与
chmod 644 ~/nginx-html/index.html
- コンテナを再起動:
docker restart web-server
- 動作確認:
curl http://localhost:8080
より詳細なデバッグ方法:
コンテナ内でファイルの状態を確認:
docker exec web-server ls -la /usr/share/nginx/html
Nginxのエラーログを確認:
docker logs web-server
10. セキュリティ配慮
10.1 イメージの選定
- 公式イメージを優先: Docker Hubの公式イメージ(「Official Image」バッジがあるもの)を使用する
-
イメージのタグを明示:
latestタグではなく、具体的なバージョンを指定する(例:nginx:1.25.3) -
不要なイメージは削除: 定期的に
docker image pruneを実行
10.2 コンテナの実行
- rootユーザーで実行しない: 可能な限り非rootユーザーでアプリケーションを実行する
-
必要最小限の権限:
--cap-dropや--cap-addで権限を制限する -
読み取り専用ファイルシステム:
--read-onlyオプションを使用(必要に応じて)
10.3 ネットワークとポート
-
必要なポートのみ公開:
-pオプションで必要最小限のポートのみ公開する -
ホストネットワークを避ける:
--network hostの使用は避ける
10.4 定期的な更新
# イメージの更新
docker pull nginx:latest
# コンテナの再作成
docker stop web-server
docker rm web-server
docker run -d -p 8080:80 --name web-server nginx:latest
10.5 ログの管理
ログが肥大化しないよう、ログドライバを設定することを検討してください。
docker run -d --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 nginx
12. 参考資料
まとめ
この記事では、Dockerのインストールから基本的な操作までを学びました。
重要なポイント:
- Dockerは軽量で高速なコンテナ化技術
- イメージからコンテナを作成して実行する
-
docker run、docker ps、docker stopなどの基本コマンド - ポートマッピング(
-p)とボリュームマウント(-v)の使い方
次回はApacheをDocker上で動作させます。
記事はこちらです。
