ためしに、ホストOSとして稼働しているFreeBSDのLinuxバイナリ互換機能を無効にし、Dockerコンテナが起動できないことを確認してみましょう。Linuxバイナリ互換機能は、以下のカーネルモジュール4つを組み合わせて提供されます。
# kldstat | grep lin 5 1 0xffffffff81e17000 37ae0 linux64.ko 6 3 0xffffffff81e4f000 682c linux_common.ko 8 1 0xffffffff81e89000 9fba linprocfs.ko 9 1 0xffffffff81e93000 5639 linsysfs.ko
この機能を無効にしますが、先にホストOS上で、起動している全てのDockerコンテナを停止します。
# docker rm -f test01 # docker rm -f test02 ...
次に、ホストOSのカーネルモジュール「linux64.ko」をアンロードします。
# kldunload linux64
FreeBSD上で、一時的にLinuxバイナリが実行できなくなりました。この状態で、CentOS 7.2のDockerコンテナの起動を試みます。コンテナ起動時に「/bin/bash」を指定しますので、この「/bin/bash」の起動に失敗するはずです。
# docker run -it --rm --name test02 c7:newest /bin/bash ELF binary type "0" not known. ELF binary type "0" not known. jail: exec /bin/bash: Exec format error jail: /bin/bash: failed
エラーが表示され、CentOS 7.2のDockerコンテナの起動時の「/bin/bash」の実行に失敗していることが分かります。再びホストOSのカーネルモジュール「linux64.ko」を読み込んで、CentOS 7.2のDockerコンテナが起動できるかを確認します。
# kldload linux64 # kldstat |grep lin 6 3 0xffffffff81e4f000 682c linux_common.ko 8 1 0xffffffff81e89000 9fba linprocfs.ko 9 1 0xffffffff81e93000 5639 linsysfs.ko 10 1 0xffffffff81e17000 37ae0 linux64.ko
# docker run -it --rm --name test02 c7:newest /bin/bash [root@ /]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core)
このように、OSアーキテクチャの差異を吸収するための「バイナリ互換機能」によって、ホストOS(FreeBSD)で別のOS(Linux)のバイナリを稼働させることができます。このことから、逆に疑問4の「LinuxがホストOSの場合、FreeBSDのDockerコンテナは動くのだろうか?」について、何に注目すればよいかが見えてきます。そう、Linux OS側にFreeBSDのバイナリ互換機能があるかどうかです。これについては、Docker塾の塾生の皆さんへの宿題にしておきます。
ちなみに、疑問5に対する答えですが、FreeBSDのホストOS上でも、FreeBSDのDockerイメージを入手し、Dockerコンテナとして稼働させることができます。以下にその手順を掲載しておきます。
# docker pull lexaguskov/freebsd # docker run -it --rm --name test03 lexaguskov/freebsd:latest /bin/csh # freebsd-version 10.1-RELEASE # exit
以上で、FreeBSDにおけるDockerコンテナの稼働についてご紹介しました。FreeBSDのような非Linux環境でのDockerというと、「見慣れないコマンドも多いし、制限事項も多そうだし、なんだか難しそう……」というイメージがどうしてもつきまといます。
Docker on FreeBSDは、基本コマンドだけでなく、細かいオプションの挙動においても、あやしい部分が多々ありますが、今後の発展が大いに期待されます。最近は、IoTによる電子機器とITシステムの連携も視野に入れた開発が必要になってきており、電子機器で稼働するBSD系のOSと、サーバなどのITシステムで稼働するFreeBSDやLinuxシステムとのシームレスなデータ相互利用も必要になってきます。Linuxで動作するDocker環境とFreeBSDで動作するDocker環境の同時利用における課題も見えてくると思います。
皆さんも小規模なテスト環境で構いませんので、FreeBSDなどの非Linux系OSにおけるDocker環境を実際にインストールし、Linux環境との混在やIoT機器における活用などを是非検討してみてください。
日本ヒューレット・パッカード株式会社 オープンソース・Linuxテクノロジーエバンジェリスト。兵庫県伊丹市出身。1996年頃からオープンソースに携わる。2000年よりUNIXサーバーのSE及びスーパーコンピューターの並列計算プログラミング講師、SIを経験。2006年、米国HPからLinux技術の伝道師として「OpenSource and Linux Ambassador Hall of Fame」を2年連続受賞。プリセールスMVPを4度受賞。現在は日本HPにて、Linux、FreeBSD、Hadoopなどのサーバー基盤のプリセールスSE、文書執筆を担当。Red Hat Certified Virtualization Administrator, Novell Certified Linux Professional, Red Hat Certified System Administrator in Red Hat OpenStack, Cloudera Certified Administrator for Apache Hadoopなどの技術者認定資格を保有。著書に「CentOS 7実践ガイド」「Ubuntu Server実践入門」などがある。趣味はレーシングカートとビリヤード。
古賀氏の最新記事が読めるブログはこちら。
Copyright © ITmedia, Inc. All Rights Reserved.