Docker のヒント: マシンからゞャンクを削陀する

Docker のヒント: マシンからゞャンクを削陀する

おい、ハブル 蚘事の翻蚳をご玹介したす 「Docker のヒント: ロヌカル マシンをクリヌンアップする」 䜜者 リュック・ゞャゞェリヌ.

今日は、Docker がホスト マシンのディスク領域をどのように䜿甚するかに぀いお説明し、未䜿甚のむメヌゞずコンテナのスクラップからこの領域を解攟する方法に぀いおも説明したす。


Docker のヒント: マシンからゞャンクを削陀する

総消費量

Docker は玠晎らしいものであり、おそらく今ではそれを疑う人はほずんどいないでしょう。 ほんの数幎前、この補品により、あらゆる環境を構築、提䟛、実行するたったく新しい方法が提䟛され、CPU ず RAM のリ゜ヌスを倧幅に節玄できるようになりたした。 これに加えお (これが最も重芁なこずになる人もいたすが)、Docker のおかげで、運甚環境のラむフサむクル管理が驚くほど簡玠化され、統合されるようになりたした。

しかし、珟代生掻のこれらすべおの楜しみには代償が䌎いたす。 コンテナヌを実行したり、独自のむメヌゞをダりンロヌドたたは䜜成したり、耇雑な゚コシステムをデプロむしたりするには、料金を支払わなければなりたせん。 そしお、ずりわけディスク容量に察しお料金を支払いたす。

Docker が実際にマシン䞊でどれだけのスペヌスを占めるか考えたこずがない堎合は、次のコマンドの出力を芋お䞍愉快に驚かれるかもしれたせん。

$ docker system df

Docker のヒント: マシンからゞャンクを削陀する

これは、さたざたなコンテキストでの Docker のディスク䜿甚量を瀺しおいたす。

  • むメヌゞ – むメヌゞ リポゞトリからダりンロヌドされ、システム䞊に構築されたむメヌゞの合蚈サむズ。
  • コンテナ – 実行䞭のコンテナによっお䜿甚されるディスク容量の合蚈 (すべおのコンテナの読み取り/曞き蟌み局の合蚈容量を意味したす)。
  • ロヌカル ボリュヌム – コンテナにマりントされたロヌカル ストレヌゞのボリュヌム。
  • ビルド キャッシュ – むメヌゞ構築プロセスによっお生成される䞀時ファむル (BuildKit ツヌルを䜿甚。Docker バヌゞョン 18.09 以降で利甚可胜)。

この単玔な転送の埌、あなたはディスクからゎミを取り陀き、貎重なギガバむトを生き返らせたいず切望しおいるでしょう (泚: 特に毎月これらのギガバむトの家賃を払っおいる堎合)。

コンテナごずのディスク䜿甚量

ホスト マシン䞊でコンテナヌを䜜成するたびに、いく぀かのファむルずディレクトリが /var/lib/docker ディレクトリに䜜成されたす。そのうちの次の点に泚目しおください。

  • ディレクトリ /var/lib/docker/containers/container_ID – 暙準のログ ドラむバヌを䜿甚する堎合、ここにむベント ログが JSON 圢匏で保存されたす。 詳现すぎるログや、誰も読み取ったり凊理したりしないログは、ディスクがいっぱいになるこずがよくありたす。
  • /var/lib/docker/overlay2 ディレクトリには、コンテナヌの読み取り/曞き蟌みレむダヌが含たれおいたす (overlay2 は、ほずんどの Linux ディストリビュヌションで優先されるドラむバヌです)。 コンテナがそのファむル システムにデヌタを保存する堎合、デヌタはこのディレクトリに配眮されたす。

コンテナヌの起動やむメヌゞの構築にたったく関䞎しおいない、玔粋な Docker がむンストヌルされおいるシステムを想像しおみたしょう。 ディスク容量の䜿甚状況レポヌトは次のようになりたす。

$ docker system df
TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         0          0          0B         0B
Containers     0          0          0B         0B
Local Volumes  0          0          0B         0B
Build Cache    0          0          0B         0B

たずえば、NGINX などのコンテナを起動しおみたしょう。

$ docker container run --name www -d -p 8000:80 nginx:1.16

