Dockerコアテクノロジーの原理と応用(上)

1つは、Dockerの概要です

Dockerは、アプリケーションを開発、実行、デプロイするためのオープンな管理プラットフォームです。開発者はdockerを使用してアプリケーションを開発および実行でき、運用および保守担当者はdockerを使用してアプリケーションをデプロイおよび管理できます。
ここに画像の説明を挿入
Dockerは、コンテナーと呼ばれる完全に分離された環境でアプリケーションをパッケージ化して実行する機能を提供します。コンテナの分離とセキュリティにより、複数の分離されたコンテナを、互いに干渉することなく、ホスト(ホスト)で同時に実行できます。Dockerは、コンテナーのライフサイクルを管理するためのツールとコンポーネント(Dockerクライアント、Dockerデーモンなど)を提供しています。

  1. コンテナを使用して、アプリケーションとそのサポートコンポーネントを開発します。
  2. コンテナは、アプリケーションを配布およびテストするためのユニットになります。
  3. 準備ができたら、アプリケーションをコンテナーまたは調整サービスとして実稼働環境にデプロイします。これは、本番環境がローカルデータセンター、クラウドプロバイダー、またはその2つのハイブリッドのいずれであっても同じです。

Dockerを使用する理由

dockerを使用すると、アプリケーションをインフラストラクチャから分離できるため、ソフトウェアを迅速に提供できます。

  1. dockerを使用すると、アプリケーションのようにインフラストラクチャを管理できます。
  2. dockerの方法を使用してコードを迅速に転送、テスト、デプロイすることで、コードを記述してから本番環境で実行するまでの遅延を大幅に減らすことができます。といった:
    • 開発者はローカルでコードを記述し、Dockerの同僚を使用して共同作業を共有および達成できます。
    • dockerを使用してプログラムを開発および完了すると、アプリケーションで自動テストと手動テストを直接実行できます。
    • 開発者がエラーやバグを見つけた場合、開発環境で直接修正し、テストと検証のためにテスト環境にすばやく再デプロイできます。
    • Dockerの開発が完了した後、配信が完了すると、Dockerが直接配信されます。つまり、配信が完了します。パッチまたはアップデートが将来提供される場合、実行するにはビルド環境にプッシュする必要があります。これも同様に簡単です。
  3. dockerが解決する主な問題:
    • プログラムの動作環境の一貫性を確保します。
    • 開発環境と本番環境の構成の複雑さとコストを削減します。
    • プログラムの迅速な展開と配布を実現します。

Dockerの全体的な構造を理解する

Docker Engineは、次のコンポーネントを含むクライアントサーバー(C / S)アプリケーションです。サーバー-長時間実行されるデーモン(Dockerデーモン)。REST API — Docker Daemonと通信し、操作を実行するように指示するために使用される一連のインターフェース。クライアント-コマンドラインインターフェイスCLI(コマンドラインインターフェイス)。
ここに画像の説明を挿入
CLIは、dockerコマンドを使用してDockerデーモンを直接制御し、RESTAPIを介して操作を実行します。Docker Daemonは、Dockerオブジェクト(イメージ、コンテナー、ネットワーク、データボリューム)の作成と管理を担当します
ここに画像の説明を挿入
。Dockerクライアント:ユーザーがdockerを操作するための最も重要な方法です。ターミナルでdockerコマンドを入力すると、対応するコマンドがサーバーに対応する効果をもたらし、結果がクライアントに返されます。Docker Clientは、ローカルサーバーへの接続に加えて、DOCKER_HOSTを変更または指定することにより、リモートサーバーに接続します。
Dockerサーバー:Dockerデーモンは実際にはDockerのサーバーです。Docker APIリクエスト(Dockerクライアントなど)をリッスンし、イメージ、コンテナー、ネットワーク、データボリュームなどのDockerオブジェクト(Dockerオブジェクト)を管理します。
Dockerレジストリ:一般にDockerウェアハウスと呼ばれ、イメージの保存専用のクラウドサービス環境です。Docker Hubは、コードファイルを保存するためのGithubと同様に、画像を保存するためのパブリックな場所です。同様に、Githubと同様のプライベートウェアハウスを構築できます。
Dockerオブジェクト

  1. 画像:docker実行可能ファイル。アプリケーションの実行に必要なすべてのコードコンテンツ、依存ライブラリ、環境変数、および構成ファイルが含まれています。
  2. コンテナ:イメージが実行された後のインスタンス。
  3. ネットワーク:ホストモードやブリッジモードなど、外部から、またはコンテナ間で相互にアクセスする方法のネットワーク方式。
  4. データボリューム:ストレージモードは、仮想マシンとホスト間の共有ファイルディレクトリと同様に、コンテナとホスト間、およびコンテナとコンテナ間で共有されます。

