Docker

lang
ja
date
Apr 20, 2025
slug
Notes-02-ja
status
Published
tags
Docker
summary
Develop faster. Run anywhere.
type
Notes

なぜDockerなのか

仮想化への新たなアプローチ。
従来の仮想マシン技術がハードウェアを仮想化し、その上で完全なオペレーティング・システムを実行し、そのシステム上で必要なアプリケーション・プロセスを実行するのに対し、Dockerコンテナ内のアプリケーション・プロセスはホストのカーネル上で直接実行され、コンテナは独自のカーネルを持たず、ハードウェアの仮想化もありません。
Dockerは 、ハードウェアの仮想化や完全なオペレーティング・システムの実行という追加的なオーバーヘッドなしに、システム・リソースをより有効に活用します。
Docker コンテナ・アプリケーションは、完全なオペレーティング・システムを起動する必要なく、ホスト・カーネルから直接実行されるため、数秒から数ミリ秒の起動時間でも可能です。
Dockerの イメージは、カーネルに加えて完全なランタイム環境を提供し、一貫したアプリケーション環境を保証します。
Dockerは 、継続的インテグレーション、継続的デリバリー、デプロイを実現するためにカスタマイズすることができます。
Dockerは 、物理マシン、仮想マシン、パブリック・クラウド、プライベート・クラウド、あるいはラップトップなど、多くのプラットフォーム上で実行でき、その結果は一貫しているため、移行が容易になる。

いくつかの概念

  1. イメージ:イメージはソフトウェアパッケージングのテンプレートと考えることができる。
    1. 機能:イメージは読み取り専用のファイルで、コード、実行環境、依存関係、設定など、アプリケーションの実行に必要なすべてを含んでいる。
  1. コンテナ:コンテナは、イメージに基づいて作成された実行インスタンスである。
    1. 機能:コンテナは、イメージの実行時プロセスと考えることができ、アプリケーションやサービスを実行できる分離された環境である。
      📌
      鏡とコンテナの関係の例:1.シェイクスピアの心の中のハムレットは鏡像のようなものであり、観劇後の観客は自分の心の中にハムレットを持ち、観客の心の中のハムレットはコンテナである。2.Pythonにおけるクラスとインスタンスの関係 クラスはテンプレートであり、インスタンスはクラスの具体的な実装である。
  1. Dockerレジストリは 複数の リポジトリを含むことができ、各リポジトリは複数の タグを含むことができ、各タグは画像に対応する。
    1. 通常、リポジトリには同じソフトウェアの異なるバージョンのイメージが含まれ、タグはそのソフトウェアの異なるバージョンに対応するために使用されることがよくあります。 <リポジトリ名>:<タグ> の形式で、ミラーリングするソフトウェアのバージョンを指定できます。タグを指定しない場合は、 latest がデフォルトのタグとして使用されます。
      特徴:各コンテナは独自のファイルシステム、ネットワーク、プロセス空間を持ち、独立してアプリケーションを実行できる。
notion imagenotion image

Dockerのインストール

Linuxインストールのチュートリアル(公式ドキュメント): https://docs.docker.com/engine/install/ubuntu/

バージョンの選択

Docker DesktopとDocker Engineの選択方法:
  • グラフィカルインターフェースがあるシステム(WindowsやmacOSなど)では、Docker Desktopを使用することをお勧めします。Docker Desktopには、Docker Engine、Docker CLI、Docker Compose、Kubernetes(オプション)、そしてWindowsやmacOSユーザ向けのグラフィカルインターフェースが統合されています。
  • グラフィカル・インターフェースのないシステム(Linux)では、Docker Engineの使用を推奨します;
    • Docker CE(Community Edition):オープンソースで無料!
    • Docker EE(Enterprise Edition、現在はMirantisの一部):有償。

リポジトリのインストール(Ubuntu)

古いパッケージや競合する可能性のあるパッケージのアンインストール

var/lib/docker/に 保存されているイメージ、コンテナ、ボリューム、ネットワークは自動的には削除されません。新規インストールから始め、既存のデータをクリーンアップしたい場合
Docker Engineを完全にアンインストールして、インストールをやり直したい場合

リポジトリ設定

Dockerのインストール

Dockerの検証

