DUICUO

フロントエンド開発者向けの究極の Docker 初心者ガイド: Docker の使い方が分からないと言うのはやめましょう。

リッチ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アプリケーションを簡単に操作できます。

  1. クローン: プロジェクトをクローンする
  2. ビルド: パッケージイメージ
  3. run: インスタンスを実行する
  4. 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を使用して、新しく実行されたContainerID表示できます。

 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​
  • ベースイメージを指定します。ビルドされるすべてのイメージにはベースイメージが必要であり、 ​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​を使用する際のベストプラクティスです。これらのガイドラインに従うようにしてください。

  1. ​Require​ : 必要な画像を指定します。
  2. 合理化された手順: バリエーションの少ない​Step​を優先する
  3. バージョン指定: イメージ名指定
  4. ドキュメント: イメージのパッケージ化プロセス全体を再現できます。

次の 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​扉を開き、レイヤーを剥がし、さらに深く掘り下げていくことで、コンテナ化の無限の魅力を体験できるでしょう。