Dockerの基盤となるテクノロジーを理解する

  1. dockerはGo言語で実装されています。
  2. Dockerは、Linuxカーネルのいくつかの機能を使用して、機能を実現し
    ます。Linux名前空間の使用、Linuxコントロールグループ(コントロールグループ)の使用、およびLinuxのユニオンファイルシステム(ユニオンファイルシステム)の使用です。これは、dockerがLinuxでのみ実行できることを意味します。WindowsとMacOSでdockerを実行することは、実際には仮想化テクノロジーを使用し、Linux仮想マシンで実行するdockerプログラムです。
  3. コンテナ形式(コンテナ形式)Docker Engineは、名前空間、cgroup、UnionFSを組み合わせたものです。パッケージはコンテナ形式(コンテナ形式)です。Dockerは、このパッケージ内の名前空間、cgroup、およびUnionFSを管理および制御することにより、コンテナーの作成とライフサイクル管理を実現します。多くのコンテナー形式があり、現在dockerで使用されているコンテナー形式はlibcontainerと呼ばれます。
  4. 名前空間:Dockerコンテナーにオペレーティングシステムレベルの分離を提供します。プロセスIDの分離:各コンテナーで実行されている最初のプロセスの場合、プロセスIDは常に1から始まります。ネットワークの分離:コンテナのネットワークは分離され、ホストまたは他のコンテナのネットワークから分離されます。これは2つのネットワークに相当します。プロセス間通信の分離:コンテナ内のプロセスとホストまたは他のコンテナ内のプロセスは相互に見えないため、通信はネットワークに依存する必要があります。ファイルシステムのマウントの分離:コンテナには、独自の個別の作業ディレクトリがあります。カーネルとシステムのバージョン番号の分離:コンテナーがカーネルのバージョン番号またはシステムのバージョン番号を表示する場合、それはコンテナーであり、ホストではありません。
  5. コントロールグループ(コントロールグループ-cgroups):Dockerコンテナーにハードウェアレベルの分離を提供し、コントロールグループはアプリケーションによって使用されるハードウェアリソースを制御できます。この性質に基づいて、コントロールグループは、Dockerエンジンがコンテナーで使用するハードウェアリソースを共有し、制約と制限を課すのを支援します。コンテナが使用するメモリサイズの制御など。
  6. Union File Systems(UnionFS):レイヤードシンキングを使用してイメージとコンテナーを管理します。

2つ、dockerバージョンとインストールの概要

Docker-CE和Docker-EE

Docker-CEは、コミュニティによって維持され、技術サポートを提供するdockerコミュニティエディションを指します。これは無料バージョンであり、個々の開発者や小規模なチームに適しています。Docker-EEは、Dockerエンタープライズバージョンを指します。これは有料バージョンです。アフターセールスチームとテクニカルチームがテクニカルサポートを提供します。エンタープライズ開発チームとITチーム向けに設計されています。Docker-CEと比較して、いくつかの追加機能が追加され、さらに重要なことに、より安全な保証が提供されます。また、dockerのリリースバージョンは、安定バージョンとエッジバージョンに分かれています。前者は四半期ごとにリリースされる安定バージョン(低速リリース)であり、後者は毎月リリースされるエッジバージョン(高速リリース)です。通常の状況では、Docker-CEは私たちのニーズを満たすのに十分です。以下の調査は、主にDocker-CEを対象としています。

