CUBE SUGAR CONTAINER

技術系のこと書きます。

Docker イメージをファイルでやり取りする

基本的に Docker イメージは Docker リポジトリからダウンロードしたりアップロードするものだと思う。 とはいえ、インターネットに疎通がなかったりすることもあるし、自前でリポジトリを運用するのもつらい。 そんなときは Docker イメージを、そのままファイルでやり取りしたいなと思うときがある。 結論から先に言ってしまうと、そんなときは docker save コマンドと docker load コマンドを使うと良い。

使った環境は次の通り。

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.12.6
BuildVersion:   16G29
$ docker version
Client:
 Version:      17.09.0-ce
 API version:  1.32
 Go version:   go1.9
 Git commit:   afdb6d4
 Built:        unknown-buildtime
 OS/Arch:      darwin/amd64

Server:
 Version:      17.09.0-ce
 API version:  1.32 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   afdb6d4
 Built:        Tue Sep 26 22:45:38 2017
 OS/Arch:      linux/amd64
 Experimental: false

ひとまず、サンプルとして busybox イメージを Docker の公式リポジトリから取ってくる。

$ docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
03b1be98f3f9: Pull complete
Digest: sha256:3e8fa85ddfef1af9ca85a5cfb714148956984e02f00bec3f7f49d3925a91e0e7
Status: Downloaded newer image for busybox:latest

これで、ローカルに busybox イメージが登録された。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              54511612f1c4        6 weeks ago         1.13MB

イメージをファイルに書き出すには docker save コマンドを使う。 保存先のファイル名は -o オプションで指定する。

$ docker save busybox -o busybox.tar

書き出されたファイルは tar 形式になっている。

$ file busybox.tar
busybox.tar: POSIX tar archive

あとは、このファイルを好きな方法で保存したり運用環境に持っていけば良い。

イメージを読み込む検証をするために、一旦さきほど取ってきた busybox イメージを削除する。

$ docker rmi busybox
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

ファイルとして書き出された Docker イメージは docker load コマンドで読み込める。

$ docker load -i busybox.tar
6a749002dd6a: Loading layer  1.338MB/1.338MB
Loaded image: busybox:latest

次のように busybox イメージが再び登録された。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              54511612f1c4        6 weeks ago         1.13MB

この通り、ちゃんと使うことができる。

$ docker run -t busybox /bin/echo "Hello World"
Hello World

めでたしめでたし。