はじめに
こんにちは。「サーバーを立ててみたいけれど、物理的なマシンは持っていないし、クラウドサービスはまだ敷居が高く感じる...」そんな悩みをお持ちではありませんか?
そんな方におすすめなのがDockerです。Dockerを活用することで、自分のPC上で安全かつ手軽にサーバー構築の練習を始めることができます。
この記事では、Windows PC上にすでにインストールされているDocker Desktopを使用し、コマンド操作でLinuxサーバーを立ち上げるところから始まり、最終的にはDockerfileを用いてWebサーバー構築を自動化するまでの全工程を、実際につまずいた点も含めて詳しく解説いたします。
この記事の対象読者
- インフラの学習を始めたばかりの方
- 「Dockerって一体何?」という基礎から知りたい方
- 自分のPC上で安全にサーバー構築を体験してみたい方
Step 1: PowerShellの準備と起動
まず、作業環境を整えましょう。今回はWindows標準搭載のPowerShellを使用します。PCにはDocker Desktopがすでにインストールされている前提で進めてまいります。
PowerShellの起動方法:
- Windowsキー + R を押下
- 「powershell」と入力してEnterキーを押す
- PowerShellウィンドウが開きます
Step 2: 手作業によるLinuxサーバーの構築と操作
2-1. Ubuntuイメージのダウンロード
まずは、Linux系OSとして人気の高い「Ubuntu」の設計図(イメージ)をダウンロードします。これは、実際のサーバー環境を模擬するためのベースとなるものです。
docker pull ubuntu
このコマンドにより、Docker Hub(Dockerの公式リポジトリ)からUbuntuの最新イメージがローカルPCにダウンロードされます。
2-2. Ubuntuコンテナの起動と接続
次に、ダウンロードしたイメージを使用して、実際にコンテナ(仮想的なサーバー環境)を起動し、その内部にアクセスします。
docker run -it --rm --name my-ubuntu-server ubuntu bash
各オプションの説明:
-
-it
: インタラクティブモード(対話的にコマンドを実行可能) -
--rm
: コンテナ停止時に自動削除 -
--name my-ubuntu-server
: コンテナに分かりやすい名前を付与 -
ubuntu
: 使用するベースイメージ -
bash
: 起動時に実行するコマンド(Bashシェル)
このコマンドを実行すると、PowerShellのプロンプトが PS C:\...>
から root@xxxxxxxxxxxx:/#
に変化します。これで、あなたのPC内に隔離されたLinuxサーバー環境が起動し、その中を直接操作している状態になりました。
2-3. 基本的なLinuxコマンドの実践
コンテナ内で、基本的なLinuxコマンドを実際に実行してみましょう。これらのコマンドは、今後のサーバー管理において必須のスキルとなります。
# 現在のディレクトリ内のファイル・フォルダを詳細表示
ls -la
# 新しいディレクトリを作成
mkdir my-first-dir
# 作成したディレクトリに移動
cd my-first-dir
# テキストファイルを作成し、内容を書き込み
echo "Hello from Docker!" > hello.txt
# ファイルの内容を確認
cat hello.txt
# 出力: Hello from Docker!
Step 3: Webサーバー(Nginx)の構築と起動
3-1. ポートフォワーディング設定付きでのコンテナ起動
Webサーバーを外部からアクセス可能にするため、一度コンテナから退出(exit
コマンド)し、今度はポートフォワーディング設定を含めて再起動します。
# PCの8080番ポートをコンテナの80番ポートに転送
docker run -it --rm --name my-web-server -p 8080:80 ubuntu bash
ポートフォワーディングについて:
-p 8080:80
は「PC側の8080番ポートへのアクセスを、コンテナ内の80番ポートに転送する」という意味です。これにより、ブラウザからlocalhost:8080
でアクセスすると、コンテナ内のWebサーバーにアクセスできるようになります。
【補足】ポートフォワーディングとは?
私も最初はこの概念がよく分からなかったのですが、AIに聞いたところ「特定の窓口に来た通信を、別の担当窓口へ繋いでくれる受付係」のようなものだと分かりました。
コンテナはPCとは隔離された独立した部屋なので、この「受付係」がいないと、外から来たお客さん(ブラウザからのアクセス)は、部屋の中にいるWebサーバー担当者までたどり着けない、というわけです。
3-2. Nginxのインストールと起動
コンテナ内で以下のコマンドを順次実行し、Nginxウェブサーバーをセットアップします。
# パッケージリストの最新化
apt-get update
# Nginxのインストール(-yオプションで確認をスキップ)
apt-get install -y nginx
# Nginxサービスの開始
service nginx start
3-3. Webサーバーの動作確認
ブラウザを開き、アドレスバーにhttp://localhost:8080
を入力してアクセスしてください。
**"Welcome to nginx!"**のページが表示されれば、Webサーバーの構築に成功です!これで、あなたのPC内に立てた仮想サーバーが正常に動作していることが確認できました。
Step 4: カスタムWebページの作成
4-1. HTMLファイルの編集
デフォルトのNginxページを、オリジナルのコンテンツに変更してみましょう。
# Webコンテンツが格納されているディレクトリに移動
cd /var/www/html
# テキストエディタ「nano」のインストール
apt-get install -y nano
# HTMLファイルの編集
nano index.nginx-debian.html
4-2. HTMLコンテンツのカスタマイズ
nanoエディタが起動したら、<h1>
タグ内のテキストなど、お好みの内容に変更してください。編集完了後は以下の手順で保存します:
-
Ctrl + X
を押す -
Y
を押して変更を確認 -
Enter
キーを押して保存完了
ブラウザをリロード(F5キー)すると、変更した内容が反映されているはずです。
Step 5: Dockerfileによる構築の自動化
これまでの手動による構築作業を、Dockerfileを用いて自動化します。これは**Infrastructure as Code(IaC)**という現代的なインフラ管理手法の基礎となります。
5-1. つまずきやすいポイントと解決策
実際の作業中に遭遇した典型的なエラーとその対処法をご紹介します:
エラー1: 環境の混同
現象: PowerShellコマンドNew-Item
をLinuxコンテナ内で実行してしまい、「command not found」エラーが発生
原因: PC側(PowerShell)とコンテナ内(Linux)のコマンド体系が異なることを理解していなかった
【補足】ホストOSとゲストOSの違い
このエラーを通じて、私は「ホストOS」と「ゲストOS」の違いを痛感しました。簡単に言うと、これは「大家さん(ホストOS = Windows)」と「間借りしている人(ゲストOS = コンテナのUbuntu)」の関係です。
New-Itemは大家さんの家のルール(Windowsのコマンド)なので、間借り人の部屋では通じません。この区別を意識することが、Dockerを扱う上でとても重要だと感じました。
解決策: 作業環境を明確に区別し、適切なコマンドを使用する
エラー2: 権限エラー
現象: C:\Windows\System32
ディレクトリで作業しようとして「アクセスが拒否されました」エラーが発生
原因: システムディレクトリでの作業は管理者権限が必要
解決策: ユーザーフォルダ(デスクトップなど)で作業を行う
5-2. 作業環境の準備
- PCのデスクトップ上に作業用フォルダ
docker-nginx-test
を作成 - PowerShellで該当ディレクトリに移動
cd Desktop\docker-nginx-test
5-3. 必要ファイルの作成
index.html ファイル
<!DOCTYPE html>
<html>
<body>
<h1>My First Dockerfile!</h1>
<p>Docker化されたWebサーバーが正常に動作しています。</p>
</body>
</html>
Dockerfile ファイル
# ベースとなるOSイメージを指定
FROM ubuntu:latest
# Nginxのインストール処理を自動化
RUN apt-get update && apt-get install -y nginx
# ローカルのHTMLファイルをコンテナ内の公開ディレクトリにコピー
COPY index.html /var/www/html/
# コンテナ起動時にNginxをフォアグラウンドで実行
CMD ["nginx", "-g", "daemon off;"]
5-4. カスタムDockerイメージのビルド
Dockerfileを基に、独自のDockerイメージを作成します。
docker build -t my-nginx-image .
コマンドの説明:
-
build
: イメージをビルド -
-t my-nginx-image
: 作成するイメージに名前を付与 -
.
: 現在のディレクトリのDockerfileを使用
5-5. カスタムイメージからのコンテナ起動
docker run -it --rm --name my-custom-server -p 8080:80 my-nginx-image
ブラウザでhttp://localhost:8080
にアクセスすると、**"My First Dockerfile!"**というメッセージが表示され、Dockerfileによる自動化構築が成功したことを確認できます。
AIチューターとの学習プロセス
今回の学習は、AIとの対話形式で進めました。具体的には、以下のような形でAIを活用しました。
エラーの即時解決: command not foundやAccess is deniedといったエラーが出た際に、その原因と解決策をすぐに質問し、長時間悩むことなく次のステップに進めました。
概念の言語化: 「ポートフォワーディングとは?」「ホストOSとゲストOSの違いは?」といった疑問を投げかけ、自分の理解を深める手助けをしてもらいました。
ポートフォワーディングとは?特定の窓口に来た通信を、別の担当窓口へ繋いでくれる受付係のようなもの
記事構成の壁打ち: このQiita記事の構成や表現についても、AIに相談しながらまとめることで、思考を整理しやすくなりました。
AIを「答えを教えてくれる魔法の箱」としてではなく、**24時間いつでも付き合ってくれる優秀なチューター(家庭教師)**として活用することで、学習効率が劇的に向上すると感じています。
まとめ
学習で得られた知見
-
Docker環境の理解: Dockerを活用することで、物理サーバーやクラウドサービスを使わずとも、自分のPC上で本格的なサーバー構築の学習が可能
-
環境の分離概念: 「PC側(ホストOS)」と「コンテナ内(ゲストOS)」という2つの独立した環境を適切に理解し使い分けることの重要性
-
Infrastructure as Codeの実践: 手動での構築作業をDockerfileによって自動化し、再現可能で管理しやすいインフラ環境を構築する手法
今後の学習ステップ
- より複雑なWebアプリケーションのコンテナ化
- Docker ComposeによるマルチコンテナアプリケーションApache、MySQL等)の構築
- クラウドサービス(AWS、Azure等)でのDocker活用
最後に
Dockerという技術を通じて、失敗を恐れることなく何度でもサーバー環境の構築と破棄を繰り返すことができます。これにより、インフラ技術の学習において重要な「試行錯誤の経験」を安全かつ効率的に積むことが可能になります。
この記事が、これからDockerやインフラ技術の学習を始められる皆様にとって、有用なスタートガイドとなれば幸いです。私も引き続き学習に励みますので、一緒に頑張りましょう!
本記事は個人的な学習記録として作成しており、より良い方法や追加の情報がございましたら、ぜひお教えいただけますと幸いです。