LinuxCentos7環境にDockerをインストールする

インストール環境:Centos 7
インストール条件:dockerofficialには3.8以上、推奨される3.10以上が必要
ここに画像の説明を挿入
Dockerバージョン:docker EEエンタープライズバージョン、docker CEコミュニティバージョン
ファイアウォールをオフにします:systemctl stop Firewalld.service and set vi / etc / selinux / configを使用して
ここに画像の説明を挿入
DockerCeコミュニティバージョンインストールします。

  1. wgetコマンドのインストール:yum install -y wget
  2. Alibaba Clouddockerコミュニティバージョンのyumソースをダウンロードする
     cd /etc/yum.repos.d/
     wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  3. dockerインストールパッケージを表示します:yum list | grep docker
  4. Docker Ceコミュニティバージョンをインストールします:yum install -y docker-ce.x86_64
  5. 起動を設定します:systemctl enable docker
  6. 更新xfsprogs:yum -y update xfsprogs
  7. 启PXdocker:systemctl start docker
  8. バージョンを表示:dockerバージョン
  9. 詳細情報を表示する:docker info

Docker CoreFoundation用にAlibabaCloud ImageAccelerationを構成する

  1. ここをクリックしてAliCloudにサインインし、現在のページのアクセラレータアドレスをコピーします。
  2. 操作ドキュメントでCentOS構成ミラーアクセラレータを選択します。操作手順は次のとおりです。
    sudo mkdir -p /etc/docker
    vi /etc/docker/daemon.json ⇒ {
          
          
    	"registry-mirrors": ["自己的加速器地址"]}
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

3.Dockerコアテクノロジーのミラー

このイメージはdocker実行可能ファイルであり、アプリケーションの実行に必要なすべてのコードコンテンツ、依存ライブラリ、環境変数、および構成ファイルが含まれています。ミラーリングにより、1つ以上のコンテナーを作成できます。

画像管理

  1. コマンドdockercommand --helpを使用して、指定したdockerコマンドの使用法をより深く理解できます。次に例を示します。ミラー検索コマンドの特定の使用法を表示します。dockersearch--help
  2. 検索ミラー:docker search mysql
  3. ミラーの検索とフィルタリングは公式です:docker search --filter“ is-official = true” centos
  4. ミラーを検索し、次よりも大きい星の数をフィルタリングします。dockersearch --filter stars = 10 centos
  5. 検索ミラーの結果の最初の5つだけが表示されます:docker search --filter stars = 10 centos --limit 5
  6. ローカルイメージを表示する:docker images / docker image ls例:docker images ubuntu:latest
  7. centos7ミラーをダウンロード:docker pull centos:7
  8. イメージの削除:docker rmi / docker image rm、-f /-強制的に削除します。ローカルのcentos7ミラーを削除します:docker rmi centos:7。複数のミラーを同時に削除します:docker rmi f643 8652
  9. イメージ保存バックアップdocker保存、機能:1つ以上のローカルイメージをローカルtarファイルにパッケージ化して保存します(STDOUTに出力)。-o、-output stringは、書き込むファイル名とパスを指定します。dockersave-o linux_images.tar centos
  10. イメージバックアップをdockerloadにインポートします。機能:saveコマンドでパッケージ化されたイメージをローカルイメージライブラリにインポートします。docker load -i linux_images.tar
  11. ミラーの名前変更dockerタグ、機能:ローカルミラーのNAMEとTAGの名前を変更し、新しい名前付きミラーを作成します。docker tag centos:7 mycentos:1
  12. ミラーの詳細Dockerイメージの検査/ Dockerの検査。例:docker image inspect centos:7、docker image inspect -f“ { {json .Id}}” centos:7、docker image inspect -f“ { {json .Created}}” centos:7。-f、-formatstring特定のGo言語のフォーマットフォーマットを使用して結果を出力します
  13. ミラー履歴情報Docker履歴、機能:ローカルミラーの履歴(履歴階層)情報を表示します。例:docker history centos:7、docker history centos:7 -H = False

