|
リッチWebの時代において、アプリケーションはますます強力になる一方で、複雑化も進んでいます。クラスタのデプロイメント、分離された環境、カナリアリリース、そして動的なスケーリングはいずれも不可欠であり、コンテナ化はそれらをつなぐ重要な架け橋となっています。 このセクションでは、 Dockerの神秘的な世界を探求し、 Docker基本原理と実用的な応用をゼロから習得します。狭いフロントエンド開発領域に閉じこもるのではなく、視野を広げる時が来ました。 1. お話をしましょうDockerとは何かをより深く理解するために、まずは次の話から始めましょう。
家を建てる必要があったので、石を運び、木を切り、設計図を描き、そして家を建て始めました。たくさんの作業を経て、ついに家が完成しました。 その結果、しばらくそこに住んでいた頃、突然海辺に引っ越したいという衝動に駆られました。この時点では、いつも通り海辺に行って石を運び、木を切り、設計図を描き、また家を建てることしかできませんでした。
落ち込んでいた時に、魔術師が現れて呪文を教えてくれました。その呪文は、私が建てた家の複製、つまり「鏡像」を作り、それをバックパックに入れるというものだったんです。
黒魔術 ビーチに着いたら、この「鏡」を使って家をコピーし、すぐに引っ越します。 すごいと思いませんか?このプロジェクトでは、家がプロジェクトそのもの、画像がプロジェクトのコピー、バックパックが画像リポジトリを表しています。動的に拡張するには、リポジトリからプロジェクト画像を取得してコピーするだけです。一度ビルドすれば、どこでも実行できます! バージョン、互換性、デプロイメントの問題などを心配する必要がなくなり、「起動直後にクラッシュし、ビルドが無限に続く」という厄介な問題が完全に解決されます。 II. 仮想マシンとコンテナ始める前に、いくつかの基本的な知識を確認しましょう。 1.仮想マシン:仮想化ハードウェア Virtual Machineマシン(VM)は、ソフトウェアによってシミュレートされた完全なコンピュータシステムであり、ハードウェアシステムの完全な機能を備え、完全に分離された環境で実行されます。物理コンピュータで実行できるすべてのタスクは、VMでも実行できます。
コンピュータ内に仮想マシンを作成する際、物理マシンのハードドライブとメモリ容量の一部が、仮想マシンのハードドライブとメモリ容量として使用されます。各仮想マシンはそれぞれ独立したCMOS 、ハードドライブ、オペレーティングシステムを持ち、物理マシンと同様に操作できます。コンテナ技術が登場する以前は、仮想マシンは業界で最もホットな話題でした。 VMWareとOpenStack仮想マシン技術の代表的な例です。詳細については、以下をご覧ください。 https://baike.baidu.com/item/%E8%99%9A%E6%8B%9F%E6%9C%BA/104440?fr=アラジン
2.コンテナ: オペレーティング システム層を仮想化する標準ソフトウェア ユニットです。 - どこでも実行: コンテナーは、コード、構成ファイル、および関連する依存関係をパッケージ化して、あらゆる環境で一貫した操作を保証できます。
- 高いリソース使用率: コンテナーはプロセス レベルの分離を提供し、
CPUとメモリの使用量をより細かく設定できるため、サーバーのコンピューティング リソースをより有効に活用できます。 - 迅速なスケーリング: 各コンテナは個別のプロセスとして実行でき、基盤となるオペレーティング システムのシステム リソースを共有できるため、コンテナの起動とシャットダウンが高速化されます。
3.相違点とつながり - 仮想マシンは多数の「サブコンピュータ」を分離できますが、より多くのスペースを占有し、起動も遅くなります。VMwareなどの
VMWareマシンソフトウェアは、追加コストが発生する場合もあります。 - コンテナ テクノロジでは、オペレーティング システム全体を仮想化する必要はなく、「サンドボックス」に似た小規模な環境を仮想化するだけで済みます。
- ランタイム スペースに関しては、仮想マシンでは通常、数
GBから数十GBのスペースが必要ですが、コンテナーではMBまたはKBしか必要ありません。
比較データを見てみましょう: コンテナは、基盤となるLinuxオペレーティングシステムを活用して分離された環境で実行されるため、仮想マシンと比較して軽量かつ高速です。仮想マシンのHypervisor 、アプリケーションの侵入を防ぐために非常に強固な境界を構築しますが、コンテナの境界はそれほど強固ではありません。 物理マシンのデプロイメントではリソースを最大限に活用できず、リソースの無駄が生じます。一方、仮想マシンのデプロイメントでは、それ自体が大量のリソースを消費するため、無駄が生じ、仮想マシンのパフォーマンスも低下します。しかし、コンテナ化されたデプロイメントは、より柔軟で軽量であり、優れたパフォーマンスを提供します。 仮想マシンは仮想化技術に属し、Docker などのコンテナ技術は軽量仮想化に属します。 III. Dockerを理解するドッカー 1. コンセプト Dockerはオープンソースのアプリケーションコンテナエンジンです。開発者はこれを使用することで、アプリケーションと依存関係をポータブルなコンテナにパッケージ化できます。このコンテナは、一般的なLinuxマシンにデプロイできるため、効果的な仮想化を実現できます。コンテナは完全にサンドボックス化されており、相互にインターフェースはありません。
Dockerテクノロジーの3 つのコア概念は、 Image 、 Container 、 Repositoryです。 2. Docker軽量なのはなぜですか? 次のような疑問も湧くかもしれません。Docker Dockerなぜこんなに早く起動するのでしょうか? どのようにしてホストマシンとカーネルを共有するのでしょうか? Dockerにコンテナの実行を要求すると、 Dockerコンピュータ上にリソースが分離された環境を構築します。次に、パッケージ化されたアプリケーションと関連ファイルをNamespace内のファイルシステムにコピーし、環境設定を完了します。その後、 Docker事前に指定されたコマンドを実行してアプリケーションを実行します。 イメージには動的なデータは含まれておらず、ビルド後にその内容は変更されません。 IV. コアコンセプト1. Build, Ship and Run 。 2. Build once, Run anywhere 。 3. Docker自体はコンテナではなく、コンテナを作成するためのツール、つまりアプリケーション コンテナ エンジンです。 4. Docker 3 つのコア概念は、 Image 、 Container 、 Repositoryです。 5. Dockerテクノロジーは、 Linuxカーネルとカーネル機能 ( Cgroupsやnamespacesなど) を使用してプロセスを分離し、各プロセスが他のプロセスから独立して実行できるようにします。 6. NamespaceとCgroups Linuxでのみ利用可能なため、コンテナは他のOSでは実行できません。では、 Docker macOSやWindowsでどのように動作するのでしょうか? Docker実際にはあるトリックを使っています。Linux LinuxのOSにLinux仮想マシンをインストールし、その仮想マシン内でコンテナを実行します。また、WeChat公式アカウントで「python AI technology」を検索し、「classic works」と返信すると、サプライズギフトがもらえます。 7. イメージとは、アプリケーションの実行に必要なコード、ランタイム、ライブラリ、環境変数、および設定ファイルを含む実行可能パッケージです。コンテナとは、イメージのランタイムインスタンスです。 V. Dockerをインストールする1. コマンドラインインストール Homebrew CaskすでにDocker for Macサポートしているため、次のコマンドを実行するだけで、 Homebrew Cask使用して簡単にインストールできます。
brew cask インストール docker 詳細なインストール手順については、公式ドキュメントを参照してください。 https://www.docker.com/get-started
2. バージョンを確認する ドッカー-v 3. 画像アクセラレーションを設定する 構成を書き込むために Docker Engine を構成します。 { 「レジストリミラー」 : [ 「 http://hub-mirror.c.163.com/」 「https://registry.docker-cn.com」 ] 、 「安全でないレジストリ」 : [ ] 、 「実験的」 : 偽 「デバッグ」 : true } 4. デスクトップクライアントをインストールする Dockerデスクトップ デスクトップアプリケーションの使い方は非常に簡単で、公式サイトからダウンロードするだけです。Dockerデスクトップアプリケーションを使用するとDockerアプリケーションを簡単に操作できます。 - クローン: プロジェクトをクローンする
- ビルド: パッケージイメージ
- run: インスタンスを実行する
- share: 共有ミラー
さあ、準備はすべて完了です。さあ、あなたのスキルを披露しましょう! VI. クイックスタートDockerをインストールしたら、実際のプロジェクトのイメージを構築して、実践しながら学習しましょう。
1. まず、使用する11コマンドの概要を理解する必要があります。
2.新しいプロジェクト 速度を上げるために、 Vueスキャフォールディングを直接使用してプロジェクトをビルドします。 Vue Create Docker -デモ 起動してみます: 糸サーブ アクセスアドレス: http://localhost:8080/ 。プロジェクトの準備ができました。次にパッケージ化します。 糸のビルド この時点で、プロジェクトディレクトリの下のDistディレクトリには、デプロイに必要な静的リソースが含まれています。次のステップに進みましょう。 注:フロントエンドプロジェクトは一般的に2つのカテゴリに分類されます。Nginx Nginx使用して静的にデプロイされるものと、 Nodeサービスを必要とするものです。このセクションでは、前者についてのみ考察します。 3.新しいDockerfileを作成する cd docker -デモ&& touch Dockerfile 現時点でのプロジェクトディレクトリは次のとおりです。 。 ├── Dockerファイル ├── README .md ├── babel.config.js ├── ディストリクト ├── ノードモジュール ├── パッケージ.json ├── 公開 ├── ソース └── 糸.ロック ご覧のとおり、 docker-demoディレクトリにDockerfile正常に作成されました。 4. Nginxイメージを準備する Dockerデスクトップクライアントを実行すると、デフォルトでインスタンスが起動します。コンソールからNginxイメージを取得します。
docker pull nginx コンソールには次の情報が表示されます。 デフォルトタグ「最新」を使用 最新: library/nginx からプル 8559a31e96f4: プル完了 8d69e59170f7: プル完了 3f9f1ec1d262: プル完了 d1f5ff4f210d: プル完了 1e22bfa8652e: プル完了 ダイジェスト: sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133 ステータス: nginx:latest の新しいイメージをダウンロードしました docker.io/ライブラリ/nginx:最新 このエラーが発生した場合は、 Dockerインスタンスが正しく実行されていることを確認してください。 unix:///var/run/docker.sock にある Docker デーモンに接続できません。Docker デーモンは実行されていますか? イメージのOKができました。ルートディレクトリにNginxの設定ファイルを作成します。 default.conf をタッチする 書く: サーバー { 80を聞く; server_name ローカルホスト;
#文字セット koi8-r; access_log /var/log/nginx/host.access.log メイン; error_log /var/log/nginx/error.log エラー;
位置 / { ルート /usr/share/nginx/html; インデックス index.html index.htm; }
エラーページ 500 502 503 504 /50x.html; 場所 = /50x.html { ルート /usr/share/nginx/html; } } 5.イメージを設定する Dockerfile開き、次の内容を記述します。
nginx から dist/ /usr/share/nginx/html/ をコピーする default.conf を /etc/nginx/conf.d/default.conf にコピーします。 コードを1行ずつ説明してみましょう。 -
FROM nginxイメージがnginx:latestイメージに基づいて構築されることを指定します。 - コマンド
COPY dist/ /usr/share/nginx/html/は、プロジェクト ルート ディレクトリの下のdistフォルダ内のすべてのファイルをイメージ内の/usr/share/nginx/html/ディレクトリにコピーすることを意味します。 -
COPY default.conf /etc/nginx/conf.d/default.conf Nginxイメージ内のdefault.conf設定をローカルのdefault.conf設定に置き換えetc/nginx/conf.d/default.conf 。
6.イメージを構築する Docker buildコマンドを使用してイメージをビルドします。
docker build -t jartto-docker-demo 。 いつも通り、上記のコードを説明しましょう。 -
-tパラメータはイメージ名をjartto-docker-demoとする - イメージは現在のディレクトリ内の
Dockerfileに基づいて構築されます.
実行が成功すると、次の出力が提供されます。 ビルドコンテキストをDockerデーモンに送信しています 115.4MB ステップ 1/3 : nginx から ---> 2622e6cca7eb ステップ 2/3 : dist/ /usr/share/nginx/html/ をコピーする ---> キャッシュの使用 ---> 82b31f98dce6 ステップ 3/3 : default.conf をコピーする /etc/nginx/conf.d/default.conf ---> 7df6efaf9592 7df6efaf9592 を正常に構築しました jartto-docker-demo:latest のタグ付けに成功しました イメージの作成に成功しました!コンテナを確認しましょう: docker イメージ ls | grep jartto-docker-demo ご覧のとおり、 133MBプロジェクト イメージが生成されました。 jartto-docker-demo 最新 7df6efaf9592 約1分前 133MB ミラーの品質にもばらつきがありますが、最適化の方法については後ほど説明しますので、今は無視してください。(拡張:フリーランスの仕事を引き受ける) 7.コンテナを実行する docker run -d -p 3000:80 --name docker-vue jartto-docker-demo パラメータの説明は次のとおりです。 -
-dコンテナをバックグラウンドで実行するように設定します。 -
-pポートマッピングを示し、ローカルマシンのポート3000 containerのポート80にマッピングします(これにより、外部ネットワークからローカルマシンのポート3000を介してアクセスできるようになります)。さらに、WeChat公式アカウント「Programming Technology Circle」を検索し、「神器」(魔法の道具)と返信すると、サプライズギフトパックがもらえます。 -
--nameコンテナ名docker-vueを設定します jartto-docker-demo 、上記で構築したイメージの名前です。
もう1点: コンソールでは、 docker psを使用して、新しく実行されたContainerのID表示できます。 docker ps -a コンソールには次のように出力されます: コンテナID イメージ コマンド 作成ステータス ポート名 ab1375befb0b jartto-docker-demo "/docker-entrypoint.…" 8分前 7分前にアップ 0.0.0.0:3000->80/tcp docker-vue デスクトップ バージョンを使用している場合は、次の画像に示すように、 Docker Dashboardを開いてコンテナー リストを表示できます。 8.アクセスプロジェクト ローカルマシンにポート3000をマップしているので、次を実行します。 curl -v -i ローカルホスト:3000 または、ブラウザを開いてlocalhost:3000にアクセスしてください。 9.ミラーを公開する コミュニティに貢献したい場合は、他の開発者が使用できるようにミラーを公開する必要があります。 ミラーを展開するには、次の手順が必要です。 -
[dockerhub](https://hub.docker.com)にログインしてアカウントを登録します。 - コマンドラインで
docker login実行し、ユーザー名とパスワードを入力してログインします。 - イメージをプッシュする前に、
docker tag <image> <username>/<repository>:<tag>を実行してTagを追加する必要があります。
これで全てのプロセスが完了しました。これからは、Dockerを使えば「石を運び、木を切り、設計図を描き、家を建てる」といった作業は不要になります。荷物を詰めて、そのまま引っ越しできるのです。これがdocker魅力です。 VII. 日常業務Docker入門プロジェクト完了おめでとうございます!さらに詳しく知りたい方は、ぜひ読み進めてください。
1. パラメータの使用 - ベースイメージを指定します。ビルドされるすべてのイメージにはベースイメージが必要であり、
FROMコマンドはDockerfile -
FROM <image> [AS <name>]既存のイメージから構築される新しいイメージの名前を指定します。 -
FROM <image>[:<tag>] [AS <name>]イメージのバージョンを指定しますTag - 例:
FROM mysql:5.0 AS database
-
MAINTAINER - ミラーメンテナーの情報
MAINTAINER <name>- 例:
MAINTAINER Jartto [email protected] -
RUN - イメージをビルドするときに実行されるコマンド
RUN <command>- 例:
RUN ["executable", "param1", "param2"] -
ADD - ローカル ファイルをコンテナーに追加してコピーすると、圧縮ファイルが解凍され、ネットワーク ファイルへのアクセスが許可され、ファイルは自動的にダウンロードされます。
-
ADD <src> <dest> - 例:
ADD *.js /appコンテナ内のappディレクトリにjsファイルを追加する COPY-
ADDと同じように機能し、コピーのみを行います。ファイルの解凍やダウンロードは行いません。 -
CMD - コンテナの起動後に実行されるコマンドは、
RUNで実行されるコマンドとは異なります。 RUNイメージをビルドするときに実行されるコマンドです。 - これは
docker runを使用してコンテナを実行するときに、コマンド ラインで上書きできます。 - 例:
CMD ["executable", "param1", "param2"] -
ENTRYPOINT - また、
CMDと同様にコマンドも実行しますが、これらのコマンドはコマンド ラインによって上書きされません。 -
ENTRYPOINT ["executable", "param1", "param2"] - 例:
ENTRYPOINT ["donnet", "myapp.dll"] -
LABEL : key-value形式でイメージにメタデータを追加します。 -
LABEL <key>=<value> <key>=<value> ... - 例:
LABEL version="1.0" description="这是一个web应用" -
ENV : 環境変数を設定します。一部のコンテナでは、実行に特定の環境変数が必要です。 -
ENV <key> <value>は一度に 1 つの環境変数を設定します。 -
ENV <key>=<value> <key>=<value> <key>=<value>複数の環境変数を設定します - 例:
ENV JAVA_HOME /usr/java1.8/ -
EXPOSE : 外部に公開されるポート (コンテナ内のプログラムのポート。ホストマシンのポートと同じになることもありますが、実際には 2 ポート システムです)。 -
EXPOSE <port> - 例:
EXPOSE 80 - コンテナの実行中は、コンテナ内のポートにアクセスするために、
-pオプションを使用して外部ポートをマップする必要があります。 -
VOLUME : データが保存されるディレクトリを指定します。正式用語は「マウント」です。 -
VOLUME /var/logコンテナにマウントするディレクトリを指定します。このディレクトリは、データの永続性と同期を実現するために、ホストマシン上のランダムなディレクトリにマッピングされます。 -
VOLUME ["/var/log","/var/test".....]ディレクティブは、コンテナ内でマウントする必要がある複数のディレクトリを指定します。これにより、これらのディレクトリがホストマシン上の複数のランダムなディレクトリにマッピングされ、データの永続性と同期が実現されます。 -
VOLUME /var/data var/logディレクティブは、コンテナ内のvar/logディレクトリをホストマシン上の/var/dataディレクトリにマウントすることを指定します。このディレクティブを使用すると、ホストマシン上のディレクトリを手動で指定できます。 -
WORKDIR : 作業ディレクトリを設定します。設定後は、 RUN、CMD、COPY、ADDの作業ディレクトリが同期的に変更されます。 -
WORKDIR <path> - 例:
WORKDIR /app/test -
USER : コマンド実行時に使用するユーザーを指定します。セキュリティと権限上の理由から、実行するコマンドに応じて異なるユーザーが選択されます。 -
USER <user>:[<group>] - 例:
USER test -
ARG : イメージを構築するときに渡されるパラメータを設定します。 -
ARG <name>[=<value>] -
ARG name=sss
詳細な手順については、公式ユーザードキュメントを参照してください。 https://docs.docker.com/
VIII. ベストプラクティスDocker基本的な操作を習得すれば、必要なプロジェクトイメージを簡単に作成できます。ただし、操作方法が異なると、作成されるイメージは大きく異なります。
鏡像の違いの原因を引き続き探ってみましょう。 以下はDockerを使用する際のベストプラクティスです。これらのガイドラインに従うようにしてください。 -
Require : 必要な画像を指定します。 - 合理化された手順: バリエーションの少ない
Stepを優先する - バージョン指定: イメージ名指定
- ドキュメント: イメージのパッケージ化プロセス全体を再現できます。
次の 2 つの記事をお勧めします。 - https://www.docker.com/blog/intro-guide-to-dockerfile-best-practices/
- https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
IX. 結論コンテナ化技術はクラウド時代に間違いなく不可欠なスキルとなり、 Dockerそのほんの一滴に過ぎません。それに伴い、クラスタコンテナ管理のK8s 、 Service Mesh 、 Istioといった技術も登場しています。Docker Docker扉を開き、レイヤーを剥がし、さらに深く掘り下げていくことで、コンテナ化の無限の魅力を体験できるでしょう。 |