詳細な紹介、Dockerイメージの構造と原理

Dockerイメージの構造と原理

詳細な紹介、Dockerイメージの構造と原理

ドッカー画像:

  • コンテナ作成のテンプレートであるミラーには、コンテナの起動に必要なファイルシステムとコンテンツが含まれているため、ミラーは主にコンテナの作成と起動に便利かつ迅速に使用されます。
  • ミラーは、自分で作成することも、他の人のミラーに基づいて作成することもできます。私たちがよく言う「ubuntu」画像は、実際には画像名ではなく、ubuntuという名前のリポジトリを表します。同時に、このリポジトリの下に一連のタグ付き画像があります。

この画像には、Union FS(Union FS)と呼ばれる階層化されたファイルシステムが含まれています。これは、ディレクトリの複数の層を一緒にマウントして(層状のケーキ、タマネギ、マトリオシュカのように)形成できます仮想ファイルシステム。仮想ファイルシステムのディレクトリ構造は、通常のLinuxのディレクトリ構造と同じです。イメージは、これらのファイルとホストマシンのカーネルを介してLinux仮想環境を提供します。ファイルシステムの各レイヤーはレイヤーと呼ばれます。共同ファイルシステムは、ファイルシステムの各レイヤーに、読み取り専用(読み取り専用)、読み取りと書き込み(読み取り/書き込み)、および書き込み(ホワイトアウト可能)の3つのアクセス許可を設定できますが、ミラー内のファイルシステムの各レイヤーは読み取り専用です。ミラーリングする場合、最も基本的なオペレーティングシステムから始めて、各建設提出操作は、変更のレイヤーを作成し、ファイルシステムのレイヤーを上にレイヤーごとに追加することと同等であり、上層が下層をカバーします。上層が下層を覆っているのと同じように、視認性を理解するのは簡単です。ミラーリングを使用すると、全体が表示されるだけです。内部にある層の数はわかりません。実際に内部に何があるかを知る必要はありません。いくつかのレイヤーがあり、構造は次のとおりです。

画像とコンテナを区別する必要があることに注意してください

Dockerの用語、読み取り専用の画像レイヤーが参照され、永続的な画像は変更されないため、画像はステートレスです。コンテナは、ミラーレイヤーの上に書き込み可能なレイヤーを追加します。この書き込み可能なレイヤーには、CPUで実行されているプロセスがあり、実行状態と終了状態の2つの異なる状態があります。コンテナが起動すると、Dockerコンテナは実行状態になり、コンテナが停止すると、終了状態になります。実行中のDockerコンテナーがある場合、実行状態から停止状態まで、この時点での状態変更はコンテナーのファイルシステムに永続的に書き込まれます。コンテナへの変更は、Dockerイメージではなく、コンテナのファイルシステムに書き込まれることに注意してください。Dockerイメージは読み取り専用であり、変更されることはありません。
同じイメージで複数のDockerコンテナを起動できます。これらのコンテナは、起動後にすべてアクティブになり、互いに分離されます。コンテナの1つに加えられた変更は、コンテナ自体にのみ制限されます。

詳細な紹介、Dockerイメージの構造と原理

一般的なLinuxファイルシステムは、bootfsとrootfsの2つの部分で構成されています
。Bootfs(ブートファイルシステム)には、主にブートローダーとカーネルが含まれます。ブートローダーは、主にカーネルの起動とロードに使用されます。Linuxが起動すると、bootfsファイルシステムがロードされます。ブートロードが完了すると、カーネルがロードされます。システムの制御を引き継ぐためにメモリにロードされた後、bootfsはアンマウントされます

rootfs(ルートファイルシステム)には、一般的なLinuxシステムの/ dev、/ proc、/ bin、/ etcなどの標準ディレクトリとファイルが含まれています。さまざまなLinuxディストリビューション(ubuntuやCentOSなど)には、主にrootfsレイヤーがあります。違い。
一般的なミラーは通常比較的小さいです。公式のUbuntuミラーは60MBを超えていますが、CentOSベースミラーは約200MBです。他のバージョンのミラーは数MBです。たとえば、busyboxはわずか1.22MB、アルパインミラーは約5Mです。 。イメージはホストマシンのカーネルを直接呼び出し、rootfsのみがイメージで提供されます。つまり、最も基本的なコマンド、構成ファイル、プログラムライブラリ、およびその他の関連ファイルを含めるだけで済みます。