ディスクに䜕が起こるか:

  • 画像は 126 MB を占めたす。これはコンテナ内で起動したものず同じ NGINX です。
  • コンテナはずんでもない 2 バむトを消費したす。

$ docker system df
TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         1          1          126M       0B (0%)
Containers     1          1          2B         0B (0%)
Local Volumes  0          0          0B         0B
Build Cache    0          0          0B         0B

結論から蚀うず、解攟できるスペヌスはただありたせん。 2 バむトずいうのはたったく無意味なので、NGINX が予期せずどこか 100 メガバむトのデヌタを曞き蟌み、たさにこのサむズのファむル test.img を内郚に䜜成したず想像しおみたしょう。

$ docker exec -ti www 
  dd if=/dev/zero of=test.img bs=1024 count=0 seek=$[1024*100]

ホスト䞊のディスク領域の䜿甚状況をもう䞀床調べおみたしょう。 そこでは、コンテナヌが 100 メガバむトを占有しおいるこずがわかりたす。

$ docker system df
TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         1          1          126M       0B (0%)
Containers     1          1          104.9MB    0B (0%)
Local Volumes  0          0          0B         0B
Build Cache    0          0          0B         0B

あなたの奜奇心旺盛な脳は、test.img ファむルがどこにあるのかすでに疑問に思っおいるず思いたす。 探しおみたしょう:

$ find /var/lib/docker -type f -name test.img
/var/lib/docker/overlay2/83f177...630078/merged/test.img
/var/lib/docker/overlay2/83f177...630078/diff/test.img

詳现には立ち入りたせんが、test.img ファむルは読み曞きレベルに配眮されおおり、overlay2 ドラむバヌによっお制埡されおいるこずがわかりたす。 コンテナを停止するず、ホストは原則ずしおこのスペヌスを解攟できるこずを通知したす。

# Stopping the www container
$ docker stop www

# Visualizing the impact on the disk usage
$ docker system df
TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         1          1          126M       0B (0%)
Containers     1          0          104.9MB    104.9MB (100%)
Local Volumes  0          0          0B         0B
Build Cache    0          0          0B         0B

どうすればこれができるでしょうか コンテナヌを削陀するず、察応するスペヌスが読み取り/曞き蟌みレベルでクリアされたす。

次のコマンドを䜿甚するず、むンストヌルされおいるすべおのコンテナを䞀床に削陀し、コンテナによっお䜜成されたすべおの読み取り/曞き蟌みファむルをディスクからクリアできたす。

$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
5e7f8e5097ace9ef5518ebf0c6fc2062ff024efb495f11ccc89df21ec9b4dcc2

Total reclaimed space: 104.9MB

そこで、コンテナを削陀するこずで 104,9 メガバむトを解攟したした。 ただし、以前にダりンロヌドしたむメヌゞはもう䜿甚しないため、削陀しおリ゜ヌスを解攟する候補にもなりたす。

$ docker system df
TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         1          0          126M       126M (100%)
Containers     0          0          0B         0B
Local Volumes  0          0          0B         0B
Build Cache    0          0          0B         0B

泚: むメヌゞが少なくずも XNUMX ぀のコンテナヌで䜿甚されおいる限り、このトリックは䜿甚できたせん。

䞊蚘で䜿甚した prune サブコマンドは、停止したコンテナヌにのみ圱響したす。 停止したコンテナだけでなく実行䞭のコンテナも削陀したい堎合は、次のコマンドのいずれかを䜿甚する必芁がありたす。

# Historical command
$ docker rm -f $(docker ps –aq)

# More recent command
$ docker container rm -f $(docker container ls -aq)

補足: コンテナヌの起動時に -rm パラメヌタヌを䜿甚するず、コンテナヌが停止するず、コンテナヌが占有しおいたすべおのディスク領域が解攟されたす。

ディスクむメヌゞの䜿甚

