『はじめてのDocker入門』 〜仮想化を超えた開発環境の革命〜


Dockerとは?まずはざっくりイメージ!

みなさん、「環境構築で1日つぶれた…」という話、聞いたことありますか?

たとえば、

  • 自分のPCでは動くのに、先輩の環境だと動かない
  • ライブラリのバージョンが違ってエラーが出る
  • 本番サーバーで挙動が変わる

このような 「開発環境のズレ問題」 は、エンジニアなら一度は経験する悩みです。

そんなときに活躍するのが Docker(ドッカー)
Dockerは、「動く環境ごとパッケージ化して、どこでも同じように動かす」ための仕組みです。


例えで考えるDockerの役割

わかりやすく言うと、
Dockerは「お弁当箱」のようなものです。

  • 開発に必要なアプリ
  • 設定ファイル
  • OSの一部(ライブラリなど)

これらを一つの箱に詰めて持ち運べる
だから、どこに持っていっても同じ味(動作)になるわけです!


仮想マシンとの違い

よく似た技術に「仮想マシン(Virtual Machine)」があります。
ただし、Dockerとはいくつか大きな違いがあります。

項目仮想マシンDocker(コンテナ)
起動速度数十秒〜数分数秒で起動
データ容量数GB〜数十GB数百MB程度で済むことが多い
OSの構成ゲストOSを含むホストOSを共有
性能やや重い軽量で高速

Dockerは、より軽く・早く・効率的にアプリを動かすための「次世代の仮想化技術」として注目されてきました。


どうしてDockerが人気なの?

理由1:開発環境の再現性が高い!

誰のPCでも「同じDockerイメージ」を使えば、同じ開発環境が再現できます。

→ 「先輩の環境で動くのに、自分のは動かない…」がなくなる!


理由2:本番環境でもそのまま使える!

開発だけでなく、テスト環境や本番環境にもそのまま使えるのがDockerの強み。
開発→テスト→本番への流れがスムーズになります。


理由3:チームでの開発がしやすい!

Dockerfile(後ほど解説)を共有することで、チーム全体で同じ環境を簡単に使えます。
新人でも「環境整いました!」とすぐに作業に取りかかれるのです。


実際にどんな場面で使われている?

  • Webアプリの開発(例:フロントエンド+バックエンド+DBを1つに)
  • テスト自動化環境(CI/CD)
  • 機械学習やデータ分析(ライブラリ地獄からの解放)
  • 本番サーバーの構築と運用

今やスタートアップから大企業まで、「Dockerなしでは開発が進まない」と言っても過言ではありません。


この章のまとめ

  • Dockerは「動く環境ごと持ち運べる技術」
  • 仮想マシンより軽量で速く、再現性も高い
  • 開発・テスト・本番に同じ環境を使える
  • 新人でも先輩と同じスタートラインに立てる!

次のステップ:基本用語を学ぼう!

次章では、Dockerを使う上で避けて通れない「コンテナ」「イメージ」「Docker Engine」などの基本用語をわかりやすく解説していきます。

「コンテナって何か怖そう…」と思っているあなた!
実はすごくシンプルな考え方なんですよ。

第2章:Dockerの基本用語をおさえよう

~「コンテナって何?」を今こそハッキリさせる章~

前章でDockerの全体像がなんとなく見えてきましたね。
でも「イメージ?」「コンテナ?」「エンジン?」と、まだまだ用語がふわっとしていませんか?

今回は、Dockerの世界で登場する基本用語を1つずつ丁寧に解説します!
この章が終わる頃には、「とりあえず用語はついていける!」という自信が持てるはずです。


コンテナとは?

アプリが「動く」状態の単位

コンテナ(container)とは、Dockerで作成されるアプリケーションが動作している実体のことです。

もっとかみ砕くと、

コンテナ = イメージ(設計図)+ 実行状態(稼働中)

たとえば、

  • コンテナは「今動いているお弁当」
  • イメージは「レシピカード」

と考えるとわかりやすいですね。


イメージとは?

コンテナを作るための「レシピ」

イメージ(image)は、コンテナのもとになるファイルの集まりです。

この中には、

  • どんなOSをベースにするか(例:Ubuntu, Alpineなど)
  • どんなソフトをインストールするか(例:Python, Node.jsなど)
  • どのファイルをどこに配置するか
  • 実行時にどんなコマンドを走らせるか