次の図は、ホストカーネルに異なるrootfsを実装する2つの異なるミラーがあることを示しています。

詳細な紹介、Dockerイメージの構造と原理

上の図では、DebianとBusyBoxは上位層に独自のrootfsを提供し、下位層でDockerHostカーネルを共有しています。

注:ベースイメージはユーザースペースのリリースバージョンとのみ一致し、カーネルバージョンとヘアスタイルバージョンは異なります。**カーネルバージョンはホストによって異なります*

[root@docker ~]# uname -r
3.10.0-514.el7.x86_64                 ##Host kernel 为 3.10.0-514
[root@docker ~]# docker run -ti centos    ##启动并进入 CentOS 容器
[root@docker ~]# cat /etc/redhat-release   ##验证容器是 CentOS 7
CentOS Linux release 7.4.1708 (Core)
[root@docker ~]# uname -r      ##容器的 kernel 版本与 Host 一致
3.10.0-514.el7.x86_64

コンテナ、画像、親画像の関係:

詳細な紹介、Dockerイメージの構造と原理

詳細な紹介、Dockerイメージの構造と原理
ご覧のとおり、新しい画像はベース画像からレイヤーごとに生成されます。ソフトウェアがインストールされるたびに、既存のイメージにレイヤーが追加されます。

これの最大の利点はリソース共有です

コンテナの書き込み可能なレイヤー

コンテナが起動すると、新しい書き込み可能なレイヤーが画像の上に読み込まれます。この層は通常「コンテナ層」と呼ばれ、「コンテナ層」の下の層は「ミラー層」と呼ばれます。

詳細な紹介、Dockerイメージの構造と原理

コンテナへのすべての変更-ファイルの追加、削除、または変更に関係なく、コンテナレイヤーでのみ発生します。
書き込み可能なのはコンテナレイヤーのみで、コンテナレイヤーの下のすべてのミラーレイヤーは読み取り専用です。
以下では、コンテナレイヤーの詳細について詳しく説明します。

  1. ファイルの追加
    コンテナにファイルが作成されると、新しいファイルがコンテナレイヤーに追加されます。

  2. ファイルの読み取りコンテナ内のファイルを読み取るとき、Dockerは各イメージレイヤーでファイルを上から下に検索します。見つかったら、開いてメモリに読み込みます。
  3. ファイルの変更
    コンテナ内の既存のファイルを変更する場合、Dockerは各イメージレイヤーでファイルを上から下に順番に検索します。見つかったら、すぐにコンテナレイヤーにコピーして、変更します。

  4. コンテナ内のファイル削除すると、Dockerはイメージレイヤー内のファイルも上から下に検索します。検出されると、削除操作がコンテナレイヤーに記録されます。

dockerが私たちにもたらすことができる利点

1.1。詳細な紹介、Dockerイメージの構造と原理

現在、アプリケーションAとアプリケーションBの2つのオペレーティングシステムがあります。これら2つは、最も伝統的な環境です。これらの2つのオペレーティングシステムは、いくつかの依存パッケージを実行し、対応するオペレーティング環境またはアプリケーションをそれらにインストールしてから、いくつかのアプリケーションを実行します。では、今回はどのように最適化する必要がありますか?

2.2。詳細な紹介、Dockerイメージの構造と原理

アプリケーションBのオペレーティングシステムを削除しました。このとき、アプリケーションBはアプリケーションAのオペレーティングシステムを使用します。これの利点は、アプリケーションBのオペレーティングリソース(オペレーティングシステム自体)が不要なことです。ただし、問題も発生します。たとえば、オペレーティングシステムに変更を加える必要がある場合、たとえば、/ etc / sysconfig /ファイルのIPアドレスを変更したいのですが、アプリケーションBは変更したIPアドレスをサポートできません。 、アプリケーションBがアプリケーションAを共有しているため、この時点で何かが発生したため、IPを変更する必要があります。このとき、空白のレイヤーを追加する必要があります。