ここに画像の説明を挿入

第四に、Dockerのコアテクノロジーのコンテナ

コンテナとは何ですか?コンテナー(コンテナー):コンテナーは、アプリケーションをほぼどこでも同じように実行できるようにする、軽量でポータブルなパッケージングテクノロジーです。dockerがイメージファイルを実行すると、結果のオブジェクトはコンテナーになります。コンテナは、実行中のイメージのインスタンスに相当します。コンテナには特定のライフサイクルがあります。さらに、docker psLinuxでpsコマンドを使用して実行中のプロセスを表示するので、コンテナーをチェックするコマンドを支援できます

コンテナと仮想マシンの類似点:

  1. コンテナと仮想マシンは、物理ハードウェアリソースの使用を共有します。
  2. コンテナと仮想マシンのライフサイクルは似ています(作成、実行、一時停止、シャットダウンなど)。
  3. redis、mysql、nginxなどのさまざまなアプリケーションをコンテナまたは仮想マシンにインストールできます。つまり、コンテナ内の操作は、仮想マシン(オペレーティングシステム)内の操作と同じです。
  4. 仮想マシンと同様に、コンテナが作成されると、ホストに保存されます。Linuxは/ var / lib / docker / containersの下にあります。

コンテナと仮想マシンの違い:

  1. 仮想マシンの作成、起動、およびシャットダウンは、完全なオペレーティングシステムに基づいています。仮想マシンは完全なオペレーティングシステムです。コンテナは、基本的に一連のプロセスの組み合わせであるホストマシンのカーネル上で直接実行されます。
  2. コンテナは軽量で、仮想マシンは重量があります。まず、コンテナーは管理するために追加のリソースを必要とせず(ハイパーバイザーなし、ゲストOSは必要ありません)、仮想マシンはより多くのパフォーマンスを消費します。次に、コンテナーの作成、開始、またはクローズは、プロセスの作成、開始、またはクローズと同じくらい簡単です。ただし、オペレーティングシステムの作成、起動、シャットダウンはそれほど便利ではありません。したがって、特定のハードウェアでより多くのコンテナーを実行でき、Dockerを仮想マシンで直接実行することもできます。
    ここに画像の説明を挿入
    注:コンテナーは仮想マシンではありませんが、多くの類似点があります

仮想マシン
ここに画像の説明を挿入
のライフサイクル:コンテナーのライフサイクル:
ここに画像の説明を挿入

コンテナライフサイクル管理

(1)すべてのローカルコンテナーを表示:docker ps -a
(2)ローカルで実行されているコンテナーを表示:docker ps
(3)コンテナー作成docker create:機能:イメージを使用して、作成済み状態で開始するコンテナーを作成します。コマンド形式:

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
命令参数(OPTIONS):查看更多
-t, --tty  分配一个伪TTY,也就是分配虚拟终端
-i, --interactive 即使没有连接,也要保持STDIN打开
--name  为容器起名,如果没有指定将会随机产生一个名称
命令参数 (COMMAND\ARG):COMMAND 表示容器启动后,需要在容器中执行的命令,如 ps、ls 等命令
ARG 表示执行 COMMAND 时需要提供的一些参数,如 ps 命令的 aux、ls 命令的 -a 等等。

コマンドのデモンストレーション:
ここに画像の説明を挿入
(4)コンテナー削除docker rm CONTAINER_ID / CONTAINER_NAME、1つ以上のコンテナーを削除します

-f, --force  强行删除容器(会使用 SIGKILL信号) 
-v, --volumes  同时删除绑定在容器上的数据卷	

