2018/07/15

Docker Image の backup と restore

さて、Docker Registry を立てたは良いものの、マシンが壊れたりすると悲しい事態になります。
Build 元と Registry で二重になってはいるのですが、両方が同じマシンだと悲しい事態が発生する可能性がありますね。
と、いうことで Build した Docker の Image をファイルに書き出したり、そのファイルからイメージを復元します。


環境

  • OS: CentOS Linux release 7.4.1708 (Core)
  • Docker: version 1.13.1, build 774336d/1.13.1
  • Kernel: 3.10.0-693.5.2.el7.x86_64


Docker Image をファイルへバックアップする

Docker そのものはファイル群を /var/lib/docker の下に持ってます。
Image は default だと overlay2 で作成されます。
overlay2 は差分でファイルを管理するファイルシステムなので、そういったメタ情報もバックアップしないといけない。
つまりは cp とか rsync だと事故る可能性があります。

さて、何を使うのが正しいかと言えば公式です。具体的には docker save コマンド
Image を構成する全レイヤをきちんと tar に書き出してくれます。
実行例として、hogehoge Image をバックアップするのはこんな感じ。
  • $ docker image save hogehoge > backup.tar
この tar をバックアップ先 HDD 等に持っていけば良い。


Docker Image をファイルから復元する

バックアップする方法は分かりました。
次はバックアップからの復元。
docker load コマンドを使います。具体的には
  • $ docker image load < backup.tar
で終わり。
Image の repository name や tag も tar に入っているので、それらの情報も全部復元されます。楽。


参考

2018/07/08

自前の Docker Registry を Systemd で管理する

前回の記事では自前で Docker Registry を立ててみました。
ですが、これだと docker run しただけなので、マシンを再起動すると上がってこない。
ということで systemd の unit にしてしまって自動起動させるようにしました。


環境

  • OS: CentOS Linux release 7.4.1708 (Core)
  • Docker: version 1.13.1, build 774336d/1.13.1
  • Kernel: 3.10.0-693.5.2.el7.x86_64


systemd の unit を書く

ググると誰かが書いた unit がいくつかヒットしました。これとかこれとか。
これらを参考に unit を書きます。とはいっても、考慮する具体的な内容は
  • registry の container の name は決めうち
    • unit を書くのを楽にするため
    • volume は面倒なので mount しない
  • registry の dependency には docker がある
    • サービスの起動順番の指定
くらいのものです。

ということで、できたのが
です。こいつを
  • /usr/lib/systemd/system/docker-registry.service
に配置。それから怒涛の systemctl 。
  • $ sudo systemctl daemon-reload
    • unit の reload で認識させる
  • $ sudo systemctl start docker-registry
    • systemd 経由で docker-registry を起動してみる。
    • docker ps するときちんと生きてます。
  • $ sudo systemctl restart docker
    • docker を再起動してもちゃんと生きてる。
    • dependency の設定も上手くいってそうです。
  • $ sudo systemctl enable docker-registry
    • んで、マシン起動時に起動するように
  • $ sudo reboot
    • そして再起動。
    • 再起動後にもきちんと registry が上がってました。良し良し。

ってな感じで再起動しても docker-registry が上がるようになりました。
めでたしめでたし。


参考

2018/07/01

自前の Docker Registry を立てて、 Build した Image を保存する

さて、Docker を使っていて Image を作った後、他の人に配るにはいくつか方法があります。
export/import したりとか、dockerhub に置いたりとか、自前で Registry を立てたりとか。
今回は自前で Docker Registry を立ててみようと思います。


環境(docker client と registry server の両方は同じ環境)

  • OS: CentOS Linux release 7.4.1708 (Core)
  • Docker: version 1.13.1, build 774336d/1.13.1
  • Kernel: 3.10.0-693.5.2.el7.x86_64


Registry を立てる

Image が提供されているのでコマンド一発でおしまい。
  • registry-server$ docker run -d -p 5000:5000 --name registry registry:2
便利ですね。


Config とか

立てるのは簡単ですが、外から使うにはいくつか設定がいります。
まずは firewall で 5000 番を開放します。
  • registry-server$ sudo firewall-cmd --add-port=5000/tcp --permanent
  • registry-server$ sudo firewall-cmd --reload
これでOK。ということで push してみましょう。
  • docker-client$ docker image tag hoge 192.168.0.1:5000/hoge
  • docker-client$ docker push 192.168.0.1:5000
怒られます。
Get https://192.168.0.1:5000/v1/_ping: http: server gave HTTP response to HTTPS client
クライアント側が https で繋ぎにいってるのに http を返してきてる、と。
調べたところ、http でアクセスする registry と指定すれば良いらしいです。

と、いうことで指示通りに /etc/docker/daemon.json に書く。
  • docker-client$ sudo echo '{ "insecure-registries":["192.168.0.1:5000"] }' > /etc/docker/daemon.json
  • docker-client$ sytemctl restart docker
  • docker-client$ docker push 192.168.0.1:5000