インストールパッケージのインストール

ハンズオンでバージョンを確認する

Ubuntuを例にしてみましょう:
  1. https://download.docker.com/linux/ubuntu/ このURLには以下のディレクトリが含まれています:
      • dists/:
        • これはDocker APTリポジトリのコア・ディレクトリで、異なるUbuntuのバージョンとアーキテクチャ用のパッケージが含まれています。
        • dists/ ディレクトリに入ると、 bionic/(Ubuntu 18.04)、focal/(Ubuntu 20.04)、jammy/(Ubuntu 22.04)など、さまざまなUbuntuディストリビューションの名前が表示されます。
        • 各ディストリビューションのディレクトリをさらに進むと、 stable/、test/などの サブディレクトリがあり、対応するバージョンのDocker Engineとその関連コンポーネントのインストールパッケージが含まれています。
      • gpg
        • Docker APTリポジトリのGPGキーが含まれており、このリポジトリからダウンロードされたパッケージの信頼性と完全性を検証するために使用されます。Dockerをインストールする際、通常このGPGキーをシステムに追加する必要がある。
  1. 対応するシステム(私のはjammy/(Ubuntu 22.04))に行き、https://download.docker.com/linux/ubuntu/dists/jammy/ その後、ディレクトリには以下のものが含まれる。
      • stable/、test/、nightly/。
        • これらはDockerの異なるリリース・チャンネルです。各ディレクトリには異なるタイプのDockerパッケージが含まれています。
          • stable/: 本番環境に適した安定版のDockerパッケージが含まれています。
          • test/: ベータ版のDockerパッケージが含まれており、開発者が新機能をリリースする前にテストするために使用します。
          • nightly/: 最新の機能とアップデートを提供するデイリービルドが含まれていますが、不安定な場合があり、実験とテストにのみ使用されます。
        • 通常は、完全にテスト・検証されている stable/ バージョンを推奨します。
      • ReleaseInReleaseRelease.gpg
        • Release: ディストリビューションで利用可能なパッケージを説明するメタデータファイルで、各パッケージのバージョン情報や依存関係などが含まれています。
        • InReleaseRelease ファイルの内容とそのGPG署名が含まれており、ファイルの完全性と真正性を検証する方法を提供します。
        • Release.gpgRelease ファイルとは別のGPG署名で、ファイルの完全性と出所を確認するために使用されます。
      • pool/
        • このディレクトリには全てのDockerパッケージファイルの物理的な場所があり、パッケージ名で整理されています。
        • これには、 docker-ce(Docker Community Edition)、containerd.io(コンテナランタイム)などが含まれます。
        • これらの .deb ファイルは、インターネットに接続せずにオフラインでインストールするために直接ダウンロードすることができます。
  1. pool/ディレクトリに移動し、安定版のstable/を選択し、システムアーキテクチャの種類を選択します。
      • amd64/: 64 ビットアーキテクチャ (x86_64 アーキテクチャとしても知られる) 用パッケージファイル。
      • arm64/: ARM アーキテクチャ用パッケージファイル。
      • s390x/: IBM System zアーキテクチャ用パッケージ。
  1. 私のUbuntuはMac M1コンピューターにインストールされているので、arm64/アーキテクチャを選び、以下の種類のファイルを入れた:
      • containerd.io (必須): コンテナランタイム。Dockerエンジンが依存するコンポーネント。
      • docker-ce (必須): Docker Community Editionのコアパッケージで、Dockerエンジン。
      • docker-ce-cli (必須): Dockerコマンドラインツール。
      • docker-compose-plugin(オプション - 推奨) :: マルチコンテナ管理用のプラグイン。
      • docker-buildx-plugin ( オプション - 推奨) ::マルチプラットフォームビルド用のプラグイン。
      • docker-ce-rootless-extras ( オプション): Dockerの ルートレスモードでの 実行をサポートするプラグイン。

正しいバージョンの選択

  • 推奨バージョン: 20.10...
  • 互換性: 他のパッケージと互換性のあるバージョンを選びましょう。例えば、docker-cedocker-ce-clicontainerd.ioは 通常バージョン互換性が必要です。 docker-ce の最新バージョンを選択した場合は、 docker-ce-clicontainerd.io も同じバージョンを選択してください。