コマンドのデモンストレーション:
ここに画像の説明を挿入
(5)コンテナーはdocker startを開始します。これは、作成済みまたは閉じた状態で1つ以上のコンテナーを開始するために使用されます。コマンド形式:

docker start [OPTIONS] CONTAINER [CONTAINER...]
命令参数(OPTIONS):
-a, --attach		将当前 shell 的 STDOUT/STDERR 连接到容器上
-i, --interactive	将当前 shell 的 STDIN 连接到容器上	

コマンドデモンストレーション1:
ここに画像の説明を挿入
コマンドデモンストレーション2:
ここに画像の説明を挿入
(6)コンテナーの作成とDocker実行の開始、機能:イメージを使用してコンテナーを作成および開始します。コマンド形式:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 命令参数(OPTIONS):查看更多
-t, --tty:分配一个伪TTY,也就是分配虚拟终端
-i, --interactive:即使没有连接,也要保持 STDIN 打开
--name:为容器起名,如果没有指定将会随机产生一个名称
-d, --detach:在后台运行容器并打印出容器 ID
--rm:当容器退出运行后,自动删除容器
命令参数 (COMMAND\ARG):
COMMAND 表示容器启动后,需要在容器中执行的命令,如 ps、ls 等命令
ARG 表示执行 COMMAND 时需要提供的一些参数,如 ps 命令的 aux、ls 命令的 -a 等等

コマンドのデモンストレーション:
ここに画像の説明を挿入
dockerrunはdockercreate + dockerstartと同等です-フォアグラウンドモード
dockerrun -dはdockercreate + docker startバックグラウンドモードと同等です
(7)コンテナーはdocker stopを閉じます、機能:一時停止状態で1つ以上を閉じますまたは実行状態コンテナ、コマンド形式:

docker stop [OPTIONS] CONTAINER [CONTAINER...]
命令参数(OPTIONS):
-t, --time int 关闭前,等待的时间,单位秒(默认10s)	

コマンドのデモンストレーション:
ここに画像の説明を挿入
すべてのコンテナーを一度に停止します:docker stop $(docker ps -a -q)
(8)コンテナーはdocker killを終了します。機能:一時停止状態または実行状態の1つ以上のコンテナーを強制的にシャットダウンします。コマンド形式:

docker kill [OPTIONS] CONTAINER [CONTAINER...]
命令参数(OPTIONS):
-s, --signal string   	指定发送给容器的关闭信号 (默认 KILL 信号)

コマンドのデモンストレーション:
ここに画像の説明を挿入
前提条件の知識ポイント:Linuxプロセスを終了するための2つのシグナルは、SIGTERMとSIGKILLです。SIGKILLシグナル:プロセスシグナルを無条件に終了します。プロセスがこのシグナルを受信すると、クリーンアップやステージングを行わずにすぐに終了します。このシグナルは、無視、処理、およびブロックすることはできません。システム管理者がプロセスを強制終了する方法を提供します。SIGTERMシグナル:killコマンドによって生成できるプログラム終了シグナル。SIGKILLとは異なり、SIGTERMシグナルはブロックして終了できるため、プログラムは作業を保存したり、終了する前に一時ファイルをクリーンアップしたりできます。dockerstopとdockerkillの違い:

  1. docker stopは、最初にSIGTERMシグナルをプロセスに送信し、プロセスにシャットダウンすることを通知します。-tで指定された待機時間が経過すると、SIGKILLシグナルがすぐに送信され、コンテナーが直接閉じられます。
  2. docker killは、SIGKILLシグナルを直接送信して、コンテナーをシャットダウンします。ただし、-sパラメータを介して送信される信号を変更することもできます。

したがって、docker stopの待機プロセスで、docker stopの実行が終了すると、最終的にコンテナーが閉じられないことがわかります。Dockerの強制終了はほぼ即座に発生し、元に戻すことはできません。さらに、dockerデーモンの再起動、コンテナーの内部プロセスの操作など、コンテナーがシャットダウンされる原因となる可能性のあるいくつかの異常な理由があります。

