質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.71%

Docker - イメージのサイズがコンテナ内の容量の2倍以上になる

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,698

grovion

score 143

 質問

自分で作った、とあるDockerのイメージがdocker imagesで見ると、3.764 GBもあります。しかし、このイメージでつくったコンテナ内で、du -skhで容量を調べると1.5Gしかありません。

  • どうしてイメージとコンテナ内で2倍以上の差が出てしまうのでしょうか?
  • イメージの容量を削減する方法はありますか?

 実行したコマンド

コンテナ外で実行

$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
some-image              latest              279ee0a8c8bb        37 minutes ago      3.764 GB
ubuntu                  14.04               3f755ca42730        2 weeks ago         188 MB

コンテナ内で実行

root@f972b176d0c9:/# du -skh    
du: cannot access './proc/20/task/20/fd/3': No such file or directory
du: cannot access './proc/20/task/20/fdinfo/3': No such file or directory
du: cannot access './proc/20/fd/4': No such file or directory
du: cannot access './proc/20/fdinfo/4': No such file or directory
1.5G    .

du -skhを実行すると上記のようなエラーが少しでます

 環境

(追記:2017/01/02 11:45AM)

Docker for Mac (Versin 1.12.5)
コンテナのOSはubuntu:14.04を元にして作成したイメージです

です

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

Dockerのイメージは、単純なISOイメージのようなバイナリではありません。
ここがDockerの大発明だったところで、ISOイメージのようなバイナリを差分として何枚も重ねて、一番上のイメージだけが読み書き可能な状態になっているという層状のイメージオブジェクトになっています。
(こうすることで、Ubuntu Linuxのイメージを作り、それをベースにJavaのイメージを作り、それをベースにTomcatのイメージを作り、それをベースにユーザーアプリケーションのイメージを…という風に作れます。UbuntuのイメージもJavaのイメージもリードオンリーなので他のイメージからもベースとして参照でき、共有できます)

層状になっているゆえに、下の層のデータが上の層で隠蔽されることもあり、結果として総ファイルサイズは内容よりも大きくならざるを得ません。ただし、下の層は共有できるので複数のコンテナを立ち上げていくと結果的にはディスクサイズの節約になっていきます(もちろん、層状ファイルシステムにはサイズの節約以上の意味があります。DOCKERFILEによりイメージが再生成できるので、ベースイメージだけのバージョンアップが簡単であるとか)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/02 13:03 編集

    ご回答ありがとうございます

    ベースイメージの差分情報がサイズを圧迫するのでしょうか?

    差分情報がサイズを圧迫しているのか実際に調べてみました。

    # 試したこと
    「some-image」というubuntu:14.04をもとにした自作のイメージの差分情報をなくした「new-some-image」を作成する

    # コマンド

    ```sh
    # some-imageからコンテナを作る
    $ docker create some-image
    a8ee7dcaf5dbcf41f58c838a6714b21938676334daed8e673eb92497e0c4fb58

    # コンテナ(a8ee7...)をexportして差分情報をなくす(恐らく)
    $ docker export a8ee7 > some-image.tar

    # 差分情報ない(恐らく)イメージ(new-some-image)を生成する
    $ cat some-image.tar | docker import - new-some-image
    sha256:037468caa502549315df4657b9b941c318d1cd5d104fa7dc077099ce216b72a1

    # new-some-imageが動くか確かめる
    $ docker run -it new-some-image /bin/bash
    root@26bfaa39e27d:/#

    ```

    # 結果

    「new-some-image」の容量は1.456GBになり、
    コンテナ内で「du -skh」をした結果(1.5GB)ととほとんど同じになりました

    ```sh
    $ docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    new-some-image latest 037468caa502 39 seconds ago 1.456 GB
    some-image latest 279ee0a8c8bb 23 hours ago 3.764 GB
    ubuntu 14.04 3f755ca42730 2 weeks ago 188 MB

    ```

    この実験で差分情報がイメージのデータ量を上げていることが分かりました

    (コメント欄はMarkdownが聞かなくて、docker imagesの結果などが読みづらくてすみません)

    キャンセル

0

コンテナ内で, df -h を実行してみてはいかがでしょうか?

※ /proc/は仮想デバイスなので、サイズが存在しないので表示されるエラーは正常な反応なので
問題ありません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/02 11:26

    ご回答ありがとうございます

    いま`df -h`を試してみたのですが、12GBという表示で、イメージの3.764GBを遥かに超えていて、うまく、コンテナ内の使用容量を見ることができませんでした。


    ```sh
    root@ff6fb3c839ff:/# df -h
    Filesystem Size Used Avail Use% Mounted on
    none 60G 12G 45G 22% /
    tmpfs 999M 0 999M 0% /dev
    tmpfs 999M 0 999M 0% /sys/fs/cgroup
    /dev/vda2 60G 12G 45G 22% /etc/hosts
    shm 64M 0 64M 0% /dev/shm
    ```

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.71%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる