Docker Hub には様々なイメージがありますが自分だけの環境を作りたくなることがあります。またその環境をバックアップとして保存したり、別のマシンや他の人と共有したいことがあります。このような場合はイメージを出力しファイルとして扱います。
環境を構築する
最初にベースイメージを選択する必要があります。慣れている環境で良いと思いますが、特にこだわりがなければ alpine ベースのものがサイズが小さくてオススメです。
alpine には apk というパッケージマネージャーが入っています。これを使って適宜自分の環境に合わせてパッケージをインストールします。
$ docker run --interactive --tty --name mymachine alpine:3.8
# apk update
# apk add curl git neovim
また、macOS 上の設定ファイルをコンテナにコピーしたい場合があります。このような場合は docker cp コマンドを使います。
$ docker cp --archive ~/.config mymachine:/root/.config
環境が整ったら docker commit コマンドでイメージを作成します。
$ docker commit mymachine mymachine-1
これで mymachine-1 というイメージを作成することができました。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mymachine-1 latest 291434ae067f About a minute ago 63.6MB
alpine 3.8 196d12cf6ab1 2 months ago 4.41MB
alpine latest 196d12cf6ab1 2 months ago 4.41MB
これを他の環境と共有できるようにファイルに docker save コマンドで出力します。
$ docker save --output mymachine-1.tar mymachine-1
これで mymachine.tar というファイルが作成されました。
$ du -hs mymachine-1.tar
67M mymachine-1.tar
読み込むには docker load コマンドを使います。
$ docker load --input mymachine-1.tar
ツールを作る
お手製ツールを作るのも簡単です。PythonのFabricがなかなか便利なのですが、Fabric 2 で API が変わってしまいました。Fabric 1 は Python2 でないと動かないので、この組み合わせでイメージを作っておくと便利そうです。
fabric に必要なパッケージを apk でインストールし、pip でバージョンを指定してインストールします。
$ docker run -tty -interactive -name fab python:2-alpine3.8
# app add build-base libffi-dev
# pip install 'fabric<2'
# fab -V
Fabric 1.14.0
Paramiko 2.4.2
これを変更を commit してイメージにします。
$ docker commit fab
$ docker save fab -o fab.img
fab.img を共有すれば、自分の他環境や他の人にも使ってもらうことができます。
macOS でコマンドラインに慣れていない時や、macOS ではある程度慣れているけど、Linux には不慣れな人は Debian/Ubuntu/CentOS などの環境を Docker で試してみ見るのも良いかもしれません。システムを破壊する心配はほとんどありませんし、よく分からなくなったらコンテナを作り直してやり直せば良いです。また、commit で適宜保存しておけば、失敗する前の状態に戻るのも簡単です。
おまけ
docker save/load の他に docker export/import というものもあります。save は commit で Docker イメージを作成しイメージを出力しました。export は Docker コンテナを直接出力します。export にはベースとなったイメージのレイヤーは含まれません。
Dockerイメージではレイヤーを保持しストレージ容量を節約します。Docker for Mac では overlay2 (extfs) という Storage driver が使われます。他にも brtfs や zfs を使った driver もあります。詳しくは About storage driver | Docker Documentation を参照してください。