などが書かれています。

イメージは「固定された内容」であり、これをもとに何個でも同じコンテナを複製して起動できます。


Docker Engineとは?

Dockerを動かす「心臓部」

Docker Engine(ドッカーエンジン)は、
コンテナやイメージを実際に動かしてくれるソフトウェア本体
です。

OS上で常に動いていて、

  • イメージの作成
  • コンテナの起動・停止
  • ボリュームやネットワークの管理

など、すべての土台になっています。

用語整理

用語意味
Docker EngineDockerのコアプログラム。裏で全部制御している。
Docker CLIターミナルで使うコマンド(例:docker run)のこと。
Docker DesktopGUI付きのDocker環境。Windows/Macではこれを使うことが多い。

Docker Hubとは?

みんなのイメージが集まる「共有倉庫」

Docker Hub(ドッカーハブ)は、
Dockerの公式が運営しているイメージの公開・共有サービス
です。

イメージを探すときや、使いたい環境を取得するときは、基本的にここからダウンロードします。

例えば:

  • python:Python入りの公式イメージ
  • nginx:Nginxサーバーの公式イメージ
  • mysql:MySQL入りのイメージ
docker pull python

このコマンドは、Docker Hubから「python」というイメージを取ってくる命令です。


補足:ボリュームとネットワークって何?

Dockerを使っていくと、次の2つの単語もよく目にします。

ボリューム(Volume)とは?

  • コンテナの外側にあるデータ保存場所
  • コンテナが消えてもデータが残る。

ネットワーク(Network)とは?

  • コンテナ同士を通信させるための仕組み
  • 「Webアプリ → DBコンテナ」などの構成に必須。

この章のまとめ

用語意味
コンテナ実際に動いているアプリの実体。
イメージコンテナの設計図・レシピ。
Docker EngineDockerの心臓。イメージ・コンテナを動かす。
Docker Hubイメージを保管・共有する場所。
ボリュームデータ保存の仕組み。
ネットワークコンテナ間の通信の仕組み。

いよいよ「実際にDockerを使ってみる」ステップに進みます!
Docker Desktopをインストールし、docker run で最初のコンテナを動かしてみましょう!


第3章:Dockerを使ってみよう

~最初の一歩!Docker Desktopとhello-world

ここまででDockerの基本的な考え方と用語はばっちりですね。

この章では、いよいよ実際にDockerを触ってみるところまで進みます。
インストールから、最初のコンテナ実行まで、一歩一歩進めていきましょう!


ステップ1:Docker Desktopのインストール

まずはDockerを実行できるように、Docker Desktopをインストールします。
これはDockerをWindowsやMacで使うためのアプリです。

