EnsekiTT Blog

EnsekiTTが書くブログです。

docker system pruneでDockerのお掃除をする話

つまりなにしたの?

Dockerを使っているといつの間にかDockerのイメージとかボリュームで肥大化してくるので、使わなくなったものは捨てたい。
どうやら便利なdocker system pruneというコマンドがあるらしいので使ってみた。
f:id:ensekitt:20180731011953j:plain

docs.docker.com

pruningって剪定って意味で、使っていないコンテナとかを剪定してくれる的な意味だった。
ミキプルーンの苗木。みたいなのを思い出してたせいで剪定が全然出てこなかった。

環境について

すでにインストール済とする。
docs.docker.com

以降の環境は

Docker CE
Version 18.06.0-ce-mac70 (26399)
Engine: 18.06.0-ce
Compose: 1.22.0
Machine: 0.15.0
Notary: 0.6.1
Credential Helper: 0.6.0
Kubernetes: v1.10.3

で実行した。

どんなファイルが肥大化してくるのか

version: '3'

services:
    env:
        image: jupyter/datascience-notebook
        environment:
            LANG: C.UTF-8
        expose:
            - "8080"
        ports:
             - "8080:8080"
        volumes:
            - ./:/home/jovyan/

volumes:
    env:
        driver: 'local'

先日のdatascience-notebookのDocker Composeファイルを使ってコンテナを立ち上げてみる。

 % docker-compose up
# 色々立ち上げてくれる
 % docker image ls                                                                                                                    ?[feature/issue5]
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
jupyter/datascience-notebook   latest              ee385992ea10        9 days ago          6.13GB

 % docker container ls                                                                                                                ?[feature/issue5]
CONTAINER ID        IMAGE                          COMMAND                  CREATED              STATUS              PORTS                              NAMES
976ccaaad982        jupyter/datascience-notebook   "tini -g -- start-no…"   About a minute ago   Up About a minute   0.0.0.0:8080->8080/tcp, 8888/tcp   datasci_env_1

 % docker network ls                                                                                                                  ?[feature/issue5]
NETWORK ID          NAME                DRIVER              SCOPE
c2d0a1c3097e        bridge              bridge              local
acf38dc5d352        datasci_default     bridge              local
bdf358de9acf        host                host                local
56f83d902ba5        none                null                local

 % docker volume ls                                                                                                                   ?[feature/issue5]
DRIVER              VOLUME NAME
local               datasci_env

こんなかんじで、Image, Container, Network, Volumeがそれぞれできてきていた。

docker-composeなので終了すると

 % docker container ls -a
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                      PORTS               NAMES
976ccaaad982        jupyter/datascience-notebook   "tini -g -- start-no…"   3 minutes ago       Exited (0) 14 seconds ago                       datasci_env_1

止まっている。

昔はどんな方法があったのか

  • コンテナの削除
% docker ps -aq | xargs docker rm
  • イメージの削除
% docker images -aq | xargs docker rmi

こんなんでやってて、一度なれたらコレばっかり使っていた。

きれいにする方法

コンテナだけ綺麗にしたいとき

docker container prune | Docker Documentation

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

Total reclaimed space: 0B

 % docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

ちゃんと消えた。

イメージだけ綺麗にしたいとき

docker image prune | Docker Documentation

関連付けのあるイメージはというのは、
タグ付けされておらず、どのコンテナによっても参照されないイメージのこと。
今回の場合はタグがついているので-aをつけて削除しなければならない。

 % docker image ls
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
jupyter/datascience-notebook   latest              ee385992ea10        9 days ago          6.13GB

 % docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
諸々

ネットワークだけ綺麗にしたいとき

docker network prune | Docker Documentation

 % docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
acf38dc5d352        datasci_default     bridge              local
他のネットワークなどなど
 % docker network prune
WARNING! This will remove all networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
datasci_default

これでネットワークも削除できる

docker system pruneの動作確認

Container, Image, Networkについては

docker system prune

で削除できる。(Imageは関連付けが無いものについて)

あれ?まだ肥大化が収まらない

docker system pruneだとVolumeまでは削除してくれない。これはこれで安全でいいけど、
削除する場合は以下のオプションを付ければ削除できる。

docker system prune --volumes

もしくは

docker system prune
# の次に
docker volume prune
# を実行すれば消せる

でも削除できる。
docker volume prune | Docker Documentation

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。