Docker入門章の詳細な要約だけで十分です

Docker入門章の詳細な要約だけで十分です

コンピュータ技術は日々変化しており、Docker は国内で急速に発展しています。特に一流インターネット企業では、Docker の使用は非常に一般的であり、一部の企業面接ではプラスポイントにもなっています。信じられないなら、下の写真を見てください。

これは、求人サイトで見たJava開発エンジニアの募集要項です。要件の 1 つは、Docker に精通していることです。これは、迅速な就職にプラスになります。これは、インターネット企業にとって Docker に精通することがいかに重要であるかを示しています。

すでに市場には優れた Docker チュートリアルが数多く存在しますが、多くの原則は初心者にとってまだ理解しにくく、明確に説明されていないと感じています (私自身もかなり混乱しています)。初心者が回り道をしなくて済むように、私の学習経験と CTF の観点に基づいてこの一連のチュートリアルを書き、誰もが Docker を理解して習得できるようにします。

Dockerとは何ですか?

ここまで述べてきましたが、Docker とは一体何でしょうか? Docker を理解する前に、まずコンテナと仮想マシンという 2 つの概念を区別する必要があります。

多くの読者は仮想マシンを使用したことがあるかもしれませんが、コンテナの概念にはあまり馴染みがないかもしれません。 VMware や VisualBox など、私たちが使用する従来の仮想マシンでは、ハードウェアを含むマシン全体をシミュレートする必要があります。

各仮想マシンには独自のオペレーティング システムが必要です。仮想マシンがオンになると、事前に割り当てられたすべてのリソースが使用されるようになります。

各仮想マシンには、アプリケーション、必要なバイナリとライブラリ、完全なユーザー オペレーティング システムが含まれています。

コンテナ テクノロジーは、ハードウェア リソースとオペレーティング システムをホスト マシンと共有し、リソースの動的な割り当てを可能にします。

コンテナにはアプリケーションとそのすべての依存関係が含まれますが、カーネルは他のコンテナと共有されます。コンテナは、ホスト オペレーティング システム内のユーザー スペースで個別のプロセスとして実行されます。

コンテナ テクノロジーは、オペレーティング システムを仮想化し、分離されたリソースを持つプロセスでアプリケーションとその依存関係を実行できるようにする方法です。

コンテナを使用すると、アプリケーションのコード、構成、依存関係を使いやすいビルディング ブロックに簡単にパッケージ化できるため、環境の一貫性、運用効率、開発者の生産性、バージョン管理など、多くの目標を達成できます。

コンテナは、展開環境に関係なく、アプリケーションが迅速かつ確実に、一貫して展開されることを保証するのに役立ちます。

コンテナを使用すると、リソースをより細かく制御できるため、インフラストラクチャの効率が向上します。

次の図から、両者の違いを直感的に理解できます。

Docker は Linux コンテナのパッケージであり、シンプルで使いやすいコンテナ インターフェイスを提供します。これは現在最も人気のある Linux コンテナ ソリューションです。

Linux コンテナは、Linux によって開発されたもう 1 つの仮想化テクノロジです。簡単に言えば、Linux コンテナは完全なオペレーティング システムをシミュレートするのではなく、プロセスを分離します。これは、通常のプロセスの外側に保護レイヤーを配置することと同じです。

コンテナ内のプロセスの場合、アクセスするすべてのリソースは仮想化されているため、基盤となるシステムからの分離が実現されます。

Docker はアプリケーションとその依存関係を 1 つのファイルにパッケージ化します。このファイルを実行すると、仮想コンテナが生成されます。

プログラムは、実際の物理マシン上で実行されるのと同じように、この仮想コンテナ内で実行されます。 Docker を使用すると、環境の問題を心配する必要がありません。

一般的に、Docker のインターフェースは非常にシンプルで、ユーザーは簡単にコンテナを作成して使用し、独自のアプリケーションをコンテナに配置できます。コンテナは、通常のコードの管理と同様に、バージョン管理、コピー、共有、変更することもできます。

Dockerの利点

