はじめに
これはおそらくDockerの思想からはかなり外れた運用です。また、間違ってるところやバッドノウハウもあるかもしれません。
動機
自宅サーバの運用で、可搬性等の観点からDockerの「Infrastructure as Code」の概念に惹かれてLXCをDockerに移植し始めました。
しかし、途中で「このubuntu:xenialイメージは思考停止でpullしてるけれども安全なのか?」と言った点が気になり調べてみたところ、同じような問題提起をしている方がいらっしゃいました。
Dockerの諸問題とRocket登場の経緯
そこで、セキュアな環境を作成するために、一切のDockerHubとの通信を遮断した環境でもビルドできるイメージを目指し、一から(ubuntu.comからのみ取得できるイメージから)Ubuntuイメージを作成しました。以下はその作業メモです。
突っ込みどころ
- なぜUbuntu
- 慣れてるからです。
- イメージファイルのサイズが大きい
- 仕様です。先述した通りLXCからの移行かつDockerHubは用いないため、LXCのイメージと比較して同等ならば良いのです。
やりかた
以下のスクリプトによりubuntu-xenialというイメージでUbuntu 16.04のイメージが出来ます。
cd /tmp
mkdir -p baseimage
cd baseimage
wget https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-root.tar.gz
wget https://cloud-images.ubuntu.com/xenial/current/MD5SUMS
if [ -z "`cat MD5SUMS | grep xenial-server-cloudimg-amd64-root.tar.gz | grep \`md5sum xenial-server-cloudimg-amd64-root.tar.gz | awk '{ print $1 }'\``" ]; then
echo "checksum error"
return 1
fi
cat xenial-server-cloudimg-amd64-root.tar.gz | docker import - ubuntu-xenial
cd ../
rm -r baseimage
備考
DockerHubを完全に信頼しない場合、 /etc/hosts
に以下を記述することで通信を暫定的に(結果的に)遮断できます。
127.0.0.1 registry-1.docker.io
127.0.0.1 registry-2.docker.io
127.0.0.1 registry-3.docker.io
127.0.0.1 registry-4.docker.io
127.0.0.1 registry-5.docker.io
最後に
DockerHubを完全に信頼しないわけではないですが、参考文献にも述べられていますがヒューマンエラー、例えばtypoにより意図しないイメージがローカルに展開されるリスクは十分考えられます。また、プライベートなイメージを間違えてpushしてしまう可能性も皆無とはいい切れません。
そういった細かい点を気にせず思う存分Dockerを使うために、個人的にやっておくべきかなと思った点が以上のようなことになります。