クラウド原生技術のDocker入門


1.なぜ容器が必要なのか.
次の図は、従来のソフトウェアアーキテクチャを示しています.
Javaをしたことがある学生は、上図のアーキテクチャの方法をよく知っているかもしれません.私たちは通常、アプリケーションをwarパッケージを生成し、tomcatコンテナに入れ、仮想マシン(VM)で実行を開始し、nginxの負荷等化ポリシーを構成し、ユーザーからの要求をtomcatアプリケーションに転送します.このようなホストまたは仮想マシンベースのアプリケーションでは、次のような問題が発生します.
移植性が悪い
javaアプリケーションに必要なjdkやjreなど、アプリケーションを事前にインストールする必要があります.アプリケーションを再配置する必要がある場合は、環境を再初期化してアプリケーションをインストールする必要があります.プロセスが煩雑です.また、1つのアプリケーションがjdk 7の実行環境を必要とし、もう1つのアプリケーションがjdk 8を必要とする場合、1台のホストでは満足しにくい.
保守性が悪い
tomcatアプリケーション自体または存在する仮想マシンオペレーティングシステムに問題が発生した場合、nginx転送ルールの構成、再起動操作の実行など、手動で介入する必要があります.
拡張性に劣る
アプリケーションの負荷は高くて低くて、安定していないで、現在のアプリケーションの負荷が大きい時、私達はアプリケーションの数量を増やす必要があって、アプリケーションの負荷が下がる時、私達はアプリケーションの数量を下げる必要があります;
リソース分離不可
1台の仮想マシンが複数のアプリケーションを導入すると、異なるアプリケーションまたはプロセスが相互に影響します.
...
次に、これらの問題をどのように一歩一歩解決しているのかを見てみましょう.
まず容器化ですが、私たちが選んだ案はDockerです.
Dockerはアプリケーションとそのプログラムの依存をコンテナミラーにパッケージ化し、このファイルを実行すると仮想コンテナが生成されます.プログラムはこの仮想コンテナで実行され、まるで実際の物理マシンで実行され、各コンテナ間のリソースが互いに隔離され、独自のファイルシステムがあります.これにより、コンテナ間のプロセスは相互に影響しません.次の図では、仮想マシンベースとコンテナベースの導入アプリケーションの違いを比較できます.
 
2.Dockerの紹介
2.1 Dockerアーキテクチャ
Dockerは、クライアント・サーバ・アーキテクチャのアプリケーションです.主に次のセクションで構成されています.
サービス側はdockerdデーモンという名前のプロセスで、REST APIリクエストをリスニングし、ミラー、コンテナ、ストレージボリューム、ネットワークなどのDockerオブジェクトを管理します.
コマンドラインクライアント(CLI)、すなわち、通常コンソールで入力するdockerコマンドラインは、REST APIを呼び出してDocker daemonを制御したり、統合したりします.
ミラーウェアハウス(Docker Registries)、ミラーウェアハウスはDockerミラーを格納します.
以下はDockerのスキーマの概略図です.
 
2.2 Dockerオブジェクト
IMAGES
ミラーは、コンテナを生成するためにコマンドによって作成される読み取り専用ファイルです.一般的に1つのミラーは、別のミラーに基づいて追加の命令を追加して作成され、Dockerfileというファイルからミラーを生成することができ、Dockerfile内の各行の命令によってレイヤ(layer)が生成されます.Dockerfileが変更されてミラーを再生成する必要がある場合、変更されたレイヤを再生成するだけで、ミラーファイルをより軽量化し、迅速に構築できます.
CONTAINERS
コンテナは、ミラーファイルによって生成された実行インスタンスです.REST APIまたはdocker clientを使用して、コンテナを作成、起動、停止、移動、または削除できます.
SERVICE
複数のコンテナを管理および拡張するにはdocker swarmと一緒に作業する必要があります
2.3基礎技術
Dockerはgo言語で記述され、Linuxカーネルのいくつかの特性を使用してその機能を実現しています.主に以下の通りです.
Namespaces
DockerはNamespacesによって独立したワークスペース(Workspace)を提供します.コンテナを実行すると、Dockerはこのコンテナにいくつかの異なるタイプのNamespacesを作成します.主に次のタイプがあります.
pid namespace:プロセス分離機能の提供 
Netnamespace:ネットワークインタフェースの管理 
ipc namespace:内部資源アクセス制御(IPC:Inter Process Communication) 
mnt namespace:管理ファイルシステムマウント 
 uts namespace:カーネル分離およびバージョン識別(UTS:Unix TimesharingSystem)
CGroups(Control Groups)
DockerはCGroupによってコンテナが特定のリソースしか使用できないことを制限します.たとえば、Dockerは、コンテナがどれだけのcpuおよびメモリリソースしか使用できないかを制限できます.
UnionFS(Union File System)
別のファイルシステムで実行でき、異なるレイヤを作成することでコンテナファイルシステムをより軽量かつ高速にするファイルシステムタイプ.AFS、btrfs、vfs、DeviceMapperなど、他にもいくつかの類似のファイルシステムがあります.
3.Dockerのインストールの導入
次のコマンドはCentos 7のコマンドです.他のOSではいくつかの違いがあります.
yum install docker:  yum  docker     
systemctl enable docker:     systemctl 
start docker:   docker  

上記の操作を実行すると、dockerサービスが実行され、docker versionコマンドとdocker infoコマンドを実行してdockerのバージョンと関連情報を表示できます.
4.Dockerの使用
4.1 Dockerfileファイル
Dockerがアプリケーションをミラーにパッケージ化できるという話はありましたが、ミラーファイルを生成するにはどうすればいいのでしょうか.Dockerfileファイルが必要です.ミラーを構成するテキストファイルで、Dockerはそのファイルに基づいてバイナリのミラーファイルを生成します.Dockerfileファイルの例を次に示します.
#           nginx  ,      ,     latest,       
FROM nginx:latest
#  _book      copy      /var/www/public  
COPY _book /var/www/public/
COPY  nginx_app.conf/etc/nginx/conf.d/ nginx_app.conf
#     8080      ,          
EXPOSE 8080
#         nginx -g daemon off   
CMD ["nginx", "-g", "daemon off;"]

4.2ミラーファイルの作成
Dockerfileファイルがあれば、docker buildコマンドでミラーファイルを作成できます.
docker build -t zcloud-document:0.0.1.
docker image ls

実行に成功すると、新しく生成されたミラーファイルzcloud-documentが表示されます.
4.3生成容器
#     
docker run -p 8080:8080 -it zcloud-document:0.0.1
docker ps
#             ,        
docker tag zcloud-document:0.0.1 10.0.0.183:5000/zcloud/zcloud-document:0.0.1
#          
docker push 10.0.0.183:5000/zcloud/zcloud-document:0.0.1

Dockerの他の操作コマンドについては、自分で調べることができます.ネット上で紹介されている文章も多いので、参考記事:Docker入門チュートリアル(https://docs.docker.com/get-started/)