インストールの開始 (Ubuntu)

必要な .deb パッケージをダウンロードします。
依存パッケージのインストール: パッケージの依存関係が正しく処理されるように、ダウンロードしたすべての .deb ファイルを一緒にインストールします:
インストール中に依存関係の問題が発生した場合は、以下のコマンドで解決できます:
その後、 dpkg コマンドを再実行します:
Dockerの起動とインストールの確認

問題が発生した場合(Ubuntu)

  1. テストイメージを実行する:sudo docker run hello-world
  1. エラーが報告されました:
  1. 理由: ネットワークがdockerのイメージソースにアクセスできません。
  1. オプション 1: 国内のミラーソースを設定する
      • 新しい設定ファイルを変更または追加する:vim /etc/docker/daemon.json
      • サービスを再起動する:service docker restart
      • ミラーソースを確認する:docker info|grep Mirrors -A 5 -- "Mirrors " 行にマッチし、マッチした行の後にさらに5行表示する(Aは "After "の意味)。
  1. オプション2:AliCloudの公式サイトにアクセスしてミラーアドレスを申請する。
  1. 結果:アップデート後、まだ動かないことがわかり、ネットで検索した結果、多くのミラーソースがサービス停止中であることを知る(諦める)。

インストール開始(CentOS 7.9)

ここで最新版のdockerインストールパッケージをダウンロードする。
上記のインストールで、GPGバリデーションの問題が発生しました。
  • gpgキーをインポートする:sudo rpm --import gpg
  • gpgキーを検証する:rpm -qa gpg-pubkey*
  • インストール・コマンドを再実行すれば、インストールは成功する。

セットアップの開始

Python環境イメージの作成

イメージ作成手順の詳細は、以下の[イメージ作成]を参照してください。

1、Dockerfileファイルを作成する

2、イメージをビルドする

3、エクスポートとインポート

4、イメージからコンテナを作成

Pythonミラー比較

バージョン名
バージョン例
バージョン サイズ
バージョンの特徴
シナリオ
標準バージョン
python:3.9
~900MB
Debian Buster ベースで、完全な Python 環境と一般的なツール (例: pipsetuptools)を含み、最もフル機能。
開発環境、テスト環境、完全なツールチェインを必要とするシナリオ。
スリムバージョン
python:3.9-slim
~120MB
Debian Buster ベースで、Python の実行に必要な最小限の依存関係のみを含み、 必要でないツールやドキュメントは削除され、サイズが小さくなっています。
本番環境、イメージサイズに敏感なシナリオ。
アルパイン版
python:3.9-alpine
~50MB
Alpine Linuxベースで、サイズは最小ですが、互換性の問題(glibcの欠如など)があるかもしれません。
イメージサイズに非常に敏感で、互換性の調整の可能性があるシナリオ。
バスター版
python:3.9-buster
~900MB
Debian Buster をベースとし、Debian 互換シナリオ用の完全なシステムツールチェインを含む。
Debian との互換性を必要とする開発環境または生産環境。
Bullseye エディション
python:3.9-bullseye
~900MB
Debian Bullseye をベースとし、システムツールチェインが更新された Debian の新バージョンです。
より新しい Debian サポートを必要とするシナリオ。
Windowsservercore
python:3.9-windowsservercore
~4GB
Windows Server Core ベースの Windows コンテナ環境用。
Windows コンテナで Python を実行する必要があるシナリオ。
ナノサーバー
python:3.9-nanoserver
~1GB
Windows Nano Server ベースでサイズが小さく、軽量な Windows コンテナ環境に適しています。

イメージ操作

コンテナ操作

コンテナの作成

イメージを使用して複数のコンテナを作成することができ、各コンテナはイメージの個別の実行インスタンスです。
docker run を 使用して新しいコンテナを作成・起動すると、指定したすべてのパラメータ(ポートマッピング、ボリュームマウント、環境変数など)がそのコンテナの設定に保存されます。 docker start コマンドでコンテナを起動する際に、これらのパラメータを再度指定する必要はない。
docker runを 使用してコンテナを作成する場合、Dockerがバックグラウンドで実行する標準的なアクションには以下が含まれる:
  • 指定したイメージがローカルに存在するかどうかをチェックし、存在しない場合はレジストリからダウンロードする。
  • イメージを使用したコンテナの作成と起動
  • ファイルシステムを割り当て、読み取り専用のイメージレイヤーの上に読み取り専用のレイヤーをマウントする。
  • ホスト・コンピュータに設定されているブリッジ・インターフェースからコンテナに仮想インターフェースをブリッジする。
  • アドレスプールからコンテナ用に IP アドレスを構成する。
  • ユーザー指定のアプリケーションを実行する。
  • 実行後、コンテナを終了する。