3.3。詳細な紹介、Dockerイメージの構造と原理

空白のレイヤーを追加すると、空白のレイヤーには次のように表示されます。アプリケーションの優先度は最下層よりも大きい、つまり、空白のレイヤーの優先度は下のすべてのレイヤーよりも大きいため、アプリケーションAプログラムの空白のレイヤーに新しいIPを書き込みます。アプリケーションBプログラムの空白層でサポートできる古いIPを書き込みます。この場合、アプリケーションAは新しいIPであり、アプリケーションBは干渉のない古いIPです。また、各アプリケーションには独自の独立した空白レイヤーがあります。これらのいくつかのことはさらに完璧です。ただし、問題があります。アプリケーションAがダウンしている場合、すべてのアプリケーションがアプリケーションAに依存して存続するため、後続のアプリケーションB、C、Dなどは強制的に閉じられます。だから今回は下の写真を見る必要があります

4.4。詳細な紹介、Dockerイメージの構造と原理

依存アプリケーションのダウンタイムとそれに続くすべての依存アプリケーションのシャットダウンを回避するために、アプリケーション共有は使用しませんが、ミラーリングを介して共有します。アプリケーションは稼働しており、ミラーリングは停止しています。ミラーを削除しない限り、破損することはありません。したがって、私たちのオペレーティングシステムは、アプリケーションやすでに実行されている環境ではなく、ミラーによって提供されます。このイメージはパッケージ化されたオペレーティング環境であるため、すでに非常に美しく、アプリケーションAのイメージは壊れず、アプリケーションAのコンテナーも実行でき、対応するオペレーティングシステムレベルのリソースを節約し、さまざまな空白レイヤーを使用できます。さまざまな新しいデータを書き込んで、各アプリケーションに一貫性がないことを確認します。ただし、この時点で、別の問題が発見されます。つまり、アプリケーションAとアプリケーションBが異なるミラーを使用している場合です。多くのストレージリソースを消費しませんか?それでは、どうすればよいか見てみましょう

5.5。詳細な紹介、Dockerイメージの構造と原理

階層化するだけで、LNMPを構築していることを理解できます。最初の層には、centos 6.8などのLinuxカーネルが必要です。2番目の層にはnginxをインストールする必要があり、3番目の層にはphpをインストールし、4番目の層にはmysql5.0バージョンをインストールした後、ある日mysql5.5バージョンが必要になった場合はどうすればよいですか?この時点で、4番目のレイヤーを直接置き換えてmysql5.5バージョンに置き換えます。この場合、私たちの画像はファイルのように見えます。実際、それはファイルではなく、多数のサブファイルの組み合わせですが、対応する数には多くの制限があります。制限プールは128です。つまり、128レイヤーを超えることはできません。たとえば、この時点で新しいミラーを保存しました。このミラーにも多くのレベルがありますが、前のミラーと同じレイヤーがある場合、彼はこのミラーをスキップします。 、他のユーザーを直接ダウンロードすると、ストレージ容量が大幅に減少します。これは、階層型ストレージソリューションを最適化するための最後のステップです。

#范例:查看镜像的分层结构
[root@ubuntu1804 ~]#docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
8ec398bc0356: Pull complete
a53c868fbde7: Pull complete
79daf9dd140d: Pull complete
Digest: sha256:70821e443be75ea38bdf52a974fd2271babd5875b2b1964f05025981c75a6717
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

#查看镜像分层历史
[root@ubuntu1804 ~]#docker image history nginx
IMAGE        CREATED       CREATED BY               
   SIZE        COMMENT
0901fa9da894     9 days ago     /bin/sh -c #(nop) CMD ["nginx" "-g"
"daemon…  0B         
<missing>      9 days ago     /bin/sh -c #(nop) STOPSIGNAL SIGTERM 
    0B         
