Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】From Docker to Kubernetes: How Your Application Goes from Local to Cloud

2025年09月18日に「Dev.to」が公開したITニュース「From Docker to Kubernetes: How Your Application Goes from Local to Cloud」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Dockerはアプリをコンテナにまとめ、Kubernetesはそれらを多数のサーバーで自動運用・管理する技術だ。本記事では、Node.jsアプリをDockerで作成し、Docker Hubへ公開、Kubernetesへデプロイしてスケールさせる手順を具体的に解説する。クラウドでのアプリ運用基礎が学べる。

ITニュース解説

このニュース記事は、現代のソフトウェア開発において不可欠な技術であるDockerとKubernetesがどのように連携し、アプリケーションを開発者の手元からインターネット上の大規模な環境(クラウド)へと展開していくのかを、具体的な手順を通して解説している。

まず、Dockerはアプリケーションとその実行に必要なすべての要素(コード、ランタイム、システムツール、ライブラリなど)を「コンテナ」と呼ばれる独立したパッケージにまとめる技術だ。これにより、アプリケーションはどんな環境でも同じように動作することを保証できる。開発者のPCでも、テスト環境でも、本番環境でも、コンテナとしてパッケージ化されていれば、環境の違いによる「自分のPCでは動いたのに、本番では動かない」という問題を大幅に減らせる。記事ではNode.jsというJavaScriptの実行環境を使った簡単なウェブアプリケーションを例に、その具体的な手順を示している。

最初に、シンプルなNode.jsアプリケーションを作成する。これは、ウェブブラウザからアクセスすると「Hello from Docker and Kubernetes!」というメッセージを返すだけのものだ。このアプリケーションのコードと、Node.jsが必要とする設定ファイル(package.json)を用意する。

次に、このアプリケーションをDockerコンテナにするための設計図である「Dockerfile」を作成する。Dockerfileは、まるで料理のレシピのように、コンテナイメージをどのように作るかをDockerに指示するテキストファイルだ。この記事のDockerfileでは、まずベースとなるNode.jsの実行環境(node:18-alpine)を指定し、次にアプリケーションのファイルをコンテナ内にコピーし、必要な依存関係(npm install)をインストールする。そして、アプリケーションが外部からの接続を待ち受けるポート(3000番)を公開し、最後にアプリケーションを起動するコマンド(node app.js)を定義している。

Dockerfileが完成したら、docker buildコマンドを使ってコンテナイメージを構築する。このコマンドはDockerfileの指示に従って、アプリケーションとその実行環境が一つにまとまった「myapp:1.0」という名前のイメージを作成する。イメージは、コンテナを起動するためのテンプレートのようなものだ。イメージが作成されたら、docker runコマンドでこのイメージからコンテナを起動し、ローカル環境でアプリケーションが正しく動作するか確認できる。docker run -p 3000:3000 myapp:1.0というコマンドは、ローカルPCの3000番ポートへのアクセスをコンテナ内の3000番ポートに転送することで、ウェブブラウザからアプリケーションにアクセスできるようにする。

ここまでで、アプリケーションはDockerコンテナとしてローカル環境で動作するようになった。しかし、このコンテナをインターネット上の多数のサーバーで動かすKubernetesのようなシステムで利用するには、そのコンテナイメージを共有可能な場所に保存する必要がある。その共有場所が「コンテナレジストリ」であり、記事では「Docker Hub」を利用している。Docker Hubは、GitHubがソースコードのリポジトリであるように、コンテナイメージを保存・共有するためのサービスだと考えると良い。

Docker Hubにイメージをプッシュする手順はシンプルだ。まずdocker loginでDocker Hubアカウントにログインする。次に、ローカルで作成したイメージに、自分のDocker Hubのユーザー名を含んだ新しいタグを付ける(例: your-username/myapp:1.0)。これは、Docker Hub上のどのアカウントのどのイメージであるかを識別するための名前だ。最後にdocker pushコマンドで、タグ付けしたイメージをDocker Hubへアップロードする。これで、Kubernetesがこのイメージをインターネット経由で取得できるようになる。

