DevOps

【Docker入門】歴史から学ぶコンテナ革命と基本コマンド

Docker以前、アプリケーションのデプロイは「依存関係地獄」と呼ばれる悪夢でした。 「私のマシンでは動くのに、本番環境では動かない」という言葉が、業界で最も一般的な言い訳でした。

Dockerはすべてを変えました。ソフトウェアのパッケージング、配送、実行の方法を標準化したのです。この記事では、この革命の歴史と、現代における基本的な使い方を解説します。

1. 歴史:dotCloudから世界制覇へ

Docker Neon Logo

始まり (2013年)

物語は dotCloud という小さなPaaSスタートアップから始まります。 創業者の Solomon Hykes は、PyCon US 2013 で一つのデモを行いました。彼は、アプリケーションとその依存関係を軽量でポータブルなコンテナに詰め込むツールを披露しました。

それは元々、LXC (Linux Containers) ラッパーとして作られた社内ツールに過ぎませんでした。しかし、「Docker」としてオープンソース化されると、爆発的に普及しました。

なぜ勝てたのか?

当時、VMwareやVirtualBoxのような仮想マシン(VM)が標準でしたが、それらは重厚でした。

  • VM: 完全なゲストOSを必要とする(サイズはGB単位、起動に数分)。
  • コンテナ: ホストOSのカーネルを共有する(サイズはMB単位、起動はミリ秒)。

Dockerは、複雑なコンテナ技術を一般の開発者が使えるレベルまで簡略化しました。シンプルなコマンドラインと、標準化されたファイル形式(Dockerfile)を提供したのです。

2. インストール:Docker Desktop と OrbStack

MacやWindowsでDockerを使うには、ランタイムが必要です。

  • Docker Desktop: 公式の標準ツール。機能豊富ですが、リソース消費が激しいことがあります。
  • OrbStack: Mac向けの新しいチャレンジャーです。爆速で軽量、そしてネイティブ並みのパフォーマンスが出ます。MacユーザーならOrbStackを強くおすすめします。

3. 知っておくべき基本コマンド

ターミナルを開いて、これらのコマンドを試してみてください。

初めてのコンテナ

docker run hello-world

ローカルにイメージがなければDocker Hubからダウンロードし、実行してメッセージを表示し、終了します。これらすべてが数秒で終わります。

Webサーバーを動かす

# Nginxをバックグラウンド(-d)で起動し、ポート8080を80にマッピング(-p) docker run -d -p 8080:80 --name my-nginx nginx

これでブラウザで http://localhost:8080 を開いてみてください。MacにNginxをインストールすることなく、Webサーバーが動いています!

状態確認

# 起動中のコンテナ一覧 docker ps

コンテナの中に入る

# 起動中のコンテナ内でbashを実行 docker exec -it my-nginx bash

お片付け

# コンテナを停止 docker stop my-nginx # コンテナを削除 docker rm my-nginx

4. Infrastructure as Code: Dockerfile

コマンドを手打ちするのは再現性がありません。Dockerfile を使ってイメージを定義します。 以下は、Node.jsアプリケーションをコンテナ化するための一般的な例とその詳細解説です。

# Dockerfile FROM node:20-alpine WORKDIR /app COPY package.json . RUN npm install COPY . . CMD ["npm", "start"]

各行の解説

FROM node:20-alpine

ベースイメージの指定 「料理の土台」を選びます。ここでは node:20-alpine を指定しています。 alpine はAlpine Linuxという超軽量OSを使ったバージョンで、イメージサイズを劇的に小さくできます。本番環境ではこの軽量版を使うのが鉄則です。

WORKDIR /app

作業ディレクトリの移動 「コンテナの中のどこで作業するか」を決めます。 これ以降のコマンド(RUNやCOPYなど)は、全て /app ディレクトリの中で実行されます。ディレクトリがなければ勝手に作ってくれます。

COPY package.json .

ファイルのコピー ホスト側(あなたのPC)の package.json を、コンテナ内のカレントディレクトリ(/app)にコピーします。 なぜ全ファイルではなく先にこれだけ? Dockerには「キャッシュ」という仕組みがあるからです。依存関係が変わっていないのに npm install を毎回やり直すのは時間の無駄です。変更頻度の低いファイルを先にコピーするのが高速化のコツです。

RUN npm install

コマンドの実行 ライブラリのインストールを行います。この結果はイメージに焼き付けられます。

COPY . .

残りのファイルをコピー ソースコードなど、残りの全てのファイルをコンテナ内にコピーします。

CMD ["npm", "start"]

起動コマンド コンテナが起動した「瞬間」に実行されるコマンドです。 このコマンドが終了すると、コンテナも終了します。

そしてビルドします:

docker build -t my-app .

5. オーケストレーション: Docker Compose

実際のアプリにはDBやキャッシュが必要です。それらを docker run で管理するのは苦痛です。そこで Docker Compose の出番です。

# compose.yaml services: web: build: . ports: - "3000:3000" db: image: postgres environment: POSTGRES_PASSWORD: password

docker compose up と打つだけで、すべての環境が整います。

結論

Dockerはもはや「DevOpsツール」ではありません。すべての開発者にとっての必須スキルです。コードがどこでも全く同じように動くことを保証してくれるのです。今日からプロジェクトのコンテナ化を始めましょう!