<missing>      9 days ago     /bin/sh -c #(nop) EXPOSE 80      
   0B         
<missing>      9 days ago     /bin/sh -c #(nop) ENTRYPOINT ["/docker-
entr…  0B         
<missing>      9 days ago     /bin/sh -c #(nop) COPY
file:0fd5fca330dcd6a7…  1.04kB       
<missing>      9 days ago     /bin/sh -c #(nop) COPY
file:1d0a4127e78a26c1…  1.96kB       
<missing>      9 days ago     /bin/sh -c #(nop) COPY
file:e7e183879c35719c…  1.2kB       
<missing>      9 days ago     /bin/sh -c set -x   && addgroup --
system -…  63.3MB       
<missing>      9 days ago     /bin/sh -c #(nop) ENV
PKG_RELEASE=1~buster   0B         
<missing>      9 days ago     /bin/sh -c #(nop) ENV NJS_VERSION=0.4.2
   0B         
<missing>      9 days ago     /bin/sh -c #(nop) ENV
NGINX_VERSION=1.19.1   0B         
<missing>      5 weeks ago     /bin/sh -c #(nop) LABEL
maintainer=NGINX Do…  0B         
<missing>      5 weeks ago     /bin/sh -c #(nop) CMD ["bash"]    
    0B         
<missing>      5 weeks ago     /bin/sh -c #(nop) ADD
file:4d35f6c8bbbe6801c…  69.2MB