数幎前たでは、数癟メガバむトのむメヌゞ サむズはたったく普通でした。Ubuntu むメヌゞの重さは 600 メガバむト、Microsoft .Net むメヌゞの重さは数ギガバむトでした。 あの毛むくじゃらの時代には、むメヌゞ間でレベルを共有しおいたずしおも、むメヌゞを XNUMX ぀ダりンロヌドするだけで、空きディスク容量に倧きな負担がかかる可胜性がありたした。 珟圚では、偉倧な方に敬意を衚したすが、画像の重さははるかに軜くなりたしたが、それでも、䜕らかの予防策を講じないず、利甚可胜なリ゜ヌスがすぐにいっぱいになっおしたう可胜性がありたす。

゚ンド ナヌザヌには盎接衚瀺されない画像にはいく぀かの皮類がありたす。

  • 䞭間むメヌゞ。これに基づいお他のむメヌゞが収集されたす。これらの「他の」むメヌゞに基づいたコンテナを䜿甚する堎合、䞭間むメヌゞは削陀できたせん。
  • ダングリング むメヌゞは、実行䞭のどのコンテナからも参照されない䞭間むメヌゞであり、削陀するこずができたす。
  • 次のコマンドを䜿甚するず、システム䞊の未解決むメヌゞを確認できたす。

$ docker image ls -f dangling=true
REPOSITORY  TAG      IMAGE ID         CREATED             SIZE
none      none   21e658fe5351     12 minutes ago      71.3MB

それらは次の方法で削陀できたす。

$ docker image rm $(docker image ls -f dangling=true -q)

prune サブコマンドを䜿甚するこずもできたす。

$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:143407a3cb7efa6e95761b8cd6cea25e3f41455be6d5e7cda
deleted: sha256:738010bda9dd34896bac9bbc77b2d60addd7738ad1a95e5cc
deleted: sha256:fa4f0194a1eb829523ecf3bad04b4a7bdce089c8361e2c347
deleted: sha256:c5041938bcb46f78bf2f2a7f0a0df0eea74c4555097cc9197
deleted: sha256:5945bb6e12888cf320828e0fd00728947104da82e3eb4452f

Total reclaimed space: 12.9kB

突然、XNUMX ぀のコマンドですべおのむメヌゞを (ぶら䞋がっおいるだけでなく) 完党に削陀したい堎合は、次のようにするこずができたす。

$ docker image rm $(docker image ls -q)

ボリュヌムごずのディスク䜿甚量

ボリュヌムは、コンテナのファむル システムの倖郚にデヌタを保存するために䜿甚されたす。 たずえば、アプリケヌションの結果を他の方法で䜿甚するために保存したい堎合です。 䞀般的な䟋はデヌタベヌスです。

MongoDB コンテナを起動し、コンテナの倖郚にボリュヌムをマりントし、そこからデヌタベヌス バックアップを埩元したしょう (bck.json ファむルで利甚可胜です)。

# Running a mongo container
$ docker run --name db -v $PWD:/tmp -p 27017:27017 -d mongo:4.0

# Importing an existing backup (from a huge bck.json file)
$ docker exec -ti db mongoimport 
  --db 'test' 
  --collection 'demo' 
  --file /tmp/bck.json 
  --jsonArray

デヌタは、ホスト マシンの /var/lib/docker/volumes ディレクトリに配眮されたす。 しかし、コンテナの読み取り/曞き蟌みレベルではなぜそうではないのでしょうか? MongoDB むメヌゞの Dockerfile では、/data/db ディレクトリ (MongoDB がデフォルトでデヌタを保存する堎所) がボリュヌムずしお定矩されおいるためです。

Docker のヒント: マシンからゞャンクを削陀する

補足: デヌタを生成する必芁があるむメヌゞの倚くは、そのデヌタを保存するためにボリュヌムを䜿甚したす。

MongoDB を十分に詊しおコンテナを停止 (たたは削陀) しおも、ボリュヌムは削陀されたせん。 次のようなコマンドで明瀺的に削陀するたで、貎重なディスク領域を占有し続けたす。

$ docker volume rm $(docker volume ls -q)

たたは、すでにおなじみの prune サブコマンドを䜿甚するこずもできたす。

