プログラマーとして、テキストを編集するために vim をインストールする場合、異なる環境で異なるコマンドを実行する必要があります。 Ubuntu では apt-get install vim を実行する必要があり、CentOS では yum install vim を実行する必要があります。 小さなソフトウェアをインストールするだけでも、すでに問題があります。異なるオペレーティング システムを搭載したサーバーに独自のコードを展開する場合は、より多くのソフトウェアと構成に依存する必要があり、環境ごとに個別の展開スクリプトを作成する必要があります。不快です、とても不快です。 そこで疑問なのは、もっと良い解決策はあるかということです。もちろんありますよ。中間層を追加することで解決できないものはありません。ある場合は、別のレイヤーを追加します。今回追加する中間層は Docker です。 Dockerはコードとオペレーティングシステムの間の中間層です ああ、正確には Docker コンテナです。 Dockerとは何ですか?プログラマーが「このプログラムは私の環境では問題なく動作するのに、なぜあなたの環境では動作しないのですか?」と言うのをよく耳にします。ここでのキーワードである「プログラム」と「環境」に注目してください。プログラムはオペレーティング システム上で実行され、オペレーティング システムにはさまざまなバージョンの依存ライブラリと構成がインストールされます。プログラムが依存するこの情報を総称して「環境」と呼びます。 プログラムと環境 プログラムは環境に依存します。環境が異なるとプログラムが実行されない可能性があります。環境とプログラムを一緒にパッケージ化して、相手に実行させることができれば、問題は解決します。 Docker は、プログラムや環境をパッケージ化して実行できるツール ソフトウェアです。どうやってやるの?見てみましょう。 ベースイメージとは何ですか?上記の異なる環境はプログラムの実行結果も異なるため、最初に行う必要がある最も重要なことは環境を統一することです。環境において最も重要なのはオペレーティング システムです。たとえば、Centos または Ubuntu の場合、すべてのプログラムが同じオペレーティング システム上で実行できるように、いずれかを選択する必要があります。そして、オペレーティング システムはユーザー空間とカーネル空間に分かれており、アプリケーションはユーザー空間で実行されることがわかっています。したがって、オペレーティング システムを去勢し、オペレーティング システムのユーザー スペース部分のみを使用して、アプリケーションに必要な環境を構築することができます。 2 つ目は、プログラミング言語の依存関係を統一することです。たとえば、Python アプリケーションを実行するには、Python インタープリターをインストールする必要があります。 Java アプリケーションを実行するには、JVM をインストールする必要があります。 Go アプリケーションを実行するには、これで完了です。 。何もインストールする必要はありません。ベースとなるオペレーティング システムと言語を選択した後、対応するファイル システム、依存ライブラリ、構成などを圧縮ファイル、いわゆるベース イメージにパッケージ化します。 ベースイメージとは何ですか? Dockerfile とは何ですか?基本的なイメージだけでは不十分で、yum install gcc などの依存関係をインストールしたり、フォルダーを作成したりする必要があることがよくあります。最後に、ターゲット アプリケーションを実行します。 Linux では、すべての作業をコマンド ラインで実行できることがわかっているので、実行する作業をコマンド ラインの形式で 1 行ずつリストできます。やることリストのようなものです。つまり、ベースイメージに基づいて、ToDo リストに従ってコマンドを 1 つずつ実行する必要があります。このToDoリストは次のようになります。 具体的な意味としては、python 3.9 インタープリターがインストールされたオペレーティングシステム (基本イメージ) をベースに、pip install などのコマンドを実行して他の依存関係をインストールし、プログラムの動作に適した環境を構築し、最後に python app.py を使用して対象アプリケーションを実行します。このように、オペレーティングシステムからアプリケーションサービスの起動までに実行する必要がある作業を明確にリスト化した ToDo リストが、いわゆる Dockerfile です。 コンテナイメージとは何ですか?Dockerfile では実行する必要がある内容が記述されるだけで、実際に実行が開始されるわけではないことに注意してください。コマンドラインを使用して docker build を実行すると、Docker ソフトウェアは Dockerfile の指示に従って環境 + アプリケーションを 1 行ずつ構築します。最後に、この環境 + プログラムは「圧縮パッケージ」に似たものにパッケージ化され、これをコンテナ イメージと呼びます。 コンテナイメージ コンテナイメージを任意のサーバーに転送し、「圧縮パッケージ」を「解凍」するだけで、環境とプログラムを同時に実行できます。完璧です!しかし、コンテナ イメージを多数のサーバーに転送するにはどうすればよいかという問題がまだ残っています。 レジストリとはサーバーの数が多い場合は、コンテナ イメージを 1 つずつ転送することも可能ですが、送信側のネットワーク帯域幅に大きな負担がかかります。もっと良い解決策はありますか?持っている。 GitHub コードリポジトリの実践を参考にすることができます。通常、git push を使用してコードを GitHub に転送し、必要な人は git pull を使用して GitHub から自分のマシンにコードをプルできます。 githubリポジトリ Dockerについても同様です。イメージ リポジトリを作成し、docker push を使用してイメージをリポジトリにプッシュし、必要に応じて docker pull を使用してイメージをマシンにプルします。イメージ リポジトリのプッシュ機能とプル機能の管理を担当するサービスは、Docker Registry と呼ばれます。 Docker Registry の機能に基づいて、さまざまな公式またはプライベートのイメージ リポジトリを構築できます。たとえば、公式のリポジトリは DockerHub と呼ばれ、非公式のリポジトリには清華大学の Tuna などがあります。一般的に、企業も独自のイメージ リポジトリを持っています。 レジストリとは コンテナとは何ですか?これで、サーバー間でコンテナイメージを転送する問題が解決されました。宛先サーバーに実行し、docker pull を実行してコンテナ イメージを取得できます。次に、docker run コマンドを実行して、この「圧縮パッケージ」コンテナ イメージを「解凍」し、独立した環境とアプリケーションを取得して実行します。このような独立した環境とアプリケーションはコンテナと呼ばれます。 1 つのオペレーティング システム上で複数のコンテナーを同時に実行できます。そして、これらのコンテナは独立しており、互いに分離されています。 コンテナとは何ですか? Docker と仮想マシンの関係は何ですか?見覚えがありますか?このコンテナは、vmware や kvm を使用して作成した従来の仮想マシンのように見えませんか?しかし、従来の仮想マシンには完全なオペレーティング システムが付属しているのに対し、コンテナー自体には完全なオペレーティング システムが付属していないという違いがあります。コンテナの基本イメージには、実際には、コア依存ライブラリやオペレーティング システムの構成ファイルなどの必要なコンポーネントのみが含まれています。名前空間と呼ばれる機能を使用して、独立したオペレーティング システムのように見せます。次に、Cgroup と呼ばれる機能を使用して、使用できるコンピューティング リソースを制限します。 Dockerと仮想マシンの違い したがって、コンテナは本質的には独自の独立したオペレーティング環境を持つ特別なプロセスであり、基礎となるレイヤーは実際にはホスト マシンのオペレーティング システム カーネルを使用します。 コンテナの本質は特別なプロセスです Docker アーキテクチャの原則さて、日常的な使用シナリオに戻り、Docker のアーキテクチャ原則について説明しましょう。これは古典的なクライアント/サーバー アーキテクチャです。クライアントは Docker-cli に対応し、サーバーは Docker デーモンに対応します。コマンドラインで Docker コマンドを入力する場合は、Docker-cli を使用します。 DockerはC/Sソフトウェアアーキテクチャです Docker-cli は入力した cmd コマンドを解析し、Docker デーモンによって提供される RESTful API を呼び出します。デーモンはコマンドを受信すると、指示に従って各コンテナを作成し、管理します。具体的には、Docker Daemon は Docker Server と Engine の 2 つのレイヤーに分かれています。 Docker サーバーは、本質的には、コンテナーとイメージを操作するための外部 API を提供する HTTP サービスです。 API リクエストを受信すると、タスクをエンジン層に配布します。エンジン層は、実際にさまざまなタスクを実行するジョブの作成を担当します。 Dockerデーモンの内部アーキテクチャ 異なる Docker コマンドは、異なるタイプのジョブ タスクを実行します。 ドッカービルドdocker build コマンドを実行すると、ジョブは Dockerfile の指示に従って、オニオンスキンのようにコンテナ イメージ ファイルをレイヤーごとにビルドします。 Dockerビルド実行ロジック docker プル/プッシュdocker pull や push などのイメージのプッシュおよびプル操作を実行すると、ジョブは外部の Docker レジストリと対話してイメージをアップロードまたはダウンロードします。 Docker プル/プッシュ実行ロジック ドッカー実行docker run コマンドを実行すると、ジョブはイメージ ファイルに基づいて containerd コンポーネントを呼び出し、runC コンポーネントを駆動してコンテナを作成して実行します。 Docker実行ロジック Docker とは何でしょうか?さて、この文をもう一度見てみましょう。 Docker は本質的に、プログラムと環境をパッケージ化して実行するツール ソフトウェアです。具体的には、Dockerfile を使用して環境とアプリケーション間の依存関係を記述し、docker build を使用してイメージをビルドし、docker pull/push を使用して Docker Registry と対話してイメージを保存および配布し、docker run コマンドを使用してイメージに基づいてコンテナーを起動し、コンテナー技術に基づいてプログラムと対応する環境を実行することで、環境依存関係によって発生するさまざまな問題を解決します。 Dockerとは何ですか? さて、ここでは Docker のアーキテクチャと基本的な動作原理を理解しました。次に、Docker に関連するいくつかの周辺機器について説明します。 Docker Compose とは何ですか?Docker コンテナ自体は単なる特別なプロセスであることはわかりましたが、複数のコンテナをデプロイし、これらのコンテナの順序に特定の要件がある場合はどうすればよいでしょうか。たとえば、ブログ システムでは、当然ながら、最初にデータベースが起動され、次に認証サービスが起動され、最後にブログ Web サービスが起動されます。 docker run コマンドを 1 つずつ実行しても問題ないのは当然ですが、もっとエレガントな解決策はあるでしょうか?持っている。 YAML ファイルを使用すると、デプロイするコンテナ、デプロイ順序、これらのコンテナが占有する CPU やメモリなどの情報を明確に指定できます。 次に、Docker-compose up コマンドの行を通じて、YAML ファイルが解析され、ワンクリックでコンテナが順番にデプロイされ、サービスの完全なセットのデプロイが完了します。これがまさに Docker Compose が行うことです。 Docker の構成原則 Docker Swarm とは何ですか?Docker はコンテナのデプロイメントを解決します。 Docker Compose は、複数のコンテナで構成されるサービスの完全なセットのデプロイメントを解決します。 Docker Swarm はより高い次元のものです。実際に、このサービス セット全体を複数のサーバーにクラスター展開するという問題が解決されます。たとえば、サーバー A が故障した場合、サービスをサーバー B に再展開して移行し、必要に応じてサービスを拡張または縮小することができます。 Docker swarm とは何ですか? Docker と k8s の関係は何ですか?前の記事で触れた k8s を覚えていますか?デプロイメントとスケーリングのために、複数のノード サーバー上でポッドをスケジュールします。 k8sノードの内部 各ポッドには複数のコンテナを含めることができ、各コンテナは基本的にサービス プロセスです。 ポッド内部 k8s は Docker Swarm と非常によく似たことを行っているように感じますか?そうです、実際、Docker Swarm は k8s の競合製品です。彼らは競争相手なので、実際にはやっていることに大きな違いはありません。ここで、Docker コンテナと k8s の関係を振り返ってみると、その考えが明確になります。 Docker によってデプロイされたコンテナは、実際には k8s によってスケジュールされた Pod 内のコンテナです。どちらもコンテナと呼ばれ、実際には同じものです。 k8s は Docker コンテナをサポートするだけでなく、他の人のコンテナもサポートします。 Docker Compose は、複数のコンテナ (実際には k8s のポッド) に基づいて作成された一連のサービスです。 Docker Swarm が行うことは k8s と同じで、基本的にはポッドをスケジュールすることです。 k8s の公式定義を振り返ってみると、コンテナ オーケストレーション エンジンと呼ばれています。さまざまなコンテナを API プログラミングの方法で管理および配置するエンジンとして理解すると、特に洞察が深まります。 コンテナ オーケストレーション エンジンの意味は何ですか? さて、Docker アイコンをもう一度見てみましょう。船に積まれたコンテナです。これらのコンテナは互いに分離されたコンテナを指し、k8s アイコンは船のハンドルです。つまり、k8s が船の方向を制御し、実際にはスケジューリング コンテナを指します。この連想の波は非常に鮮明です。 Docker と k8s 皆さんは理解できましたか? 要約する
やっとこの記事のテーマは1万語程度書いても問題ないはずですが、内容はかなり圧縮しました。主なポイントは、技術的な原理をできるだけ少ない言葉でシンプルかつわかりやすい方法で説明することです。 |
<<: Google Cloud Next '24: クラウド サービスが舞台を整え、AI が主役に
>>: オンプレミスの導入からより持続可能なクラウドの未来へ
SEO は、収益性を達成するためにトラフィックと人気を高めるために Web サイトを最適化します。誰...
Amazon Web Services, Inc. (AWS) は本日、Western Cloud ...
SEM 広告では、キーワード管理に多くの時間を費やすことがよくあります。では、どのようなキーワード戦...
みなさんこんにちは。私はA Yuです。今日は例を使って、BaiduのキーワードランキングとGoogl...
Hosthatch は、今年の特別なブラックフライデー プロモーションを開始しました。通常のクラウド...
「930改革」から2年後、テンセントの様相はまったく新たな変化を遂げ始めた。 Cエンドでの核心の粘り...
[51CTO.comからのオリジナル記事] インターネット産業の急速な発展に伴い、IT研究開発の作業...
ウィッシュリストのウェブサイトでは、ユーザーは欲しい商品を説明することで、該当する商品のクーポンを入...
メディアのインタビュー記事の要約の中で、Google のスタッフは、一般的にウェブサイトのランキング...
すべてのウェブサイトは、ウェブサイトのプロモーションと外部リンクの構築という問題に直面しています。外...
sharedspace は、2008 年に設立されたイギリスの新興企業です。主な業務は、仮想ホスティ...
Amazon グループ会社の Amazon Web Services, Inc. (AWS) は本日...
百度の目に「ブランド」という言葉を植え付けたのは誰でしょうか。私たちのインターネット生活にブランドの...
ウェブサイトを構築する前に、ウェブマスターはウェブサイトのテーマを計画し、ウェブサイトのターゲット潜...
2008年からウェブサイト構築の波が吹き荒れ、その流れに沿ってローカルウェブサイトが徐々に設立されま...