🐳

Dockerの基本講座

2024/06/27に公開

この講座では、Dockerの基本概念から始まり、実際の使用例やコマンドの解説まで、初めてDockerを使う方にもわかりやすく説明します。

コンテナ技術の基礎を学び、実際のプロジェクトで活用できるようになることを目指します。

1. Dockerとは?

コンテナ技術の背景

コンテナ技術とは? コンテナ技術は、アプリケーションの実行環境を隔離し、依存関係を一つのパッケージにまとめる手法です。これにより、アプリケーションがどの環境でも一貫して動作するようになります。

なぜコンテナが必要なのか? 従来の仮想マシン(VM)と比較して、コンテナは軽量で高速です。VMは完全なオペレーティングシステムをエミュレートするため、リソースの消費が大きくなります。一方、コンテナはホストOSのカーネルを共有するため、リソース効率が高く、起動時間も短いです。

Dockerの基本概念

Dockerとは? Dockerは、コンテナ技術を利用してアプリケーションをパッケージ化、配布、および実行するためのプラットフォームです。Dockerは、コンテナの作成、管理、および運用を簡素化するツールとサービスのセットを提供します。

イメージとコンテナの違い

イメージ(Image): イメージは、コンテナの実行可能な形式のスナップショットです。アプリケーションやその依存関係が含まれています。イメージは読み取り専用で、変更はできません。

コンテナ(Container): コンテナは、イメージから実行されるインスタンスです。コンテナは読み取り専用のイメージに対して、読み書き可能なレイヤーを追加します。コンテナは独立して動作し、ホストOSのカーネルを共有します。

Dockerの主要コンポーネント

Docker Engine: Dockerコンテナを構築、実行、および管理するためのエンジンです。Docker DaemonとCLIで構成されます。

Docker Daemon: コンテナのバックグラウンドプロセスです。イメージの管理やコンテナの実行を行います。

Docker CLI: コマンドラインインターフェースです。ユーザーがDocker Daemonと対話するためのツールです。

Dockerのワークフロー

ビルド(Build):Dockerfileを使用してイメージを作成します。

シップ(Ship): 作成したイメージをDocker Hubなどのレジストリにプッシュします。

ラン(Run):レジストリからイメージをプルし、コンテナとして実行します。

Dockerの利点

一貫性: 開発環境と本番環境の差異を減少させます。

スケーラビリティ: コンテナを簡単にスケールアウトできます。

ポータビリティ: 異なる環境間でアプリケーションを容易に移行できます。

効率性: リソースの効率的な利用を可能にします。

2. Dockerのインストール

Docker Desktopのインストール

Docker Desktopのインストールは非常に簡単で、以下の手順で行います。

2.1 Windowsへのインストール

