『はじめての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 Engine | Dockerのコアプログラム。裏で全部制御している。 |
Docker CLI | ターミナルで使うコマンド(例:docker run )のこと。 |
Docker Desktop | GUI付きの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 Engine | Dockerの心臓。イメージ・コンテナを動かす。 |
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対応)
- 公式サイト(https://www.docker.com/products/docker-desktop/) からDocker Desktopをダウンロード
- WSL2(Windows Subsystem for Linux)を有効化しておく
- インストーラーを起動して、指示に従う
- インストール後、PCを再起動
macOS編
- 上記公式サイトからMac版をダウンロード
.dmg
ファイルを開いてインストール- 起動してライセンスに同意
- メニューバーにクジラのアイコンが出れば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
このコマンドを打つと、以下のようなことが起こります:
- Docker Hubから
hello-world
イメージを自動でダウンロード - そのイメージからコンテナを作成・実行
- コンテナ内から「Hello from Docker!」と出力
つまり、「Dockerがちゃんと動いてるかチェックするコマンド」というわけです。
よくあるエラーと対処法
エラー | 原因 | 解決策 |
---|---|---|
permission denied | Linuxで権限がない | sudo をつける、または docker グループに追加 |
Cannot connect to the Docker daemon | Docker 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を扱う上でまず覚えるべきなのは、以下のような操作です。
- イメージを取得する
- コンテナを起動・停止する
- 今動いているコンテナを確認する
- 不要なコンテナやイメージを削除する
この章では、これらを実際のコマンド例とともに解説していきます。
イメージを取得する: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 ps
やdocker 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は開発環境をコードで定義するレシピ
FROM
やRUN
などの命令で自由に環境をカスタマイズできる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) |
build | Dockerfile からビルド(自作) |
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に接続できる
- 例:Flaskアプリから
- 外部公開するポートは最小限に
ネットワークの定義(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年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。