[root@ubuntu1804 ~]#docker inspect nginx
[
 {
    "Id":
"sha256:0901fa9da894a8e9de5cb26d6749eaffb67b373dc1ff8a26c46b23b1175c913a",
    "RepoTags": [
      "nginx:latest"
   ],
    "RepoDigests": [
    
 "nginx@sha256:a93c8a0b0974c967aebe868a186e5c205f4d3bcb5423a56559f2f9599074bbcd"
   ],
    "Parent": "",
    "Comment": "",
    "Created": "2020-07-10T20:26:44.624785651Z",
    "Container":
"348c3ade7f4bdc0366f3f390ea4cfaebfb355ad7d621547eaf73728136d3bd2d",
    "ContainerConfig": {
      "Hostname": "348c3ade7f4b",
      "Domainname": "",
      "User": "",
      "AttachStdin": false,
      "AttachStdout": false,
      "AttachStderr": false,
      "ExposedPorts": {
        "80/tcp": {}
     },
      "Tty": false,
      "OpenStdin": false,
      "StdinOnce": false,
      "Env": [
      
 "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        "NGINX_VERSION=1.19.1",
        "NJS_VERSION=0.4.2",
        "PKG_RELEASE=1~buster"
     ],
      "Cmd": [
        "/bin/sh",
        "-c",
        "#(nop) ",
        "CMD [\"nginx\" \"-g\" \"daemon off;\"]"
     ],
      "ArgsEscaped": true,
      "Image":
"sha256:8a6dfc8c21a1b3f3679b7755fc7869a22b5f8583778cf7835b5ee5387a73ae5e",
      "Volumes": null,
      "WorkingDir": "",
      "Entrypoint": [
        "/docker-entrypoint.sh"
     ],
      "OnBuild": null,
      "Labels": {
        "maintainer": "NGINX Docker Maintainers <docker-
[email protected]>"
     },
      "StopSignal": "SIGTERM"
   },
    "DockerVersion": "18.09.7",
    "Author": "",
    "Config": {
      "Hostname": "",
      "Domainname": "",
      "User": "",
      "AttachStdin": false,
      "AttachStdout": false,
      "AttachStderr": false,
      "ExposedPorts": {
        "80/tcp": {}
     },
      "Tty": false,
      "OpenStdin": false,
      "StdinOnce": false,
      "Env": [
      
 "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        "NGINX_VERSION=1.19.1",
        "NJS_VERSION=0.4.2",
        "PKG_RELEASE=1~buster"
     ],
      "Cmd": [
        "nginx",
        "-g",
        "daemon off;"
     ],
      "ArgsEscaped": true,
      "Image":
"sha256:8a6dfc8c21a1b3f3679b7755fc7869a22b5f8583778cf7835b5ee5387a73ae5e",
      "Volumes": null,
      "WorkingDir": "",
      "Entrypoint": [
        "/docker-entrypoint.sh"
     ],
      "OnBuild": null,
      "Labels": {
        "maintainer": "NGINX Docker Maintainers <docker-
[email protected]>"
     },
      "StopSignal": "SIGTERM"
   },
    "Architecture": "amd64",
    "Os": "linux",
    "Size": 132484492,
    "VirtualSize": 132484492,
    "GraphDriver": {
      "Data": {
        "LowerDir":
"/var/lib/docker/overlay2/87dfa2bbff4f392e64e8a2fce11e2d9b8c3fffcfd51c6721ef0103
f7d6b525aa/diff:/var/lib/docker/overlay2/925c1a9c01939d111b3f0576608ad02a09bceea
fb6cad8dd616c24a59151bb25/diff:/var/lib/docker/overlay2/b9fd33e18d7bb7bb29b51ee3
99dfe3f21654fa4a9a086e02dcbc23f34f140c09/diff:/var/lib/docker/overlay2/35c6b8c39
68cdc21b78d4bcd6c192683b47db788db612dee04c5110037eed7af/diff",
        "MergedDir":
"/var/lib/docker/overlay2/23d3c6ecee136afe7137528b0e6997a488b1f277e86c794fa9a70b
5638a5d3f9/merged",
        "UpperDir":
"/var/lib/docker/overlay2/23d3c6ecee136afe7137528b0e6997a488b1f277e86c794fa9a70b
5638a5d3f9/diff",
        "WorkDir":
"/var/lib/docker/overlay2/23d3c6ecee136afe7137528b0e6997a488b1f277e86c794fa9a70b
5638a5d3f9/work"
     },
      "Name": "overlay2"
   },
    "RootFS": {
      "Type": "layers",
      "Layers": [
      
 "sha256:13cb14c2acd34e45446a50af25cb05095a17624678dbafbcc9e26086547c1d74",
      
 "sha256:0e32546a8af0cd04ad451d6a9d22e650e500e5da3636a32648c9f5aca96a0ff7",
      
 "sha256:7ef35766ef7d5d3d958022405b308d5c105b41190e1b63b2037c4055c6950c9e",
      
 "sha256:4856db5e4f59384c413c20c46cd5403a860e1b07c8fdbad24df1ffd9209d44e7",
 "sha256:2808ec4a8ea71c2660284d06cf7e25354b70b58504edb46ac3e705fb7e6ea519"
     ]
   },
    "Metadata": {
      "LastTagTime": "0001-01-01T00:00:00Z"
   }
 }
]

[root@ubuntu1804 ~]#docker save nginx -o nginx.tar

[root@ubuntu1804 ~]#docker images
REPOSITORY     TAG         IMAGE ID      CREATED      
SIZE
nginx        latest       0901fa9da894     3 days ago    
127MB
alpine        3.11.3       e7d92cdc71fe     7 days ago    
 5.59MB
centos       centos8.1.1911   470671670cac     7 days ago    
237MB
busybox       latest       6d5fcfe5ff17     4 weeks ago    
1.22MB
hello-world     latest       fce289e99eb9     12 months ago   
1.84kB

[root@ubuntu1804 ~]#ll -h nginx.tar
-rw------- 1 root root 131M Jul 20 22:33 nginx.tar

[root@ubuntu1804 ~]#tar xf nginx.tar -C /data