これで通りました。良し良し。

今日日 https 必須感もありますし、https にするのが正しい気もしますが、動いたのでまずは一段落。


参考

2018/06/24

docker build で作成した image の layer を統合してサイズを縮小する

Docker で Dockerfile を書いて image を build すると、 RUN したコマンド毎に layer ができます。
結果、次回 build 時にコマンドを再実行せず、layer を cache として使って build 時間の短縮ができます。
また、build に失敗した場合でも、layer の id を指定して docker run して原因特定、などができます。
などなど、 RUN ごとに layer を作成することには多くのメリットがあります。
ですが、'毎回 layer を作成する == 全コマンド結果保存' ということでもあるので、image のサイズが大きくなります。

ビルドする側からすると、全 layer を保存しても問題無いと思います。
ですが、ダウンロードする側、特に何度もダウンロードが発生する場合はサイズが小さいほど良い。
例えば dockerhub にイメージを登録する場合がありますね。
image 作成過程の試行錯誤を dockerhub に登録して、ダウンロード容量が大きくなるとよろしくない。

と、いうことで、layer を統合してサイズを抑えてみます。


環境

  • OS: macOS Sierra 10.12.6
  • Docker for mac: 18.03.1-ce, build 9ee9f40


export/import

と、言ったはものの、同じ考えをしている方がまとめていました
export/import すれば layer を統合できます。
統合というか結果的に1 layer になる、という言い方が正確です。
具体的なコマンドはこんな感じ。
  • $ docker run -itd --name nya big-image
  • $ docker export nya > nya.tar
  • $ cat nya.tar | docker import - big-image-single:latest
今回試してみた image では、57 layers(13GB) -> 1 layer(9GB) になりました。
イメージの性質による思いますが、なかなか効果がありますね。
ちなみに、image save/image import をすると全 layer 含めて export するので縮小はできません。


参考

2018/06/17

Mac に fontforge を直接入れずに Docker を使って Ricty を作成する

私は普段 Terminal で作業する時、フォントは Ricty を使っています。
Ricty は Inconsolata と Migu 1M の合成フォントで、生成スクリプトが公開されています。
合成には fontforge を使うのですが、 brew で入れると結構な数の依存パッケージが入ります。
fontforge  は普段使いしていないので、おそらく Ricty の生成以外に使わない。
なので Mac に直接 fontforge を入れず、コンテナに入れて合成してみます。


環境

  • OS: macOS Sierra 10.12.6
  • Docker for mac: 18.03.1-ce, build 9ee9f40
    • Distribution: CentOS Linux release 7.4.1708 (Core)
    • fontforge: 20120731
  • Ricty: 4.1.1
    • Inconsolata: v2.001
    • Migu 1M: 20150712


mac 側の事前準備(ダウンロード)

事前にダウンロードが必要なのはフォント2つ。
具体的には Inconsolata と Migu 1M の .ttf ファイルです。
加えて、Ricty の生成スクリプト ricty_generator.sh もダウンロードしておきます。
Migu 1M は unzip して、とりあえず全ファイルを ~/Downloads へ mv。

最終的な ~/Downloads はこんな感じになりました。
$ ls Downloads
Inconsolata-Bold.ttf  Inconsolata-Regular.ttf  ipag00303  migu-1m-bold.ttf  migu-1m-regular.ttf  migu-README.txt  mplus-TESTFLIGHT-060  ricty_generator.sh


Docker に ~/Downloads を mount して合成

さて、合成に必要なファイル群は ~/Downloads に集まりました。
これを mount したコンテナを立ち上げて合成します。

具体的なコマンドはこんな感じ。run に渡す用のスクリプトを書いた方がスマートかも。
  • $ docker run -v ~/Downloads/:/root/fonts -it centos:7
    • # yum install -y fontforge
    • # cd /root/fonts
    • # chmod u+x ricty_generator.sh
    • # ./ricty_generator.sh -n 4.1.1 Inconsolata-{Regular,Bold}.ttf migu-1m-{regular,bold}.ttf
生成されたフォントにバージョン番号を付けておきたいので、 "-n 4.1.1" オプションを指定しておきます。
実行した結果、~/Downloads はこんな感じになりました。
$ ls ~/Downloads
Inconsolata-Bold.ttf Inconsolata-Regular.ttf Ricty4.1.1-Bold.ttf Ricty4.1.1-BoldOblique.ttf
Ricty4.1.1-Oblique.ttf Ricty4.1.1-Regular.ttf Ricty4.1.1Discord-Bold.ttf
Ricty4.1.1Discord-BoldOblique.ttf Ricty4.1.1Discord-Oblique.ttf Ricty4.1.1Discord-Regular.ttf
ipag00303 migu-1m-bold.ttf migu-1m-regular.ttf migu-README.txt mplus-TESTFLIGHT-060
ricty_generator.sh
きちんと生成されていますね。良し良し。