Docker には、従来の仮想化方法よりも多くの利点があります。

  • Docker は数秒以内に素早く起動します。仮想マシンの起動には通常数分かかります。
  • Docker では必要なリソースが少なくなります。 Docker はオペレーティング システム レベルで仮想化を実行します。 Docker コンテナは、パフォーマンスの低下がほとんどなくカーネルとやり取りし、ハイパーバイザー層とカーネル層を介した仮想化よりもパフォーマンスが優れています。
  • Docker はより軽量です。 Docker のアーキテクチャはカーネルと共有アプリケーション ライブラリを共有でき、メモリをほとんど消費しません。同じハードウェア環境において、Docker 上で稼働するイメージの数は仮想マシンの数をはるかに上回り、システムの利用率は非常に高くなります。
  • Docker は仮想マシンよりも弱い分離を提供します。 Docker はプロセス間の分離を目的としており、仮想マシンはシステムレベルの分離を実現できます。
  • 安全。 Docker のセキュリティも弱いです。 Docker のテナント ルートはホスト ルートと同等です。コンテナ内のユーザーが通常のユーザー権限からルート権限にアップグレードされると、ホストのルート権限が直接付与され、無制限の操作を実行できるようになります。
  • VM テナントのルート権限とホストのルート VM 権限は分離されており、VM は Intel の VT-d や VT-x などのリング 1 ハードウェア分離テクノロジを利用します。
  • この分離技術により、仮想マシンが分離して相互にやり取りすることが防止されますが、コンテナには現時点ではハードウェア分離の形式がないため、攻撃に対して脆弱になります。
  • 管理性。 Docker の集中管理ツールはまだ成熟していません。さまざまな仮想化テクノロジには、成熟した管理ツールがあります。たとえば、VMware vCenter は完全な仮想マシン管理機能を提供します。
  • 高い可用性と回復性。 Docker のビジネス向け高可用性サポートは、迅速な再デプロイメントによって実現されます。
  • 仮想化には、負荷分散、高可用性、フォールト トレランス、移行、データ保護など、実稼働環境でテスト済みの成熟した保護メカニズムがあります。 VMware は、ビジネスの継続性を確保するために、仮想マシンの 99.999% の高可用性を保証します。
  • すばやく作成および削除します。仮想化の作成には数分かかりますが、Docker コンテナの作成には数秒しかかかりません。 Docker の迅速な反復により、開発、テスト、展開にかかる時間が大幅に節約されます。
  • 配信と展開。仮想マシンはイメージを通じて環境配信の一貫性を実現できますが、イメージの配布を体系化することはできません。 Docker はコンテナの構築プロセスを Dockerfile に記録し、クラスター内での迅速な配布と展開を可能にします。

次の表から、従来の仮想マシンと比較したコンテナの利点が明確にわかります。

Dockerの3つの基本概念

上の図から、Docker には 3 つの基本概念が含まれていることがわかります。

  • 画像
  • 容器
  • リポジトリ

イメージは Docker がコンテナを実行するための前提条件であり、ウェアハウスはイメージを保存する場所です。イメージがDockerの核となっていることがわかります。

画像

では、画像とは一体何なのでしょうか? Docker イメージは特別なファイル システムとして考えることができます。コンテナ ランタイムに必要なプログラム、ライブラリ、リソース、構成、およびその他のファイルを提供することに加えて、ランタイム用に準備されたいくつかの構成パラメータ (匿名ボリューム、環境変数、ユーザーなど) も含まれています。

イメージには動的なデータは含まれておらず、作成後にその内容は変更されません。イメージは、一連の読み取り専用レイヤーの統合ビューです。この定義は理解するのが難しいかもしれません。次の図は、読者が画像の定義を理解するのに役立ちます。

左側には、複数の読み取り専用レイヤーが重なり合っているのがわかります。最下層を除き、各層には次の層を指すポインターがあります。これらのレイヤーは Docker 内部の実装の詳細であり、ホストのファイル システムからアクセスできます。

Union File System テクノロジーは、さまざまなレイヤーを 1 つのファイル システムに統合し、これらのレイヤーに統一された視点を提供します。

これにより、複数のレイヤーの存在が隠され、ユーザーの観点からは、ファイル システムは 1 つだけになります。この遠近法の形は写真の右側で見ることができます。

容器

コンテナの定義はイメージの定義とほぼ同じであり、レイヤーのスタックの統一されたビューでもあります。唯一の違いは、コンテナの最上位層が読み取りおよび書き込み可能であることです。

コンテナの定義にはコンテナを実行するかどうかは記載されていないため、実際にはコンテナ = イメージ + 読み取り/書き込みレイヤーとなります。

リポジトリ

Docker リポジトリは、イメージ ファイルを保存するための集中的な場所です。イメージがビルドされると、現在のホスト上で簡単に実行できます。

ただし、このイメージを他のサーバーで使用する必要がある場合は、イメージを保存および配布するための集中型サービスが必要です。 Docker Registry はそのようなサービスです。

リポジトリとレジストリが混同され、厳密に区別されない場合があります。

Docker リポジトリの概念は Git に似ており、登録サーバーは GitHub のようなホスティング サービスとして理解できます。

実際、Docker レジストリには複数のリポジトリを含めることができ、各リポジトリには複数のタグを含めることができ、各タグはイメージに対応します。

したがって、イメージ リポジトリは、以前使用したコード リポジトリと同様に、Docker がイメージ ファイルを集中的に保存するために使用する場所です。

通常、リポジトリには同じソフトウェアの異なるバージョンのイメージが含まれており、ソフトウェアの異なるバージョンに対応するためにタグがよく使用されます。

<ウェアハウス名>:<ラベル> の形式を使用して、どのバージョンのソフトウェアがミラーであるかを指定できます。ラベルが指定されていない場合は、Latest がデフォルトのラベルとして使用されます。

倉庫は次の 2 つのタイプに分けられます。

  • 公共(公共倉庫)
  • プライベート

Docker Registry パブリック リポジトリは、ユーザーに公開され、ユーザーがイメージを管理できるレジストリ サービスです。