Windows編(WSL2対応)

  1. 公式サイト(https://www.docker.com/products/docker-desktop/) からDocker Desktopをダウンロード
  2. WSL2(Windows Subsystem for Linux)を有効化しておく
  3. インストーラーを起動して、指示に従う
  4. インストール後、PCを再起動

macOS編

  1. 上記公式サイトからMac版をダウンロード
  2. .dmgファイルを開いてインストール
  3. 起動してライセンスに同意
  4. メニューバーにクジラのアイコンが出ればOK!

Linux編(Ubuntuなど)

sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker


ステップ2:インストール確認

ターミナル(またはコマンドプロンプト)を開いて、以下のコマンドを実行してみましょう:

docker version

これでDocker EngineとClientのバージョンが表示されれば、インストール成功です!


ステップ3:最初のDockerコマンド hello-world

Dockerの動作確認として、最も有名なイメージ hello-world を使います。

docker run hello-world

このコマンドを打つと、以下のようなことが起こります:

  1. Docker Hubから hello-world イメージを自動でダウンロード
  2. そのイメージからコンテナを作成・実行
  3. コンテナ内から「Hello from Docker!」と出力

つまり、「Dockerがちゃんと動いてるかチェックするコマンド」というわけです。


よくあるエラーと対処法

エラー原因解決策
permission deniedLinuxで権限がないsudo をつける、または docker グループに追加
Cannot connect to the Docker daemonDocker Engineが動いていないsystemctl start docker で起動
command not found: dockerパスが通ってない or インストール失敗インストール手順を再確認

補足:Dockerの仕組み(超ざっくり)

docker run hello-world

この1行にはたくさんの処理が詰まっています。

  • run:イメージからコンテナを作って実行
  • hello-world:イメージ名。なければ自動的にDocker Hubからダウンロード
  • 実行後、すぐに終了(これはテスト用なので)

まとめ

  • Docker Desktopをインストールすれば、すぐに使い始められる
  • docker run hello-world は最初の動作確認に最適
  • エラーが出たら焦らず、一つずつ対処すれば大丈夫

いよいよ「本格的なDocker操作」に入っていきます!
docker ps, docker images, docker stop などの基本コマンドを覚えて、
「Dockerを扱える新人」になりましょう!


第4章:Dockerの基本操作を覚えよう

~コマンドラインが怖くなくなる!初歩の操作をマスターしよう~

前章では docker run hello-world でDockerが動くことを確認しましたね。
ここからは、Dockerで実際の開発に近い操作をするために、基本的なコマンドをしっかり身につけていきましょう


Dockerでよく使う操作とは?

Dockerを扱う上でまず覚えるべきなのは、以下のような操作です。

  1. イメージを取得する
  2. コンテナを起動・停止する
  3. 今動いているコンテナを確認する
  4. 不要なコンテナやイメージを削除する

この章では、これらを実際のコマンド例とともに解説していきます。


イメージを取得する:docker pull

docker pull nginx

このコマンドは、「nginxという名前のイメージをDocker Hubからダウンロードしてくる」という意味です。

  • 例:docker pull ubuntu
  • 使いどき:手元にないイメージを先に準備したいとき

コンテナを起動する:docker run

docker run -d -p 8080:80 nginx

このコマンドは、

  • nginx というイメージから
  • バックグラウンドで-d
  • ホストの8080番ポートを、コンテナの80番に繋いで-p 8080:80
  • コンテナを実行する

という命令です。

ポイント

  • -d は「detach」の略。裏で動かすモード
  • -p は「ポートを外に公開する」設定

コンテナの一覧を確認する:docker ps

docker ps

実行中のコンテナを確認できます。

docker ps -a

-a をつけると「停止中も含めたすべてのコンテナ」が表示されます。


コンテナの停止・削除

停止:docker stop

docker stop [コンテナIDまたは名前]

例:

docker stop sleepy_hodgkin

削除:docker rm

docker rm [コンテナIDまたは名前]

※停止していないと削除できないため、まず stop → それから rm


イメージの一覧と削除

一覧:docker images

docker images

手元にあるDockerイメージがすべて表示されます。

削除:docker rmi

docker rmi [イメージIDまたは名前]

注意:そのイメージから作ったコンテナが残っていると削除できません。


よく使う基本コマンドまとめ表

操作内容コマンド
イメージの取得docker pull イメージ名
コンテナの起動docker run [オプション] イメージ名
実行中のコンテナ確認docker ps
すべてのコンテナ確認docker ps -a
コンテナの停止docker stop コンテナID
コンテナの削除docker rm コンテナID
イメージ一覧docker images
イメージ削除docker rmi イメージID

補足:docker exec で中に入ってみよう

docker exec -it コンテナID bash

これはコンテナの中に入って操作するためのコマンドです。
例:

docker exec -it sleepy_hodgkin bash

中に入ると、まるでリモートサーバーを操作しているような感覚になります。


この章のまとめ

  • Dockerはすべてコマンドで操作できる(慣れれば超快適)
  • 基本的な操作だけでも、十分に活用できる
  • docker psdocker images で今の状態をこまめに確認しよう
  • 不要なコンテナやイメージはこまめに削除!

次は自分だけのDocker環境を作る方法に進みます!
「Dockerfile」というファイルを使えば、いつでも同じ環境を自動で作れるようになります。


第5章:Dockerfileを書いてみよう

~自分だけの開発環境をコードでつくる~

ここまででDockerの基本操作にはだいぶ慣れてきたと思います。
今回のテーマは、「自分専用の開発環境をつくる」ための重要なファイル、Dockerfile(ドッカーファイル)です。


Dockerfileって何?

Dockerfileは、「この手順でコンテナを作ってね!」とDockerに教えるレシピのようなものです。

このファイルに、

  • どのOSを使うか
  • どんなソフトをインストールするか
  • どのファイルをどこに置くか
  • 起動時に何を実行するか

などをコードで明示できます。


なぜDockerfileが必要なのか?

再現性と自動化!

手動でdocker runを毎回設定していたら、
人によって環境がズレてしまいますよね?

Dockerfileがあれば、
「誰が、いつ、どこで実行しても、同じ環境」が保証されます。

チーム開発でも、CI/CDでも、プロジェクトの管理でも必須です!


Dockerfileの基本構成

以下は、Pythonアプリケーション用の簡単なDockerfileです。

# ベースとなるイメージを指定
FROM python:3.10-slim

# 作業ディレクトリを作成
WORKDIR /app

# ローカルのファイルをコンテナにコピー
COPY requirements.txt .

# パッケージをインストール
RUN pip install -r requirements.txt

# アプリ本体をコピー
COPY . .

# 起動時に実行されるコマンド
CMD ["python", "main.py"]

各命令の意味と役割

命令説明
FROMベースにするDockerイメージを指定(例:Python, Node)
WORKDIR作業フォルダを作成(cdみたいなもの)
COPYファイルをホスト→コンテナにコピー
RUNコンテナ作成時に一度だけ実行されるコマンド
CMDコンテナ起動時に実行されるコマンド(上書き可能)

Dockerfileからイメージを作成する:docker build

docker build -t my-python-app .

  • -t はタグ(名前)をつけるオプション
  • . は「カレントディレクトリのDockerfileを使う」という意味

このコマンドで、Dockerfileに基づいてイメージが1つ完成します!


イメージを使ってコンテナを起動する

docker run -it --rm my-python-app

  • -it はインタラクティブモード(入力できる)
  • --rm は使い終わったら削除

こうして、自分が定義した環境がすぐに動き出します。


よくあるつまずきポイント

Q. COPY したファイルが見つからない?

  • 解決:Dockerfileのあるディレクトリでdocker buildしているか確認!

Q. キャッシュが効いて変更が反映されない?

  • 解決:--no-cache オプションをつけてビルドしてみましょう!
docker build --no-cache -t my-python-app .


まとめ

  • Dockerfileは開発環境をコードで定義するレシピ
  • FROMRUN などの命令で自由に環境をカスタマイズできる
  • docker build でイメージを作り、docker run で実行!

いよいよ複数のサービス(例:WebアプリとDB)をまとめて起動できる技術、Docker Composeに入っていきます。

「Webアプリは動くけど、DBが起動してない!」なんてミスをなくすための、最強ツールを一緒に学びましょう!


第6章:Docker Composeで複数サービスを管理

~Webアプリ+DBを一発起動!開発効率を一気に高めよう~

前章でDockerfileを使い、自分だけの環境をコードで定義する方法を学びましたね。
でも、現実の開発では1つのサービスだけで完結することは少なく、複数のコンテナが関係し合って動いています。

たとえば…

  • Webアプリ(Python Flaskなど)
  • データベース(MySQLやPostgreSQL)
  • キャッシュ(Redis)
  • バッチ処理のワーカー

これらをまとめて簡単に起動・停止できるのが、今回紹介する Docker Compose(ドッカーコンポーズ) です!


Docker Composeとは?

Docker Composeは、複数のコンテナをYAML形式の設定ファイルで一括管理できるツールです。

ざっくり言うと:

複数のdocker runを、1ファイルにまとめて一発で起動できる魔法の道具!


docker-compose.yml の基本構成

以下は、Flask(Webアプリ)とMySQL(データベース)を一緒に動かす例です。

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - db
  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: sampledb
      MYSQL_USER: user
      MYSQL_PASSWORD: pass

解説:

項目意味
servicesコンテナ群を定義するセクション
web / db各コンテナの名前(自由につけてOK)
buildDockerfile からビルド(自作)
image既存のイメージを使用(MySQLなど)
portsホストとコンテナのポート対応
environment環境変数で設定値を渡す
depends_on起動順の依存関係を指定

起動・停止の基本コマンド

一括起動

docker compose up

  • -d をつければバックグラウンド起動(up -d

一括停止

docker compose down

これだけで、複数のコンテナをまとめて起動・停止できます!


ファイル構成の例

myapp/
├── app.py
├── Dockerfile
├── requirements.txt
└── docker-compose.yml

このように、プロジェクトフォルダの中に docker-compose.yml を置くのが一般的です。


ローカル開発でのメリット

  • 複数のサービスをまとめて再現できる
  • 各サービスの設定を1ファイルで管理
  • チーム開発でも「docker compose upしてね」でOK!

よくあるトラブルと対処法

現象原因対処
WebとDBが通信できないネットワーク設定 or 環境変数不足コンテナ名で接続しているか確認(例:db
DBがまだ起動してない起動順の問題depends_onを使って起動順を定義
ポートが競合しているホスト側のポートが他と被ってるportsを調整する(例:5001:5000

補足:.envファイルで環境変数を分離

docker-compose.ymlの中で使う環境変数を、別ファイルにまとめることもできます。

MYSQL_ROOT_PASSWORD=password
MYSQL_DATABASE=sampledb

これにより、設定とコードの分離ができて、安全・便利になります。


この章のまとめ

  • Docker Composeを使えば、複数のサービスを一括で管理できる
  • YAMLファイルで、コンテナの構成を「見える化」できる
  • 実務ではほぼ必須レベルの技術!
  • docker compose up / down だけで全体を操作可能!

次章では、いよいよ「チーム開発や実務でDockerをどう使うか?」にフォーカスします。

第7章:新卒エンジニアが知っておきたい運用ポイント

~Dockerを「作れる」から「使いこなせる」へ~

ここまでで、Dockerの基本からComposeまで一通り学んできました。
いよいよこの章では、「現場で実際に使うために気をつけるべきこと」を解説していきます。

「起動できたら終わり」ではなく、「どうやって安全に・安定して運用するか」も、新卒エンジニアにとって重要なスキルです!


なぜ「運用」が大事なのか?

開発中は問題なく動いていても、次のようなトラブルが起きることは珍しくありません:

  • コンテナを再起動したらデータが消えていた!
  • ログが追えなくて原因がわからない!
  • ネットワークのつながりが不安定!

これらは、Dockerの特性と付き合いながら設計・運用する力が問われる場面です。


ポイント1:データを永続化するには?(Volume)

Dockerのコンテナは、削除すると中のデータも消えてしまうのが基本です。
そこで必要なのが、ボリューム(Volume)という仕組みです。

例:

docker volume create mydata
docker run -v mydata:/var/lib/mysql mysql

このようにすると、コンテナが消えても、データはボリュームに残り続けるのです。

よく使う書き方(Composeで)

volumes:
  - dbdata:/var/lib/mysql

...

volumes:
  dbdata:

→ 開発でも本番でもデータの永続化は必須です!


ポイント2:ネットワークの基本設計

Dockerでは、複数のコンテナが仮想ネットワークでつながっています。
以下の点に注意しましょう:

  • デフォルトでは同じdocker-compose.yml内のサービス同士は名前で通信可能
    • 例:Flaskアプリからdb:3306でMySQLに接続できる
  • 外部公開するポートは最小限に

ネットワークの定義(Compose)

networks:
  app-network:
services:
  web:
    networks:
      - app-network

ポイント3:ログ管理の基本

確認方法

docker logs コンテナ名

ログが標準出力に出るようにしておくと、監視ツールやCI/CDパイプラインと連携しやすくなります。

注意点:

  • コンテナが消えるとログも消えるので、必要なら外部に出力
  • 複数コンテナがある場合、ログの分離が大事

ポイント4:起動順序と依存管理

複数サービスがある場合、先にDBが立ち上がってからWebアプリが起動しないと失敗するようなケースがよくあります。

depends_on で起動順を制御

depends_on:
  - db

※完全な「起動完了」は保証されないので、アプリ側でリトライ処理も入れておくと安心です。


ポイント5:本番と開発を分けよう

開発環境では使いやすくても、本番では要注意。

項目開発用本番用
CMD手軽にテスト起動プロセスマネージャで制御
ports外部公開ありリバースプロキシ越しに
volumesホストとマウントバックアップ・セキュリティ設計必要

本番では、Docker単体ではなくKubernetesやCI/CDと組み合わせて運用するのが一般的です。


まとめ

  • データはVolumeで保存
  • サービス間通信はネットワーク設定がカギ
  • ログは標準出力に出しておくと便利
  • 起動順や依存関係に注意
  • 開発と本番では設定を分ける意識を持とう

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。