いよいよ、Kubernetesの登場だ。Kubernetesは、Dockerで作成したコンテナ化されたアプリケーションを、複数のサーバー(ノード)からなるクラスター上で大規模に、そして自動的に管理・運用するためのプラットフォームだ。アプリケーションのデプロイ、スケーリング、自己修復、負荷分散といった複雑なタスクをKubernetesが自動で行う。

Kubernetesにアプリケーションをデプロイするには、「YAMLファイル」という形式で、どのようなアプリケーションをどのように実行したいかを記述する。記事ではdeployment.yamlというファイルを作成し、二つの主要なKubernetesリソースを定義している。

一つ目は「Deployment(デプロイメント)」だ。Deploymentは、アプリケーションのコンテナをどのように実行するか、そしてそのコンテナのインスタンス(レプリカ)をいくつ実行するかをKubernetesに伝える。このファイルでは、myapp-deploymentという名前でDeploymentを定義し、先ほどDocker Hubにプッシュしたイメージ(your-username/myapp:1.0)を指定している。さらに、replicas: 3と設定することで、このアプリケーションのコンテナを常に3つ稼働させておくように指示している。これは、もし一つのコンテナに問題が発生しても、残りの二つがサービスを提供し続けられるようにしたり、アクセス増加に対応できるようにするための設定だ。Kubernetesは、指定された数のレプリカが常に稼働している状態を自動的に維持しようと努める。

二つ目は「Service(サービス)」だ。Deploymentがアプリケーションの実行方法を定義するのに対し、Serviceはアプリケーションが外部のユーザーや他のアプリケーションからどのようにアクセスされるかを定義する。Deploymentで起動された3つのコンテナは、それぞれ異なるIPアドレスを持つ可能性があるが、Serviceはこれらのコンテナ群に対して単一の安定したアクセスポイントを提供する。この記事のmyapp-serviceというServiceは、クラスター外部からのポート80番(HTTPの標準ポート)へのアクセスを、Deploymentが管理するコンテナ群のポート3000番に転送するように設定されている。type: LoadBalancerを指定することで、Kubernetesは必要に応じてロードバランサーをプロビジョニングし、外部からアプリケーションにアクセスできるIPアドレスを割り当てる。

これらのYAMLファイルをkubectl apply -f deployment.yamlコマンドでKubernetesクラスターに適用すると、Kubernetesは定義されたDeploymentとServiceを作成し、アプリケーションのコンテナを起動し、外部からアクセス可能な状態にする。kubectl get podsコマンドで、期待通り3つのコンテナ(Podと呼ばれる)が稼働していることを確認できる。また、kubectl get service myapp-serviceコマンドでServiceの詳細を確認し、外部アクセス用のIPアドレスが割り当てられているかを確認する。MinikubeのようなローカルのKubernetes環境を使用している場合は、minikube service myapp-serviceコマンドで直接ウェブブラウザでアプリケーションを開くことができる。

Kubernetesの強力な機能の一つは、アプリケーションの「スケーリング」だ。アプリケーションへのアクセスが増加し、より多くの処理能力が必要になった場合、Kubernetesは非常に簡単にアプリケーションのインスタンス数を増やすことができる。kubectl scale deployment myapp-deployment --replicas=5というコマンドを実行すると、KubernetesはDeploymentが管理するコンテナの数を自動的に3つから5つに増やす。これにより、手動で新しいサーバーを準備したり、アプリケーションをデプロイしたりする手間なく、需要に応じて柔軟にアプリケーションの規模を拡大できる。

このように、Dockerはアプリケーションをどこでも一貫して実行できるコンテナとしてパッケージ化し、Kubernetesはそのコンテナを多数のサーバーで、信頼性高く、自動的に、そして大規模に運用するための基盤を提供する。この二つの技術は現代のクラウドネイティブアプリケーション開発において、開発から運用までの効率化と安定稼働を実現する、まさに「車の両輪」のような関係にある。

関連コンテンツ

関連IT用語