[root@ubuntu1804 ~]#ll /data
total 60
drwxr-xr-x  8 root root  4096 Jul 20 22:34 ./
drwxr-xr-x 24 root root  4096 Jul 20 16:23 ../
-rw-r--r--  1 root root  7510 Jul 11 04:26
0901fa9da894a8e9de5cb26d6749eaffb67b373dc1ff8a26c46b23b1175c913a.json
drwxr-xr-x  2 root root  4096 Jul 11 04:26
0bb74fcd4b686412f7993916e58c26abd155fa10b10a4dc09a778e7c324c39a2/
drwxr-xr-x  2 root root  4096 Jul 11 04:26
517e3239147277447b60191907bc66168963e0ce8707a6a33532f7c63a0d2f12/
drwxr-xr-x  2 root root  4096 Jul 11 04:26
68c9e9da52d5a57ee196829ce4a461cc9425b0b920689da9ad547f1da13dbc9d/
drwxr-xr-x  2 root root  4096 Jul 11 04:26
d2cf0fc540bb3be33ee7340498c41fd4fc82c6bb02b9955fca2109e599301dbd/
drwxr-xr-x  2 root root  4096 Jul 11 04:26
f4bf863ecdbb8bddb4b3bb271bdd97b067dcb6c95c56f720018abec6af190c6e/
drwx------  2 root root 16384 Mar 18 09:49 lost+found/
-rw-r--r--  1 root root  509 Jan  1  1970 manifest.json
-rw-r--r--  1 root root   88 Jan  1  1970 repositories

[root@ubuntu1804 ~]#cat /data/manifest.json
[{"Config":"0901fa9da894a8e9de5cb26d6749eaffb67b373dc1ff8a26c46b23b1175c913a.jso
n","RepoTags":["nginx:latest"],"Layers":
["d2cf0fc540bb3be33ee7340498c41fd4fc82c6bb02b9955fca2109e599301dbd/layer.tar","f
4bf863ecdbb8bddb4b3bb271bdd97b067dcb6c95c56f720018abec6af190c6e/layer.tar","517e
3239147277447b60191907bc66168963e0ce8707a6a33532f7c63a0d2f12/layer.tar","0bb74fc
d4b686412f7993916e58c26abd155fa10b10a4dc09a778e7c324c39a2/layer.tar","68c9e9da52
d5a57ee196829ce4a461cc9425b0b920689da9ad547f1da13dbc9d/layer.tar"]}]
[root@ubuntu1804 ~]#du -sh /data/*
8.0K
/data/0901fa9da894a8e9de5cb26d6749eaffb67b373dc1ff8a26c46b23b1175c913a.json
16K /data/0bb74fcd4b686412f7993916e58c26abd155fa10b10a4dc09a778e7c324c39a2
16K /data/517e3239147277447b60191907bc66168963e0ce8707a6a33532f7c63a0d2f12
16K /data/68c9e9da52d5a57ee196829ce4a461cc9425b0b920689da9ad547f1da13dbc9d
70M /data/d2cf0fc540bb3be33ee7340498c41fd4fc82c6bb02b9955fca2109e599301dbd
62M /data/f4bf863ecdbb8bddb4b3bb271bdd97b067dcb6c95c56f720018abec6af190c6e
16K /data/lost+found
4.0K /data/manifest.json
4.0K /data/repositories
[root@ubuntu1804 ~]#cd
/data/d2cf0fc540bb3be33ee7340498c41fd4fc82c6bb02b9955fca2109e599301dbd/
[root@ubuntu1804
d2cf0fc540bb3be33ee7340498c41fd4fc82c6bb02b9955fca2109e599301dbd]#ls
json layer.tar VERSION
[root@ubuntu1804
d2cf0fc540bb3be33ee7340498c41fd4fc82c6bb02b9955fca2109e599301dbd]#tar xf
layer.tar
[root@ubuntu1804
d2cf0fc540bb3be33ee7340498c41fd4fc82c6bb02b9955fca2109e599301dbd]#ls
bin  dev home layer.tar lib64 mnt proc run  srv tmp var
boot etc json lib    media opt root sbin sys usr VERSION
[root@ubuntu1804
d2cf0fc540bb3be33ee7340498c41fd4fc82c6bb02b9955fca2109e599301dbd]#cat etc/i
init.d/  issue   issue.net 
[root@ubuntu1804
d2cf0fc540bb3be33ee7340498c41fd4fc82c6bb02b9955fca2109e599301dbd]#cat etc/issue
Debian GNU/Linux 10 \n \l

おすすめ

転載: blog.51cto.com/13887323/2551061