Ubuntu で Docker をインストールおよび設定する方法

DockerBeginner
オンラインで実践に進む

はじめに

このチュートリアルは、Docker イメージの実行と Docker コンテナの管理に関する包括的なガイドを提供します。Docker の基礎を学び、Docker イメージとその用途を探求し、Docker コンテナのプル、管理、および操作の技術を習得します。さらに、このチュートリアルでは、Docker ボリューム、ネットワーク、Compose、Swarm などの高度なコンテナ管理トピックもカバーし、Docker を使用してアプリケーションを効果的にデプロイおよび管理する方法を学ぶことができます。

Docker の基礎

Docker とは何か?

Docker は、アプリケーションのデプロイと開発を革新する強力なコンテナ化技術です。開発者は、アプリケーションとその依存関係をすべて、コンテナと呼ばれる標準化された単位にパッケージ化できます。これにより、さまざまなコンピューティング環境で一貫したパフォーマンスを確保できます。

Docker のコア概念

コンテナ化技術

コンテナ化により、アプリケーションは隔離された環境で実行され、いくつかの重要な利点を提供します。

機能 説明
隔離 各コンテナは独立して実行されます
ポータビリティ Docker をサポートするシステムであれば、コンテナはどのシステムでも実行できます
効率性 従来の仮想マシンと比較して軽量です
graph TD
    A[アプリケーションコード] --> B[Docker コンテナ]
    B --> C[ホストオペレーティングシステム]
    C --> D[インフラストラクチャ]

Docker アーキテクチャ

Docker は、クライアント - サーバーアーキテクチャを採用し、主要なコンポーネントがあります。

  1. Docker デーモン
  2. Docker クライアント
  3. Docker レジストリ
  4. Docker イメージ
  5. Docker コンテナ

Ubuntu 22.04 へのインストール

## パッケージインデックスを更新
sudo apt update

## 依存関係をインストール
sudo apt install apt-transport-https ca-certificates curl software-properties-common

## Docker の公式 GPG キーを追加
curl -fsSL | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

## 安定版リポジトリを設定
echo "deb [arch=$(dpkg --print-architecture)]  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

## Docker エンジンをインストール
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

基本的な Docker コマンド

## Docker のバージョンを確認
docker --version

## イメージをプル
docker pull ubuntu:latest

## イメージの一覧を表示
docker images

## コンテナを実行
docker run -it ubuntu:latest /bin/bash

Docker の主な利点

  • 一貫した開発環境
  • より高速なデプロイ
  • リソース効率
  • スケーラビリティ
  • 簡素化された構成管理

Docker イメージの操作

Docker イメージについて

Docker イメージは、コンテナを作成するために使用される読み取り専用のテンプレートです。アプリケーションを実行するために必要なアプリケーションコード、ランタイム、ライブラリ、システムツールが含まれています。

graph LR
    A[Dockerfile] --> B[Docker イメージ]
    B --> C[Docker コンテナ]

イメージ管理コマンド

コマンド 説明
docker images ローカルイメージの一覧表示
docker pull レジストリからイメージのダウンロード
docker rmi イメージの削除
docker tag バージョン管理のためのイメージのタグ付け

Dockerfile の作成

## ベースイメージ
FROM ubuntu:22.04

## メタデータ
LABEL maintainer="your-email@example.com"

## システムの更新
RUN apt-get update && apt-get install -y \
  python3 \
  pip

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

## アプリケーションファイルのコピー
COPY . /app

## 依存関係のインストール
RUN pip install -r requirements.txt

## ポートの公開
EXPOSE 5000

## アプリケーションの実行
CMD ["python3", "app.py"]

Docker イメージのビルド

## イメージのビルド
docker build -t myapp:v1 .

## 特定のタグでビルド
docker build -t myapp:latest .

## ビルド引数を使用してビルド
docker build --build-arg VERSION=1.0 -t myapp:v1 .

Docker イメージのレイヤー

graph TD
    A[ベースイメージ] --> B[システムの更新]
    B --> C[依存関係のインストール]
    C --> D[アプリケーションコードのコピー]
    D --> E[起動コマンドの定義]

イメージの保存と共有

## Docker Hub にログイン
docker login

## イメージをレジストリにプッシュ
docker push username/myapp:v1

## レジストリからイメージをプル
docker pull username/myapp:v1

最善のプラクティス

  • イメージサイズを最小限にする
  • マルチステージビルドを使用する
  • キャッシュを活用する
  • 不要なパッケージのインストールを避ける

Docker の実践

コンテナのネットワーク

Docker は、コンテナ間の通信のために複数のネットワークモードを提供します。

ネットワークモード 説明
Bridge デフォルトのネットワークモード
Host ホストネットワークへの直接アクセス
None ネットワーク接続なし
## カスタムネットワークの作成
docker network create mynetwork

## 特定のネットワーク上でコンテナを実行
docker run --network=mynetwork ubuntu

Docker Compose

version: "3"
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  database:
    image: postgres
    environment:
      POSTGRES_PASSWORD: secret

コンテナオーケストレーションのワークフロー

graph TD
    A[開発] --> B[コンテナ化]
    B --> C[テスト]
    C --> D[ステージング]
    D --> E[本番デプロイ]

アプリケーションのスケーリング

## サービスのスケーリング
docker-compose up -d --scale web=3

## コンテナリソースの監視
docker stats

本番デプロイ戦略

## ロールアップアップデート
docker service update \
  --image myapp:v2 \
  --update-parallelism 2 \
  --update-delay 10s \
  myservice

コンテナの監視

## コンテナログの表示
docker logs mycontainer

## リアルタイムのリソース使用状況
docker top mycontainer

高度なネットワーク

## オーバーレイネットワークの作成
docker network create \
  -d overlay \
  --subnet 10.0.0.0/24 \
  my_overlay_network

セキュリティ対策

対策 説明
リソース制限 CPU/メモリの制限
読み取り専用ファイルシステム 変更を防止
非ルートユーザー コンテナの権限を削減

まとめ

このチュートリアルを終了すると、Docker イメージの実行方法、Docker コンテナの管理方法、高度なコンテナ管理技術を活用してアプリケーションをより効率的にデプロイおよび管理する方法をしっかりと理解しているはずです。このチュートリアルで得られる知識は、一貫性、スケーラビリティ、移植性といった Docker の利点を、ソフトウェア開発およびデプロイプロセスで活用できるようになります。