Docker とは何か、そして開発者がそれを学ぶべき理由
開発者向けの Docker の実践的な解説:コンテナと VM、主要なコマンド、Dockerfile、そして実際のプロジェクトで使い始める方法。
Docker は求人広告やセットアップガイドに頻繁に出てきており、コンテナに触れたことがなければ、実際のコードを書く前に越えなければならない壁のように感じるかもしれません。用語を理解すれば、それほど複雑ではありません。
コンテナとは実際には何か
コンテナはアプリケーションをそれが実行するために必要なものすべてとともにパッケージ化します:コード、ランタイム、システムライブラリ、設定ファイルです。仮想マシンではありません。VM は OS 全体をカーネルを含めて仮想化するため、起動に 1 分かかり、数ギガバイトの RAM を消費する可能性があります。コンテナはホストマシンのカーネルを共有し、プロセスだけを分離するため、1 秒以下で起動し、通常はギガバイトではなく数十メガバイトのメモリを使用します。
この違いが Docker がローカル開発と CI パイプラインを急速に普及させた理由です。Postgres データベース、Redis キャッシュ、アプリサーバーを 1 台のノートパソコンで起動でき、OS に直接インストールする必要がありません。
知っておくべき主要なピース
日々の作業のほとんどをカバーする 4 つの用語があります:
- Image:Dockerfile から構築された読み取り専用テンプレート。ファイルシステムのスナップショットとそれを実行する方法に関するメタデータと考えてください。
- Container:image の実行中インスタンス。それを元に作られた image に触れることなく、コンテナを開始、停止、削除できます。
- Dockerfile:image を構築する手順が 1 行ずつ記述されたテキストファイル。
- Registry:image が保存され、プルされる場所。最も一般的には Docker Hub です。
Node.js アプリの最小限の Dockerfile は次のようになります:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
docker build -t my-app . で構築し、docker run -p 3000:3000 my-app で実行します。-p フラグはマシン上のポートをコンテナ内のポートにマップします。これがブラウザからアプリに実際に到達する方法です。
常に使うコマンド
少数のコマンドがほとんどの日常業務をカバーします:
docker ps— 実行中のコンテナをリスト表示docker ps -a— 停止したものを含む、すべてのコンテナをリスト表示docker images— マシン上の image をリスト表示docker logs <container>— 実行中または停止したコンテナからの出力をチェックdocker exec -it <container> sh— 実行中のコンテナ内でシェルを開くdocker rm/docker rmi— もう不要なコンテナと image をクリーンアップ
この最後のペアは人々が予想するより重要です。Docker は古い image と停止したコンテナにディスク容量が消えていくことを喜んで許可します。docker system prune を時々実行すると、驚くほどのディスク容量が回収されます。
docker-compose がワークフローをどう変えるか
ほとんどの実際のプロジェクトには 1 つ以上のコンテナが必要です:アプリサーバー、データベース、おそらくキャッシュです。それぞれのために docker run コマンドを書き出すのはすぐに飽きます。docker-compose.yml を使えば、スタック全体を 1 つのファイルで定義できます:
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: devpassword
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
docker compose up を実行すると、両方のサービスが一緒に起動し、web がサービス名で db に到達できるようにネットワーク化されます。これはほぼすべてのオープンソースリポジトリの README に見られるセットアップで、これを理解すれば、Postgres、Redis、アプリが必要とするその他を手動でインストールする代わりに、数分でプロジェクトを起動して実行できます。
初期段階で人々がつまずくところ
Volume はほぼ誰もが最初は混乱します。volume がなければ、コンテナ内に書き込まれたすべてのものはコンテナが削除されるときに消えてしまいます。これはデータベースには問題です。上の compose ファイルの volumes セクションは、データが再起動後も残るように、名前付き volume をコンテナ内のパスにマップします。
もう 1 つよくある間違いは、.dockerignore ファイルがないため、node_modules または .git を image にコピーすることです。.gitignore のような .dockerignore を追加してください:
node_modules
.git
.env
これにより、ビルドが高速になり、image がより小さくなります。image をレジストリにプッシュするか、Kubernetes にデプロイするようになると、これは重要です。
基本の先の進み方
コンテナの構築と実行が当たり前に感じられるようになったら、次に役立つスキルは、より小さい本番 image のためのマルチステージビルド、Docker ネットワーキングモードの理解、何かが正しく接続されていないときの docker inspect 出力の読み方です。どれも難しくはなく、初回は不慣れなだけです。
実際のアプリケーションのコンテナ化とクラウドデプロイメントパイプラインへの接続の詳細については、Korra Studio の DevOps と Cloud セクションをご覧ください。
この記事は AI の支援を受けて執筆し、Korra Studio の Michal Pilch(CISSP)が確認のうえ公開しました。
これは Korra Studio ナレッジベースの 1 つのノートです。プラットフォームはすべてのトピックと 1 対 1 メンタリングをペアで提供します。
無料で始めるarrow_forward