一般的に、このような公開サービスでは、ユーザーは公開画像を無料でアップロードおよびダウンロードできますが、非公開画像を管理するための有料サービスが提供される場合もあります。

パブリック サービスを使用するだけでなく、ユーザーはローカルでプライベート Docker レジストリを構築することもできます。 Docker は Docker Registry イメージを公式に提供しており、これをプライベート Registry サービスとして直接使用できます。

ユーザーが独自のイメージを作成した後、Push コマンドを使用して、そのイメージをパブリック リポジトリまたはプライベート リポジトリにアップロードできます。こうすることで、次にこのイメージを別のマシンで使用するときには、リポジトリからプルするだけで済みます。

主に、イメージ、コンテナ、リポジトリなどの Docker の一般的な概念について詳しく説明し、従来の仮想化の観点から Docker の利点についても説明しました。

次の図から Docker のアーキテクチャを直感的に理解できます。

Docker は C/S 構造、つまりクライアント/サーバー アーキテクチャを使用します。 Docker クライアントは、Docker イメージの構築、実行、配布を担当する Docker サーバーと対話します。

Docker クライアントとサーバーは単一のマシン上で実行することも、RESTful、Stock、またはネットワーク インターフェイスを介してリモート Docker サーバーと通信することもできます。

この図は、Docker クライアント、サーバー、および Docker リポジトリ (Docker Hub および Docker Cloud) を示しています。デフォルトでは、Docker は Docker Central リポジトリでイメージ ファイルを検索します。

リポジトリを使用してイメージを管理するというこの設計コンセプトは、Git に似ています。もちろん、このリポジトリは設定を変更することで指定でき、独自のプライベートリポジトリを作成することもできます。

Dockerのインストールと使用

Docker をインストールして使用するための前提条件がいくつかありますが、それらは主にシステム アーキテクチャとカーネルのサポートに反映されます。

システムアーキテクチャに関しては、Docker が当初からサポートしてきた X86-64 を除き、他のシステムアーキテクチャのサポートが継続的に改善され、推進されてきました。

Docker は CE と EE という 2 つの主要バージョンに分かれています。 CE は Community Edition の略で、無料サポート期間は 7 か月です。 EE は Enterprise Edition の略で、セキュリティを重視し、使用料がかかり、サポート期間は 24 か月です。

インストール前に、公式ドキュメントを参照して最新の Docker サポート情報を入手することができます。公式ドキュメントは、https://docs.docker.com/install/ にあります。

Docker には、カーネルでサポートされる機能、つまりカーネル構成オプション (たとえば、Cgroup および Namespace 関連のオプション、およびその他のネットワーク ドライバーとストレージ ドライバーを有効にする必要があります) に対しても特定の要件があります。

カーネル構成を検出してガイドするための検出スクリプトが Docker ソース コードに用意されています。スクリプトのリンクは、https://raw.githubusercontent にあります。 ... ig.sh です。

前提条件が満たされると、インストールは非常に簡単になります。

Docker CE のインストールについては、公式ドキュメントを参照してください。

  • MacOS: https://docs.docker.com/docker-for-mac/install/
  • Windows: https://docs.docker.com/docker...tall/
  • Ubuntu: https://docs.docker.com/instal...untu/
  • Debian: https://docs.docker.com/instal...bian/
  • CentOS: https://docs.docker.com/instal...ntos/
  • フェドラ: https://docs.docker.com/instal...dora/

その他の Linux ディストリビューション: https://docs.docker.com/install/

ここではデモとして CentOS 7 を使用します。

環境準備:

  • Alibaba Cloud Server (1 コア 2G、1M 帯域幅)
  • CentOS 7.4 64ビット

Docker-CE は CentOS 7 の 64 ビット バージョンをサポートしており、カーネル バージョンが 3.10 以上である必要があるため、まず古いバージョンの Docker をアンインストールする必要があります。

  1. $ sudo yum 削除 docker \  
  2. dockerクライアント\  
  3. docker-client-最新 \  
  4. docker-common \  
  5. docker-最新 \  
  6. docker-最新-logrotate \  
  7. docker-logrotate \  
  8. docker-selinux \  
  9. docker-engine-selinux \  
  10. dockerエンジン

依存パッケージをインストールするには、次のインストール コマンドを実行します。

  1. $ sudo yum install -y yum-utils \  
  2. デバイスマッパー永続データ\  
  3. lvm2

ここではすでにインストールしているので、最新バージョンをインストールしたというメッセージが表示されます。

Dockerをインストールする

Docker パッケージは、デフォルトの CentOS-Extras リポジトリにすでに含まれています。 Docker をインストールするには、次の yum コマンドを実行するだけです。

  1. $ sudo yum インストール docker

もちろん、テスト環境や開発環境でのインストール プロセスを簡素化するために、Docker は CentOS システムへのインストールに使用できる便利なインストール スクリプトのセットを公式に提供しています。

  1. カール -fsSL get.docker.com -o get-docker.sh  
  2. sh get-docker.sh