公式サイトからダウンロード Dockerの公式サイト(https://www.docker.com/products/docker-desktop)にアクセスし、Windows用のインストーラをダウンロードします。

インストーラの実行 ダウンロードしたインストーラ(Docker Desktop Installer.exe)をダブルクリックして実行します。

インストールウィザードに従う インストールウィザードが表示されます。特に変更する必要がなければ、デフォルト設定のままで「Install」をクリックします。

インストールの完了 インストールが完了すると、Docker Desktopが自動的に起動します。初回起動時には、追加の設定やチュートリアルが表示されることがあります。

動作確認 コマンドプロンプトやPowerShellを開き、以下のコマンドを入力してDockerが正常にインストールされているか確認します。

docker --version

2.2 MacOSへのインストール

公式サイトからダウンロード Dockerの公式サイト(https://www.docker.com/products/docker-desktop)にアクセスし、Mac用のインストーラをダウンロードします。

インストーラの実行 ダウンロードしたディスクイメージ(Docker.dmg)をダブルクリックして開きます。

アプリケーションフォルダへのドラッグ&ドロップ Dockerアイコンを「Applications」フォルダにドラッグ&ドロップします。

Docker Desktopの起動 「Applications」フォルダからDocker Desktopアプリケーションをダブルクリックして起動します。初回起動時には、システムのアクセス許可を求められる場合があります。

動作確認 ターミナルを開き、以下のコマンドを入力してDockerが正常にインストールされているか確認します。

docker --version

インストール後の設定

Docker Hubへのログイン Docker Desktopをインストールした後、Docker Hubへのログインが推奨されます。これにより、Docker Hubから簡単にイメージを取得したり、自分のイメージをプッシュしたりすることができます。

Docker Desktopアプリケーションを開きます。

右上のアカウントアイコンをクリックし、Docker Hubのアカウント情報を入力してログインします。

設定のカスタマイズ Docker Desktopには、リソースの使用量や共有ドライブの設定など、さまざまなカスタマイズオプションがあります。設定はDocker Desktopの「Preferences」メニューから行うことができます。

リソースの調整 特に開発環境では、Dockerが使用するCPUやメモリの量を調整することが有効です。これにより、ホストシステムのパフォーマンスを最適化できます。

Docker Desktopの「Preferences」メニューを開きます。

「Resources」タブで、CPUやメモリの使用量を設定します。

共有ドライブの設定 Windowsでは、Dockerコンテナとホストシステム間でファイルを共有するために、ドライブを共有する設定が必要です。

Docker Desktopの「Preferences」メニューを開きます。

「Resources」 > 「File Sharing」タブで、共有するドライブを選択します。

3. 基本コマンドの紹介

Dockerの基本的なコマンドを理解することで、コンテナの作成、管理、削除が簡単にできるようになります。以下に、よく使われる基本コマンドを紹介します。

3.1 docker run

概要 docker run コマンドは、指定したイメージから新しいコンテナを作成し、実行します。

基本的な使用方法

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

docker run hello-world

このコマンドは、hello-world イメージからコンテナを作成し、実行します。実行後、Dockerの正常動作を確認するメッセージが表示されます。

バックグラウンドでの実行

docker run -d nginx

このコマンドは、nginx イメージからコンテナをバックグラウンド(デタッチドモード)で実行します。

3.2 docker ps

概要 docker ps コマンドは、実行中のコンテナの一覧を表示します。

基本的な使用方法

docker ps [OPTIONS]

docker ps

このコマンドは、現在実行中のすべてのコンテナを表示します。

停止したコンテナも含めて表示

docker ps -a

このコマンドは、停止中のコンテナも含めてすべてのコンテナを表示します。

3.3 docker images

概要 docker images コマンドは、ローカルに保存されているDockerイメージの一覧を表示します。

基本的な使用方法

docker images [OPTIONS]

docker images

このコマンドは、ローカルに存在するすべてのイメージを表示します。

3.4 docker stop

概要 docker stop コマンドは、実行中のコンテナを停止します。

基本的な使用方法

docker stop [OPTIONS] CONTAINER [CONTAINER...]

docker stop <コンテナIDまたは名前>

このコマンドは、指定したコンテナを停止します。

3.5 docker rm

概要 docker rm コマンドは、停止中のコンテナを削除します。

基本的な使用方法

docker rm [OPTIONS] CONTAINER [CONTAINER...]

docker rm <コンテナIDまたは名前>

このコマンドは、指定した停止中のコンテナを削除します。

すべての停止中のコンテナを削除

docker rm $(docker ps -a -q)

このコマンドは、すべての停止中のコンテナを一括削除します。

4. Dockerfileの作成

Dockerfileとは?

Dockerfileの概要 Dockerfileは、Dockerイメージを構築するための一連のコマンドを記述したテキストファイルです。Dockerfileを使用することで、再現性のある方法でイメージを作成できます。

Dockerfileの基本構文

Dockerfileは、以下の基本的な構文を持ちます。各コマンドは、Dockerイメージのレイヤーを構築します。

FROM: ベースイメージを指定します。

RUN: コマンドを実行します。

COPY または ADD: ファイルやディレクトリをイメージに追加します。

CMD: コンテナが実行される際に実行されるコマンドを指定します。

EXPOSE: コンテナがリッスンするポートを指定します。

ENV: 環境変数を設定します。

ENTRYPOINT: コンテナが起動される際のエントリーポイントを指定します。

WORKDIR: 作業ディレクトリを設定します。

サンプルDockerfileの解説

以下に、シンプルなNode.jsアプリケーションのDockerfileの例を示します。
このDockerfileは、公式のNode.jsイメージをベースにして、アプリケーションコードをイメージに追加し、依存関係をインストールします。

例: Node.jsアプリケーションのDockerfile

# ベースイメージを指定
FROM node:18

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

# パッケージファイルをコピー
COPY package*.json ./

# 依存関係をインストール
RUN npm install

# アプリケーションコードをコピー
COPY . .

# コンテナがリッスンするポートを指定
EXPOSE 3000

# アプリケーションを起動するコマンドを指定
CMD ["npm", "start"]

Dockerfileを使ったイメージのビルド

Dockerfileの作成

プロジェクトディレクトリに Dockerfile という名前で保存します。

イメージのビルド

ターミナルを開き、Dockerfileが存在するディレクトリに移動します。以下のコマンドを実行してイメージをビルドします。

docker build -t my-node-app .

イメージの確認

ビルドが完了すると、以下のコマンドでイメージが作成されていることを確認できます。

docker images

イメージの実行

ビルドしたイメージを基にコンテナを実行します。

docker run -p 3000:3000 my-node-app

このコマンドは、ローカルの3000ポートをコンテナの3000ポートにバインドしてコンテナを実行します。

5. Docker Composeの紹介

Docker Composeとは?

Docker Composeの概要 Docker Composeは、複数のDockerコンテナを定義し、実行するためのツールです。docker-compose.yml ファイルを使用して、アプリケーションのサービス、ネットワーク、ボリュームを一括して設定できます。

Docker Composeの利点

一括管理: 複数のコンテナを一つのファイルで管理できるため、設定が簡単になります。

再現性: 同じ設定で何度でもコンテナを再作成できるため、環境の再現性が高まります。

依存関係の管理: コンテナ間の依存関係を簡単に定義できます。

docker-compose.ymlの基本構文

以下に、Node.jsアプリケーションとMySQLデータベースを使用した具体的な docker-compose.yml の例を示します。

例: Node.jsとMySQLのdocker-compose.yml

version: '3'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
    ports:
      - "3306:3306"

構成要素の説明

version: Docker Composeファイルのバージョンを指定します。

services: 定義するコンテナの集合です。

web: サービスの名前。Node.jsアプリケーションを実行します。

build: Dockerfileが存在するディレクトリを指定します。

ports: ホストとコンテナ間のポートマッピングを指定します。

depends_on: 依存するサービスを指定します。

db: データベースサービスの名前。MySQLを実行します。

image: 使用するMySQLイメージを指定します。

environment: 環境変数を指定します。ここでは、MySQLのルートパスワードを設定しています。

ports: ホストとコンテナ間のポートマッピングを指定します。

Docker Composeの使用方法

5.1. docker-compose.ymlの作成 プロジェクトのルートディレクトリに docker-compose.yml ファイルを作成し、上記の内容を記述します。

5.2. コンテナの起動 ターミナルを開き、docker-compose.yml ファイルがあるディレクトリに移動します。以下のコマンドを実行して、すべてのサービスを起動します。

docker-compose up

このコマンドを実行すると、定義されたすべてのサービス(コンテナ)が一括して起動されます。

5.3. バックグラウンドでの実行 サービスをバックグラウンドで実行する場合は、-d オプションを付けます。

docker-compose up -d

5.4. コンテナの停止 すべてのサービスを停止するには、以下のコマンドを使用します。

docker-compose down

5.5. ログの表示 特定のサービスのログを表示する場合は、以下のコマンドを使用します。

docker-compose logs <サービス名>

docker-compose logs web

まとめ

DockerfileとDocker Composeを使用することで、シンプルなNode.jsアプリケーションから複数のサービスを持つアプリケーションまで、効率的に開発・デプロイすることができます。これにより、再現性の高い開発環境を提供し、異なる環境間での一貫性を保つことができます。

6. 実践例

このセクションでは、実際のNode.jsアプリケーションとMySQLデータベースを使用して、DockerおよびDocker Composeを活用する方法を紹介します。

前提条件

以下のソフトウェアがインストールされていることを確認してください。

Docker Desktop

Node.jsとnpm

プロジェクトの設定

6.1. プロジェクトディレクトリの作成 まず、新しいディレクトリを作成し、その中に移動します。

mkdir my-docker-app
cd my-docker-app

6.2. Node.jsアプリケーションの初期化 次に、Node.jsプロジェクトを初期化します。

npm init -y

6.3. 必要なパッケージのインストール Expressをインストールして、簡単なウェブサーバーを作成します。

npm install express

6.4. アプリケーションファイルの作成 プロジェクトのルートに server.js ファイルを作成し、以下の内容を記述します。

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(port, () => {
  console.log(`App running on http://localhost:${port}`);
});

6.5. Dockerfileの作成 プロジェクトのルートに Dockerfile を作成し、以下の内容を記述します。

# ベースイメージを指定
FROM node:18

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

# パッケージファイルをコピー
COPY package*.json ./

# 依存関係をインストール
RUN npm install

# アプリケーションコードをコピー
COPY . .

# コンテナがリッスンするポートを指定
EXPOSE 3000

# アプリケーションを起動するコマンドを指定
CMD ["npm", "start"]

6.6. docker-compose.ymlの作成 プロジェクトのルートに docker-compose.yml ファイルを作成し、以下の内容を記述します。

version: '3'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
    ports:
      - "3306:3306"

7. 実際の実行

  1. コンテナの起動 ターミナルを開き、docker-compose.yml ファイルがあるディレクトリに移動します。以下のコマンドを実行して、すべてのサービスを起動します。
docker-compose up
  1. ブラウザでの確認 コンテナが正常に起動したら、ブラウザを開いて http://localhost:3000 にアクセスします。「Hello World!」と表示されるはずです。

  2. バックグラウンドでの実行 サービスをバックグラウンドで実行する場合は、以下のコマンドを使用します。

docker-compose up -d
  1. コンテナの停止 すべてのサービスを停止するには、以下のコマンドを使用します。
docker-compose down

8. データベースとの連携

Node.jsアプリケーションからMySQLデータベースに接続するために、以下のように変更します。

  1. MySQL用のパッケージをインストール 以下のコマンドでMySQL用のパッケージをインストールします。
npm install mysql
  1. server.js の更新 server.js ファイルを以下のように更新します。
const express = require('express');
const mysql = require('mysql');
const app = express();
const port = 3000;

const connection = mysql.createConnection({
  host: 'db',
  user: 'root',
  password: 'example',
  database: 'test'
});

connection.connect(err => {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }
  console.log('connected as id ' + connection.threadId);
});

app.get('/', (req, res) => {
  connection.query('SELECT 1 + 1 AS solution', (error, results, fields) => {
    if (error) throw error;
    res.send('The solution is: ' + results[0].solution);
  });
});

app.listen(port, () => {
  console.log(`App running on http://localhost:${port}`);
});

9. まとめ

このセクションでは、DockerfileとDocker Composeを使用してNode.jsアプリケーションとMySQLデータベースをセットアップし、実行する方法を紹介しました。これにより、複数のサービスを簡単に管理・実行できる環境が整いました。次のセクションでは、よくあるトラブルシューティングについて説明します。

10. よくあるトラブルシューティング

Dockerを使用していると、様々なトラブルに遭遇することがあります。このセクションでは、よくあるトラブルとその解決方法について説明します。

7.1 Dockerが起動しない

症状 Docker Desktopが起動しない、または起動中にエラーが発生する。

解決方法

システムの再起動: システムを再起動してDocker Desktopを再試行します。

リソースの調整: Docker Desktopの設定で、CPUやメモリの割り当てを調整します。特に、低スペックのマシンではリソース不足が原因になることがあります。

アンインストールと再インストール: Docker Desktopをアンインストールし、最新バージョンを再インストールします。

7.2 コンテナが起動しない

症状 docker run コマンドを実行してもコンテナが起動しない、またはすぐに停止する。

解決方法

ログの確認: docker logs <コンテナID> コマンドでコンテナのログを確認します。エラーの詳細が記録されている場合があります。

イメージの再ビルド: Dockerfileに変更があった場合、イメージを再ビルドします。docker-compose build または docker build -t <イメージ名> . を使用します。

依存関係の確認: コンテナが依存するサービス(例えばデータベース)が正しく起動しているか確認します。

7.3 ネットワークの問題

症状 コンテナ間で通信ができない、または外部ネットワークに接続できない。

解決方法

ネットワーク設定の確認: Docker Composeファイルで指定したネットワーク設定を確認します。必要なポートが正しくマッピングされているか確認します。

ネットワークの再作成: docker-compose down と docker-compose up を実行してネットワークを再作成します。

ファイアウォールの設定: ホストマシンのファイアウォール設定が通信をブロックしていないか確認します。

7.4 データベース接続エラー

症状 アプリケーションがデータベースに接続できない。

解決方法

環境変数の確認: docker-compose.yml で設定したデータベースの環境変数(ユーザー名、パスワード、ホスト名など)が正しいか確認します。

データベースの準備: データベースが初期化されているか、必要なテーブルやデータが存在するか確認します。

データベースのログ確認: docker-compose logs db コマンドでデータベースのログを確認し、エラーが発生していないか確認します。

7.5 ストレージの問題

症状 コンテナ内でファイルが保存されない、またはデータが失われる。

解決方法

ボリュームの確認: Docker Composeファイルで指定したボリュームが正しくマウントされているか確認します。

パーミッションの確認: コンテナ内のディレクトリやファイルのパーミッションが正しく設定されているか確認します。

ボリュームの再作成: ボリュームに問題がある場合、ボリュームを削除して再作成します。docker-compose down -v コマンドを使用します。

7.6 パフォーマンスの問題

症状 コンテナのパフォーマンスが低下している。

解決方法

リソースの調整: Docker Desktopの設定で、コンテナに割り当てるCPUやメモリの量を調整します。

コンテナの最適化: Dockerfileを見直し、不要なレイヤーを削除する、軽量なベースイメージを使用するなどの最適化を行います。

ホストのリソース確認: ホストマシンのリソース使用状況を確認し、他のアプリケーションがリソースを消費していないか確認します。

まとめ

Dockerの使用中に発生する一般的なトラブルについて、その原因と解決方法を紹介しました。これらのトラブルシューティングを参考に、問題解決を迅速に行い、快適なDocker開発環境を維持しましょう。

  1. まとめ

Dockerの利点と注意点

Dockerの利点

一貫性: Dockerを使用することで、開発環境と本番環境の間での一貫性が保たれます。これにより、開発者が書いたコードがそのまま本番環境で動作するため、デプロイに伴う問題が減少します。

ポータビリティ: Dockerイメージは、どの環境でも同じように動作するため、異なるシステム間でのアプリケーションの移植が容易です。

効率性: コンテナはホストOSのカーネルを共有するため、仮想マシンと比べて軽量で、起動時間も短いです。

スケーラビリティ: コンテナベースのアーキテクチャは、スケーラビリティが高く、需要に応じて簡単にスケールアウトが可能です。

注意点

セキュリティ: コンテナはホストOSのカーネルを共有するため、セキュリティの観点で仮想マシンほどの隔離性はありません。セキュリティ対策を適切に行うことが重要です。

ストレージ管理: コンテナのストレージは一時的なものとして扱われるため、永続化が必要なデータはボリュームを使用して適切に管理する必要があります。

学習曲線: Dockerやコンテナ技術は、初めて触れる人にとっては学習曲線が高い場合があります。基本からしっかりと学び、ドキュメントを参照しながら進めることが重要です。

今後の学習リソース

Dockerの基本を学んだ後は、さらに深い知識を得るために以下のリソースを活用してください。

公式ドキュメント

Docker公式ドキュメント: Dockerの全機能について詳しく解説されています。最新の情報やベストプラクティスを学ぶことができます。

オンラインチュートリアル

Dockerのチュートリアル: Docker公式が提供するインタラクティブなチュートリアルです。実際に手を動かしながら学べます。

コミュニティとフォーラム

Docker Community: Dockerのコミュニティに参加し、他の開発者と交流することで、実践的な知識を得ることができます。

Stack Overflow: Dockerに関する質問と回答が多数寄せられているため、トラブルシューティングの際に参考になります。

書籍

「Docker入門」(オライリー・ジャパン)

「Docker実践ガイド」(技術評論社)

動画チュートリアル

YouTube - Docker Tutorial for Beginners: YouTubeには多くのDockerチュートリアル動画があり、視覚的に学ぶことができます。

まとめ

Dockerの基本概念からインストール、基本コマンドの使用方法、Dockerfileの作成、Docker Composeによる複数コンテナの管理、実際のアプリケーションのデプロイ方法、トラブルシューティングまでを学びました。Dockerを活用することで、開発環境の構築が効率化され、アプリケーションのデプロイが容易になります。

この講座を通じて得た知識を活かし、さらに実践を積むことで、より高度なDockerの活用ができるようになります。引き続き、公式ドキュメントやコミュニティを活用しながら学習を続けてください。

Discussion