(9)コンテナー一時停止ドッカー一時停止、機能:1つ以上のコンテナーを実行状態で一時停止します。コンテナー一時停止ドッカー一時停止解除、機能:一時停止状態の1つ以上のコンテナーをキャンセルし、実行を再開します。コマンドは次のように示されます。
ここに画像の説明を挿入
(10)コンテナー再始動docker restart、機能:1つ以上のコンテナーを実行中、一時停止、クローズ、または新しく作成された状態で再始動します。このコマンドは、停止コマンドと開始コマンドの組み合わせと同等です。
(11)コンテナーの詳細情報を表示します:docker inspect CONTAINER_ID / CONTAINER_NAME
(12)コンテナーのログ情報を表示します:dockerログ、コンテナーログはコンテナーのメインプロセスの出力を記録しますSTDOUT \ STDERR
(13)変更コンテナーの名前:docker rename CONTAINER NEW_NAME
(14)コンテナー接続docker attach、機能:現在の端末のSTDIN、STDOUT、およびSTDERRを実行中のコンテナーのメインプロセスにバインドして、接続を実現します。
ここに画像の説明を挿入
(15)コンテナーで新しいコマンドdocker execを実行して、コンテナーに入ります。dockerexec -it 0ad5d7b2c3a4 / bin / bash

ここに画像の説明を挿入

コンテナのファイルコピーとマウント

  1. ホストからコンテナーにコピー:dockercpホストローカルパスコンテナー名/ ID:コンテナーパスdocker cp /root/123.txt kind_cerf:/ home /
  2. コンテナーからホストへのコピー:dockercpコンテナー名/ ID:コンテナーパスホストローカルパスdocker cp kind_cerf:/home/456.txt / root
  3. ホストフォルダーをコンテナーにマウントします。dockerrun-itd-vホストパス:コンテナーパスミラーID docker run -itd -v / root / xdclass /:/ home centos:7

5.Dockerのコアテクノロジーのコンテナーとイメージ

Dockerコンテナとミラーの関係:
ここに画像の説明を挿入
(1)コンテナはDockerコミットを送信します。機能:コンテナに従って新しいミラーを生成します。コマンド形式:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
命令参数(OPTIONS):
-a, --author string  作者
-c, --change list  为创建的镜像加入 Dockerfile 命令
-m, --message string   提交信息,类似 git commit -m
-p, --pause 提交时暂停容器 (default true)	

コマンドのデモンストレーションは次のとおりです。

docker ps -a
docker run -dti centos:7 bash
docker exec 629b yum install -y net-tools
docker exec 629b ifconfig
docker ps -a
docker commit -m "install net-tools" 629b centos-net:v1.0
docker images
docker run -dti 6ea0 bash
docker exec be8b ifconfig

(2)Container export docker export、function:コンテナの現在のファイルシステムをtarファイルにエクスポートします。dockerexport[OPTIONS] CONTAINER
ここに画像の説明を挿入
-o、-output stringは、書き込むファイルを指定します。デフォルトはSTDOUTです
(3)コンテナーはパッケージ化されています。Dockerインポートのインポート、ミラーを作成するためのtarファイルからのコンテンツのインポート、docker import [オプション]ファイル| URL |-[リポジトリ[:TAG]]、コマンドのデモンストレーション:
ここに画像の説明を挿入
-c、-change list addDockerfileコマンド作成されたミラーに
-m、-message stringインポート時に、送信情報を追加します
(4)イメージのレイヤーイメージのパースペクティブ
ここに画像の説明を挿入

ここに画像の説明を挿入
(5)コンテナーのレイヤーコンテナー
ここに画像の説明を挿入
ここに画像の説明を挿入
のパースペクティブ
ここに画像の説明を挿入
:コンテナー間の基本的な関係および画像:
ここに画像の説明を挿入
コンテナーの操作:
ここに画像の説明を挿入
ここに画像の説明を挿入
要約:
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/xw1680/article/details/113360133