📌
イメージを実行してコンテナを生成した後、コンテナの中身を操作する方法は通常 2 つある:
  • コンテナがアクセス・ポートを開き、ブラウザからアクセスできるようにする。
  • コンテナは、コマンドライン操作のためにコンテナ内でbash shllを開く。

コンテナのステータスとスタート/ストップ

パッケージング転送

ファイルベース

オンライン

Dockerストレージ

データはコンテナ内に保存される:
  • データの変更はまずコンテナ内部で行う必要があり、操作が面倒
  • コンテナがクラッシュするとデータが失われる
一般的にストレージの設定ファイルやデータの操作に使われる

ディレクトリのマウント

ボリュームマッピング

ボリュームマッピングは、実際にはマウントの一種であるが、マウントが必要なコンテナ内のフォルダの内容を、サーバ上のボリュームにマウントする際に自動的に同期する。
Dockerは、ボリュームマッピングの初回使用時にボリュームが空でコンテナディレクトリにデータがある場合にのみ、コンテナディレクトリからボリュームにデータをコピーします。その後、ボリューム内のデータは自己完結し、どのコンテナ上にマウントされても初期ディレクトリによって上書きされることはありません。

Dockerネットワーキング

コンテナ間のネットワークデータアクセス
各コンテナは起動時に自動的にdockerの自動ネットワークdocker0に参加する(サーバーのip設定でdocker0カードを確認できる)ので、これらのコンテナ間でローカルエリアネットワークが形成され、コンテナIP+コンテナポートを使って互いにアクセスできる。
しかし、docker0はコンテナホスト名をサポートしていないので、コンテナホスト名をサポートするカスタムネットワークを作成し、そこにコンテナを追加する必要があります(コンテナ名を安定したアクセスアドレスとしてホスト名として使用できるようにするため)。

Docker Compose。

より多くのプロジェクト・サービスを持つジョブのためのコンテナ・バッチ管理ツール;

コマンドスタート

ブログ・プロジェクトを例にとると

Composeの起動

Composeは主にose.yamlファイルの操作によってバッチ処理を実現する

Compose.yaml設定ファイルの記述

構文の指定は公式ドキュメントを参照
Compose.yamlファイルの設定

Composeバッチ起動

notion imagenotion image

イメージの作成

ドッカーファイル

docker builderはdockerfileファイルの内容を使ってイメージを作成するので、イメージを作成するために必要な主なことはDockerfileを書くことです。
通常、Dockerfileの 最初の行は FROM ディレクティブで、イメージのベース環境を定義します。しかし、あなたのマシンがインターネットに接続できない場合、公式Docker Hubやその他のオンラインリポジトリから直接ベースイメージを引き出すことはできません。この問題を回避する方法はいくつかあります:
方法1:既存のローカルベースイメージを使う
方法2:ベースイメージをオフラインで取得する
  • ネットワークに接続されたマシンでイメージを取り出します。
  • ネットワーク接続されたマシンで、イメージを .tar ファイルとして保存する。
  • イメージをオフラインのマシンに転送する。
  • オフラインのマシンでイメージをロードする
方法3:利用可能なイメージソースを設定する。AliCloudホスティングについてはこちらを参照。
Dockerfile内のコマンドは順次実行され、一部のコマンドは前のコマンドの結果に依存するため、順番に記述する必要があります。
notion imagenotion image
📌
Dockerfile設定リファレンス

イメージのビルド

ハンズオン