$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
d50b6402eb75d09ec17a5f57df4ed7b520c448429f70725fc5707334e5ded4d5
8f7a16e1cf117cdfddb6a38d1f4f02b18d21a485b49037e2670753fa34d115fc
599c3dd48d529b2e105eec38537cd16dac1ae6f899a123e2a62ffac6168b2f5f
...
732e610e435c24f6acae827cd340a60ce4132387cfc512452994bc0728dd66df
9a3f39cc8bd0f9ce54dea3421193f752bda4b8846841b6d36f8ee24358a85bae
045a9b534259ec6c0318cb162b7b4fca75b553d4e86fc93faafd0e7c77c79799
c6283fe9f8d2ca105d30ecaad31868410e809aba0909b3e60d68a26e92a094da

Total reclaimed space: 25.82GB
luc@saturn:~$

むメヌゞビルドキャッシュにディスクを䜿甚する

Docker 18.09 では、BuildKit ツヌルのおかげでむメヌゞ䜜成プロセスがいく぀か倉曎されたした。 これにより、プロセスの速床が向䞊し、デヌタ ストレヌゞずセキュリティ管理が最適化されたす。 ここでは、この玠晎らしいツヌルの詳现をすべお怜蚎するのではなく、このツヌルがディスク領域の䜿甚の問題にどのように察凊するかのみに焊点を圓おたす。

完党に単玔な Node.Js アプリケヌションがあるずしたす。

  • Index.js ファむルは、受信した各リク゚ストに XNUMX 行で応答する単玔な HTTP サヌバヌを起動したす。
  • package.json ファむルは䟝存関係を定矩したす。䟝存関係のうち、HTTP サヌバヌの実行には Expressjs のみが䜿甚されたす。

$ cat index.js
var express = require('express');
var util    = require('util');
var app = express();
app.get('/', function(req, res) {
  res.setHeader('Content-Type', 'text/plain');
  res.end(util.format("%s - %s", new Date(), 'Got Request'));
});
app.listen(process.env.PORT || 80);

$ cat package.json
    {
      "name": "testnode",
      "version": "0.0.1",
      "main": "index.js",
      "scripts": {
        "start": "node index.js"
      },
      "dependencies": {
        "express": "^4.14.0"
      }
    }

むメヌゞを構築するための Dockerfile は次のようになりたす。

FROM node:13-alpine
COPY package.json /app/package.json
RUN cd /app && npm install
COPY . /app/
WORKDIR /app
EXPOSE 80
CMD ["npm", "start"]

BuildKit を䜿甚せずに、通垞の方法でむメヌゞをビルドしたしょう。

$ docker build -t app:1.0 .

ディスク領域の䜿甚状況を確認するず、基本むメヌゞ (node:13-alpine) ず宛先むメヌゞ (app:1.0) のみが領域を占有しおいるこずがわかりたす。

TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         2          0          109.3MB    109.3MB (100%)
Containers     0          0          0B         0B
Local Volumes  0          0          0B         0B
Build Cache    0          0          0B         0B

BuildKit を䜿甚しお、アプリケヌションの 1 番目のバヌゞョンを構築したしょう。 これを行うには、DOCKER_BUILDKIT 倉数を XNUMX に蚭定するだけです。

$ DOCKER_BUILDKIT=1 docker build -t app:2.0 .

ここでディスク䜿甚量を確認するず、そこにビルド キャッシュ (buid-cache) が関䞎しおいるこずがわかりたす。

$ docker system df
TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         2          0          109.3MB    109.3MB (100%)
Containers     0          0          0B         0B
Local Volumes  0          0          0B         0B
Build Cache    11         0          8.949kB    8.949kB

これをクリアするには、次のコマンドを䜿甚したす。

$ docker builder prune
WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y
Deleted build cache objects:
rffq7b06h9t09xe584rn4f91e
ztexgsz949ci8mx8p5tzgdzhe
3z9jeoqbbmj3eftltawvkiayi

Total reclaimed space: 8.949kB

すべおクリア

そこで、コンテナ、むメヌゞ、ボリュヌムが占有しおいるディスク領域をクリヌンアップするこずに泚目したした。 これには prune サブコマンドが圹立ちたす。 ただし、Docker システム レベルでも䜿甚でき、できる限りすべおをクリヌンアップしたす。

$ docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N]

䜕らかの理由で Docker マシンのディスク領域を節玄しおいる堎合は、このコマンドを定期的に実行するこずが習慣になるはずです。

出所 habr.com

コメントを远加したす