ためしに、ホスト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実践入門」などがある。趣味はレーシングカートとビリヤード。
古賀氏の最新記事が読めるブログはこちら。
第23回 非Linux環境のDocker、プレステも採用する“あのOS”で動かす意味
第21回 Dockerで3Dゲームを動かす――構築編
第22回 Dockerで3Dゲームを動かす――稼働編Copyright © ITmedia, Inc. All Rights Reserved.