公式フロントエンドの例:スタートガイド
  1. 事例プロジェクトのクローン
  1. プロジェクトイメージの作成
    1. Dockerfileの作成
    2. ファイルへのコンテンツの追加
      1. 内容の説明
        • # syntax=docker/dockerfile:1: docker syntaxのバージョンを指定します。
        • FROM node:18-alpine: ベースイメージnode:18-alpineをベースにする。
        • WORKDIR /app: コンテナ内の作業ディレクトリを/app に設定する。
        • COPY . .: カレントディレクトリからコンテナの作業ディレクトリ /app にすべてのファイルとフォルダをコピーする。
        • RUN yarn install --production: 作業ディレクトリで、package.json ファイルに従って依存関係をインストールするために、yarn install --production を実行します。
        • CMD ["node", "src/index.js"]:コンテナ起動時に実行するデフォルトコマンドを指定し、Node.jsを実行し、 src/index.js ファイルを実行する。
        • EXPOSE 3000:コンテナ内のポート3000を外部ネットワークに公開する。
    3. ターミナルでイメージを作成する
      1. コマンドの解釈
        • ベースミラーが指定されているので、いくつかの依存ミラーレイヤーをダウンロードすることができます。
        • tは ミラーの名前とタグの組み合わせを指定し、デフォルトのタグは "latest "です。
        • . Dockerfileファイルをカレントディレクトリで探すようにDockerに指示します。
        📌
        作成時にプラットフォームを指定する。
  1. イメージを実行してコンテナを作成する
    1. コマンドの解釈
      • docker run: Dockerコンテナを実行するコマンド。
      • dp 127.0.0.1:3000:3000: コンテナの実行オプションを設定する部分。
        • dは 、コンテナをバックグラウンド(デタッチ)モードで実行することを意味する。
        • p 127.0.0.1:3000:3000 は、ホスト上の 127.0.0.1 のポート 3000 をコンテナのポート 3000 にマッピングする。
      • getting-started: 実行するDockerイメージの名前を指定します。
      実行結果を表示する:http://localhost:3000/
      📌
      コンテナの実行を停止する。
  1. プロジェクトの内容を更新し、イメージを再作成する。
    1. プロジェクト・ファイルを修正する:src/static/js/app.js56行目
    2. イメージを再構築し、コンテナをインスタンス化する。
      1. 📌
        古いコンテナを削除する。
  1. DockerHubでイメージを共有する
    1. DockerHub上に、getting-startedプロジェクトフォルダと同じ名前でリポジトリを作成し、リポジトリ名の前にNamespaceの内容を覚えておく;
    2. Namespace/getting-startedという付箋を付けて、ローカルイメージのタグを追加します;
    3. 新しく追加したタグ名を使って、イメージをDockerHubリポジトリにプッシュします。
公式Pythonケース:Pythonアプリケーションのコンテナ化
  1. ケースプロジェクトをクローンする
  1. Dockerを初期化する
    1. いくつかの新しいファイルが追加されます
  1. コンテナをビルドして起動する(プロジェクトフォルダで実行する)
    1. コマンドの解釈
      • dock er compose upを実行することで、 docker-compose.yml ファイルで定義されたコンテナ群を起動・管理できる。
      • このコマンドは、カレントディレクトリにある docker-compose.yml ファイルを読み込み、そこで定義されたサービス設定に基づいてコンテナを起動する。イメージが存在しないか更新がある場合は、必要なイメージを構築してから起動する。
      • up はコンテナの起動を意味する。
      • -buildは 、起動前にイメージを構築する。
Pythonケース1 - 集中学習(三目並べ)
  1. まるばつロジックのコード - Liu Jianpingより
  1. ファイルを空のフォルダに入れ、pipreqsでプロジェクトの依存関係を生成します。
  1. 以下の内容で新しいDockerfileファイルを作成します。
    1. python:3.11.3を直接使用すると、900M以上のサイズになります。
  1. イメージをビルドする。
  1. イメージを実行してコンテナを生成する
📌
プログラムはモデルを10万回トレーニングし、プロンプトボックスが表示され、マシンと対戦することができる。
notion imagenotion image

推奨リンク

  1. 公式ドキュメント
  1. DockerHub
  1. Docker I 初歩から実践まで
  1. Dockerを使ってJupyterをインストール・設定し、RとPythonの環境を構成する。
  1. docker desktop ubuntu image_docker-based python データマイニング環境 (Jupyter notebook))
 
 
 
对于本文内容有任何疑问, 可与我联系.