詳細については、docker-install スクリプト (https://github.com/docker/docker-install) を参照してください。

このコマンドを実行すると、スクリプトによってすべての準備が自動的に行われ、システムに Docker CE の Edge バージョンがインストールされます。

インストールが完了したら、次のコマンドを実行して、インストールが成功したかどうかを確認します。

  1. docker バージョンまたは docker 情報

Docker が正常にインストールされたことを証明する Docker バージョンに関する情報を返します。

Docker-CEを起動します。

  1. $ sudo systemctl dockerを有効にする$ sudo systemctl dockerを起動する

Docker Hello Worldのシンプルなアプリケーション

サーバーが毎日クラッシュし、Docker に問題があったため、以下のケースのデモンストレーションは Kali Linux 環境に基づいています。

最もシンプルなイメージファイル Hello World を通じて Docker の魅力を体験してみましょう。

次のコマンドを直接実行して、hello-world という名前のイメージ ファイルをウェアハウスからローカルに取得します。

  1. docker pull ライブラリ/hello-world

docker pull images はイメージ ファイルを取得するためのもので、library/hello-world はウェアハウス内のイメージ ファイルの場所です。library はイメージ ファイルが配置されているグループ、hello-world はイメージ ファイルの名前です。

キャプチャが成功すると、ローカル マシン上でイメージ ファイルを確認できます。

  1. Docker イメージ

次のような結果が見られます。

これで、hello-world イメージファイルを実行できます。

  1. docker で hello-world を実行する

次のような結果が見られます。

このプロンプトを出力すると、hello world は実行を停止し、コンテナは自動的に終了します。一部のコンテナは、MySQL イメージなどのサービスを提供するため、自動的に終了しません。

簡単じゃないですか?上記からわかるように、Docker は非常に強力です。さらに、Ubuntu、Apache、その他のイメージも取得できます。これらについては、今後のチュートリアルで 1 つずつ説明します。

Docker は、イメージを作成および更新するためのシンプルで実用的なコマンドのセットを提供します。作成したアプリケーションイメージをネットワーク経由で直接ダウンロードし、Docker RUN コマンドで直接使用することができます。

RUN コマンドでイメージが正常に実行されると、実行中のイメージは Docker コンテナになります。

コンテナは軽量のサンドボックスとして理解できます。 Docker はコンテナを使用してアプリケーションを実行および分離します。コンテナは起動、停止、削除できますが、Docker イメージには影響しません。

次の図を見てみましょう。

Docker クライアントは、Docker ユーザーが Docker と対話する主な方法です。 Docker コマンドラインを使用してコマンドを実行すると、Docker クライアントはそれらのコマンドをサーバーに送信し、サーバーがコマンドを実行します。

Docker コマンドは Docker API を使用します。 Docker クライアントは複数のサーバーと通信できます。

Docker コンテナがどのように動作するかを分析します。 Docker コンテナの仕組みを学んだら、コンテナを自分で管理できるようになります。

Docker アーキテクチャ

上記の研究では、Docker の基本的なアーキテクチャについて簡単に説明しました。 Docker は C/S 構造、つまりクライアント/サーバー アーキテクチャを使用していることがわかりました。

Docker クライアントが Docker サーバーと対話する場合、Docker サーバーが Docker イメージの構築、実行、配布を担当することを理解します。

Docker クライアントとサーバーが同じマシン上で実行できることがわかっているので、RESTful、Stock、またはネットワーク インターフェイスを介してリモート Docker サーバーと通信できます。

次の図から Docker のアーキテクチャを直感的に理解できます。

Docker のコア コンポーネントは次のとおりです。

  • Dockerクライアント
  • Dockerデーモン
  • Dockerイメージ
  • Docker レジストリ
  • Dockerコンテナ

Docker はクライアント/サーバー アーキテクチャを使用します。クライアントは、コンテナの構築、実行、配布を担当するサーバーにリクエストを送信します。

クライアントとサーバーは同じホスト上で実行でき、クライアントはソケットまたは REST API を介してリモート サーバーと通信することもできます。

おそらく多くの友人は、REST API とは何かなど、今のところいくつかのことをよく理解していないかもしれませんが、それは問題ではありません。次の記事で 1 つずつ説明します。

Dockerクライアント

Docker クライアント (Docker クライアントとも呼ばれます)。これは実際には Docker によって提供されるコマンド ライン インターフェイス (CLI) ツールであり、多くの Docker ユーザーが Docker と対話するための主な方法です。

クライアントはアプリケーションをビルド、実行、停止できるほか、Docker_Host とリモートで対話することもできます。

最もよく使用される Docker クライアントは Docker コマンドです。 Docker コマンドを使用すると、ホスト上で Docker コンテナを簡単に構築して実行できます。

Dockerデーモン

Docker Daemon は、Linux バックグラウンド サービスとして実行されるサーバー コンポーネントです。これは Docker のコア バックグラウンド プロセスであり、デーモン プロセスとも呼ばれます。

Docker クライアントからの要求に応答し、これらの要求をシステム コールに変換してコンテナー管理操作を完了する役割を担います。

このプロセスは、Docker クライアントから送信されたリクエストを受信する役割を担う API サーバーをバックグラウンドで起動します。受信したリクエストは Docker デーモン内のルーティング配布を通じてディスパッチされ、特定の関数によってリクエストが実行されます。

大まかに分けると次の3つの部分に分けられます。

  • Docker サーバー
  • エンジン
  • 仕事

Docker デーモンのアーキテクチャは次のとおりです。

Docker デーモンは、Docker サーバー モジュールを介して Docker クライアントからの要求を受け入れ、エンジンで要求を処理し、要求の種類に基づいて指定されたジョブを作成して実行するものと考えることができます。

Docker デーモンは Docker ホスト上で実行され、コンテナの作成、実行、監視、およびイメージの構築と保存を担当します。

実行プロセスの影響としては、次のようなものが考えられます。

  • Docker レジストリからイメージを取得します。
  • GraphDriver を通じてコン​​テナ イメージのローカリゼーションを実行します。
  • コンテナ ネットワーク環境は NetworkDriver を通じて構成されます。
  • ExecDriver を通じてコン​​テナ内で実行中の実行作業を実行します。

Docker デーモンと Docker クライアントはどちらも実行ファイル Docker を通じて起動されるため、両者の起動プロセスは非常に似ています。

Docker 実行可能ファイルが実行されると、実行中のコードは異なるコマンドライン フラグ パラメータを通じて 2 つを区別し、最終的にそれぞれの対応する部分を実行します。

Docker デーモンを起動するときは、通常、次のコマンドを使用して完了できます。

  1. docker --daemon=truedocker –d    
  2. docker –d= 

次に、Docker の main() 関数は、上記のコマンドの対応するフラグ パラメータを解析し、最終的に Docker デーモンの起動を完了します。

次の図は、Docker デーモンの起動プロセスを示しています。

デフォルトでは、Docker デーモンはローカル ホストからのクライアント要求にのみ応答できます。リモート クライアント要求を許可する場合は、構成ファイルで TCP リスニングを開く必要があります。

次のように設定できます。

1. 設定ファイル /etc/systemd/system/multi-user.target.wants/docker.service を編集し、環境変数 ExecStart の後に -H tcp://0.0.0.0 を追加して、任意の IP からのクライアント接続を許可します。

2. Dockerデーモンを再起動します。

  1. systemctlデーモンリロード 
  2. systemctl docker.service を再起動します。

3. 次のコマンドを使用してリモート サーバーと通信できます。

  1. docker -H サーバーのIPアドレス情報

-H はサーバーホストを指定するために使用され、 info サブコマンドは Docker サーバーの情報を表示するために使用されます。

Dockerイメージ

Docker イメージは特別なファイル システムとして表示できます。コンテナ ランタイムに必要なプログラム、ライブラリ、リソース、構成、およびその他のファイルを提供することに加えて、ランタイム用に準備されたいくつかの構成パラメータ (匿名ボリューム、環境変数、ユーザーなど) も含まれています。

イメージには動的なデータは含まれておらず、作成後にその内容は変更されません。 Docker イメージは、Docker コンテナを作成できる読み取り専用テンプレートと考えることができます。

画像を生成する方法はいくつかあります。

  • ゼロから画像を作成する
  • 他の人が作成した既成画像をダウンロードして使用する
  • 既存の画像に基づいて新しい画像を作成する

イメージの内容と作成手順は、Dockerfile と呼ばれるテキスト ファイルに記述できます。 docker build コマンドを実行することで Docker イメージをビルドできます。

Docker レジストリ

Docker Registry は、Docker イメージを保存するためのリポジトリです。 Docker エコシステムにおけるその位置は次の図に示されています。

docker push、docker pull、または docker search を実行すると、実際には Docker デーモンを介して Docker レジストリと通信します。

Dockerコンテナ

Docker コンテナは、Docker イメージの実行中のインスタンスです。プロジェクト プログラムが実際に実行され、システム リソースが消費され、サービスが提供される場所です。

Docker コンテナはシステム ハードウェア環境を提供します。 Docker イメージ、準備されたシステム ディスク、および作成したプロジェクト コードを使用して実行し、サービスを提供することができます。

Dockerコンポーネントが連携してコンテナを実行する仕組み

これを見ると、すべての読者が Docker インフラストラクチャに精通しているはずだと私は信じています。最初に実行したコンテナをまだ覚えていますか?

ここで、hello-world の例を使用して、Docker のさまざまなコンポーネントがどのように連携するかを理解しましょう。

コンテナの起動プロセスは次のとおりです。

  • Docker クライアントは docker run コマンドを実行します。
  • Docker デーモンは、ローカルに hello-world イメージが存在しないことを検出しました。
  • デーモンは Docker Hub からイメージをダウンロードします。
  • ダウンロードが完了し、イメージ hello-world がローカルに保存されます。
  • Docker デーモンがコンテナを起動します。

具体的なプロセスは次のデモ画像で確認できます。

Docker イメージから、hello-world がローカルにダウンロードされたことがわかります。

実行中のコンテナを表示するには、Docker Ps または Docker Container ls を使用できます。プロンプト情報を出力した後、hello-world の実行が停止し、コンテナが自動的に終了することがわかります。そのため、確認したところ、実行中のコンテナは見つかりませんでした。

Docker コンテナのワークフローを非常に明確に分析しました。一般的に、コンテナ内の Docker コンポーネントの共同操作は次のプロセスに分けられることがわかります。

  • Docker クライアントは docker run コマンドを実行します。
  • Docker デーモンは、ローカルに必要なイメージが存在しないことを検出しました。
  • デーモンは Docker Hub からイメージをダウンロードします。
  • ダウンロードが完了すると、画像はローカルに保存されます。
  • Docker デーモンがコンテナを起動します。

これらのプロセスを理解すると、これらのコマンドを理解したときに突然感じることはなくなります。次に、Docker でよく使われるコマンド操作について説明します。

Docker 共通コマンド

docker -h を使用すると、コマンドの詳細なヘルプドキュメントを表示できます。ここでは、日常生活でより頻繁に使用される可能性のあるいくつかのコマンドについてのみ説明します。

たとえば、Docker イメージをプルする必要がある場合は、次のコマンドを使用できます。

  1. docker pull イメージ名

image_name はイメージの名前であり、Docker Hub からイメージをダウンロードする場合は、次のコマンドを使用できます。

  1. docker pull centos:最新

cento: lastest はイメージの名前です。 Docker デーモンは、必要なイメージがローカルで利用できないことを検出すると、Docker Hub からイメージを自動的にダウンロードします。ダウンロードが完了すると、イメージはデフォルトで /var/lib/docker ディレクトリに保存されます。

次に、ホスト上に存在するイメージの数を確認する場合は、次のコマンドを使用します。

  1. Docker イメージ

現在実行中のコンテナを知りたい場合は、次のコマンドを使用します。

  1. ドッカーps -a

-a は、実行されていないコンテナも含め、現在のすべてのコンテナを表示します。コンテナを起動、再起動、停止するにはどうすればよいですか?

次のコマンドを使用できます。

  1. docker start コンテナ名/コンテナID  
  2. docker コンテナ名/コンテナIDを再起動します 
  3. docker stop コンテナ名/コンテナID

この時点で、このコンテナに入りたい場合は、attach コマンドを使用できます。

  1. docker アタッチ コンテナ名/コンテナ ID

このコンテナ内でイメージを実行し、イメージ内で bash を呼び出す場合は、次のコマンドを使用できます。

  1. docker run -t -i コンテナ名/コンテナID /bin/bash

この時点で特定のイメージを削除したい場合、そのイメージはコンテナによって参照(実行)されているため、参照されているコンテナが破棄(削除)されない限り、イメージを削除することはできません。

まずコンテナを停止する必要があります。

  1. ドッカーps  
  2. docker stop コンテナ名/コンテナID

次に、次のコマンドを使用してコンテナを削除します。

  1. docker rm コンテナ名/コンテナID

次に、この時点で画像を削除します。

  1. docker rmi イメージ名

この時点で、よく使用される Docker 関連のコマンドは停止します。これらのコマンドについては、以降の記事で繰り返し説明します。

Dockerfile とは何ですか?

Docker の基本的な概念についてはすでに説明しました。 CTF の観点から見ると、Dockerfile を使用してイメージを定義し、そのイメージを使用してコンテナを実行し、実際の脆弱性シナリオをシミュレートできます。

したがって、Dockerfile がイメージとコンテナの鍵であることは間違いありません。また、Dockerfile ではイメージの内容も簡単に定義できます。ここまで述べてきましたが、Dockerfile とは一体何でしょうか?

Dockerfile は、Docker イメージを自動的に構築する構成ファイルです。ユーザーは Dockerfile を使用してカスタマイズされたイメージをすばやく作成できます。 Dockerfile 内のコマンドは、Linux の Shell コマンドと非常によく似ています。

次の図を使用すると、Docker イメージ、コンテナ、および Dockerfile の関係を直感的に理解できます。

上図からわかるように、Dockerfile はイメージをカスタマイズし、Docker コマンドを通じてイメージを実行して、コンテナを起動するという目的を達成できます。 Dockerfile はコマンドラインで構成され、# で始まるコメント行をサポートします。

一般的に言えば、Dockerfile は次の 4 つの部分に分けられます。

  • ベースイメージ(親イメージ)情報命令FROM。
  • メンテナ情報コマンド MAINTAINER。
  • ミラー操作命令 RUN、EVN、ADD、WORKDIR など
  • コンテナの起動指示 CMD、ENTRYPOINT、USER など。

以下は簡単な Dockerfile の例です。

  1. python:2.7MAINTAINER Angel_Kitty <[email protected]>からコピーします。 /アプリ
  2. ワークディレクトリ /app
  3. pip install -r requirements.txt を実行します。
  4. EXPOSE 5000ENTRYPOINT [ "python" ]CMD [ "app.py" ]

上記のプロセスを分析できます。

  • Docker Hub から Python 2.7 ベースイメージをプルします。
  • メンテナー情報を表示します。
  • 現在のディレクトリをコンテナ内の /App ディレクトリにコピーし、ローカル ホストの (Dockerfile が配置されているディレクトリへの相対パス) をコンテナにコピーします。
  • 作業パスを /App として指定します。
  • 依存パッケージをインストールします。
  • ポート5000を公開します。
  • アプリを起動します。

この例は、Python Flask アプリ (Flask は Python 用の軽量 Web フレームワーク) を起動する Dockerfile です。この例から、Dockerfile の構成と命令の記述手順を誰でも理解できると思います。

Dockerfileの一般的な指示

上記の例に基づいて、Dockerfile の構成と命令の記述プロセスはすでにわかっています。これで、これらの一般的なコマンドを理解できるようになり、作業が簡単になります。

Dockerfile 内のすべてのコマンドは INSTRUCTION 引数の形式であるため、命令 (INSTRUCTION) では大文字と小文字は区別されませんが、大文字が推奨されます。 SQL ステートメントと非常によく似ていませんか?これらの命令セットを正式に説明しましょう。

から

FROM はベースイメージを指定するために使用されます。一般的な形式は、FROM<image> または FROM <image>:<tag> です。

すべての Dockerfile は FROM で始まる必要があります。 FROM コマンドは、どのイメージに基づいて Dockerfile によって作成されるイメージ ファイルを指定します。 FROM 以降のすべての命令は、FROM に基づいてイメージを作成します。

同じ Dockerfile 内で FROM コマンドを複数回使用して、複数のイメージを作成できます。たとえば、Python 2.7 のベースイメージを指定する場合は、次のように記述できます。

  1. Python:2.7から

メンテナー

MAINTAINER はイメージ作成者と連絡先情報を指定するために使用され、一般的な形式は MAINTAINER です。

ここでは自分の ID とメールを設定します:

  1. メンテナー Angel_Kitty

コピー

COPY は、ローカル ホスト (Dockerfile が配置されているディレクトリの相対パス) をコンテナーにコピーするために使用されます。

ローカルディレクトリをソースディレクトリとして使用する場合は、COPY を使用することをお勧めします。一般的な形式は COPY です。

たとえば、現在のディレクトリをコンテナ内の /app ディレクトリにコピーする場合は、次のようにします。

  1. コピー ./app

ワークディレクトリ

WORKDIR は、RUN、CMD、および ENTRYPOINT コマンドと共に使用され、現在の作業パスを設定します。

複数回設定可能です。相対パスの場合は、前の WORKDIR コマンドを基準とします。デフォルトのパスは / です。一般的な形式は WORKDIR /path/to/work/dir です。

たとえば、/app パスを設定すると、次の操作を実行できます。

  1. ワークディレクトリ /app

走る

RUN はコンテナ内でコマンドを実行するために使用されます。各 RUN コマンドは、元のイメージに変更レイヤーを追加することと同等であり、元のイメージは変更されません。一般的な形式は RUN です。

たとえば、Python 依存パッケージをインストールする場合は、次のようにします。

  1. pip install -r requirements.txt を実行します。

さらす

EXPOSE コマンドは、外部に公開するポートを指定するために使用されます。一般的な形式は EXPOSE [...] です。

たとえば、上記の例では、ポート 5000 を開きます。

  1. エクスポーズ5000

エントリーポイント

ENTRYPOINT を使用すると、コンテナーを実行可能プログラムのように動作させることができます。 Dockerfile には ENTRYPOINT が 1 つだけ存在できます。 ENTRYPOINT が複数ある場合は、最後のものが有効になります。

ENTRYPOINT コマンドにも 2 つの形式があります。

  • ENTRYPOINT ["executable", "param1", "param2"] : 推奨される Exec 形式。
  • ENTRYPOINT コマンド param1 param2: シェル形式。

たとえば、次の例では、Python イメージを実行可能プログラムに変換します。次のことが可能です:

  1. エントリポイント [ "python" ]

CMDF

CMD コマンドは、コンテナの起動時にデフォルトのコマンドを実行するために使用されます。 CMD コマンドには実行可能ファイルを含めることも含めないこともできます。

実行可能ファイルが含まれていない場合は、ENTRYPOINT を使用して指定する必要があり、CMD コマンドのパラメータが ENTRYPOINT のパラメータとして使用されます。

CMD コマンドには 3 つの形式があります。

  • CMD ["executable","param1","param2"]: exec 形式が推奨されます。
  • CMD ["param1","param2"]: 実行可能プログラム形式がありません。
  • CMD コマンド param1 param2: シェル形式。

Dockerfile には CMD が 1 つだけ存在できます。 CMD が複数ある場合は、最後のものが有効になります。 CMD のシェル形式は、デフォルトで /bin/sh -c を呼び出してコマンドを実行します。

CMD コマンドは、Docker コマンドラインで渡されたパラメータによって上書きされます: docker run busybox /bin/echo Hello Docker は CMD のコマンドを上書きします。

たとえば、/app を起動したい場合は、次のコマンドを使用できます。

  1. コマンド [ "app.py" ]

もちろん、他にもコマンドはいくつかありますが、使用時に一つずつ説明していきます。

Dockerfile の構築

Dockerfile の書き方を大まかに説明したので、自分で例を書いてみましょう。

  1. mkdir 静的ウェブ
  2. CD static_web
  3. Dockerfileをタッチします

次に、vi dockerfileを開始し、iを入力して編集を開始します。これが私たちが構築したdockerfileのコンテンツです:

  1. nginxから
  2. メンテナーAngel_Kitty <[email protected]>
  3. echo '<h1> hello、docker!</h1>' >/usr/share/nginx/html/ index .htmlを実行します

編集後、ESCを押して編集を終了し、次にwqを書き込み、終了します。

dockerfileファイルが配置されているディレクトリで実行します。

  1. Docker Build -T Angelkitty/nginx_web:v1。

説明しましょう:

  • -tは、新しい画像のリポジトリと名前を設定することです
  • Angelkittyは倉庫名です
  • nginx_webは画像名です
  • :V1はタグです(デフォルトの最新として追加されていません)

ビルドを完了したら、Docker Imagesコマンドを使用してすべての画像を表示します。リポジトリがnginxであり、タグがV1であるという情報がある場合、ビルドが成功したことを意味します。

次に、Docker Runコマンドを使用してコンテナを起動します。

  1. docker run -name nginx_web -d -p 8080:80 Angelkitty/nginx_web:v1  

このコマンドは、nginxイメージを使用してnginx_webという名前のコンテナを起動し、ポート8080をマップします。

このようにして、ブラウザを使用して、このnginxサーバーにアクセスできます:http:// localhost:8080/or http:// localhostのIPアドレス:8080/、そしてページは次の情報を返します。

<<:  8つのクラウド移行ツール、必ずあなたにぴったりのものが見つかります

>>:  サプライズですか? ITリーダーはオンプレミス展開よりもクラウドコンピューティングを好む

推薦する

マーケティング解釈!ダイソンの新製品はなぜWeChatモーメンツで人気があるのでしょうか?

月給5,000~50,000のこれらのプロジェクトはあなたの将来ですテキスト丨脳を燃やす広告(shu...

Baidu サイトのホームページがそもそも表示されない場合の復元方法

サイトのホームページがそもそも存在しないという事実は、基本的にほとんどのSEO仲間やウェブマスターが...

frontrangehosting-768M メモリ KVM/月額 6 ドル/Windows XP-03-08 (超安定)

FrontrangeHosting は onapp にあります。この会社は安定性に関して非常に評判が...

BATの3大チャンネルの初公開作品について、3大初公開作品が一気に完成する様子をご覧ください!

中小企業にとって、アプリマーケットでの最初のリリースは、無視できない重要なプロモーションリソースであ...

オンラインストアの商品売上を伸ばすための合法的な戦術の使用に関する研究

一部のオンラインストアの売上が特に良いのは、詐欺的な手段を使って他人を騙すからだと言う人が多い。しか...

モバイルインターネットにおけるO2O:ソーシャルメディアがもたらす利点

[編集者注]:この記事の著者は、IDG Investment Points のワイヤレス事業部門のシ...

PCaaS と DaaS: これらのサービスの違いを理解する

DaaS (Device as a Service) と PCaaS、およびこれらのサービスの定義に...

VMware Aria: マルチクラウド管理を簡素化し、クラウドの混乱をクラウド インテリジェンスに移行

現在、クラウド コンピューティングを利用して企業のデジタル変革を加速することは、ほとんどの企業の間で...

#複数のサーバーを販売中: dacentec-$30/X3440/8g メモリ/4T ハードディスク/10T トラフィック/G ポート

Dacentec では多数のサーバーを低価格で販売しています。まず最初に、システムをバックグラウンド...

OpenStack Cinder サービスステータスのトラブルシューティング

[[333895]]この記事はWeChatの公開アカウント「New Titanium Cloud S...

ウェブサイトの最適化作業には何が含まれますか?優秀なSEOチームの仕事を分担する方法

月収10万元の起業の夢を実現するミニプログラム起業支援プラン現在、多くの企業が SEO の最適化とプ...

Weiboを使ってお店を宣伝する方法

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスWeiboマーケティング...

Ele.me の Li Jian: コンピューティング サービスのワンストップ配信を実現

[51CTO.com からのオリジナル記事] 7 年間の努力と見事な変貌。 2012年以降、6年連続...

301 リダイレクトを使用して 404 ページを独自の外部リンクに転送することの危険性について簡単に説明します。

今日、A5で「301を使用して404エラーを外部リンクに変える方法に関する記事」という記事を見ました...

インフルエンサーの発展の傾向

近年、ショートビデオやライブ放送が最もホットなトレンドとなっています。 Douyin、Kuaisho...