次に、FreeBSD上でDockerコンテナに含まれるLinuxバイナリが本当に実行できるのかを確認します。テストに用いるLinuxバイナリは、日付を表示するdateコマンドです。以下は、ホストOSのFreeBSD上で稼働するCentOS 7.2のDockerコンテナで作業します。
[root@ /]# yum install -y file
[root@ /]# file /usr/bin/date /usr/bin/date: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=05e827b15d6bebd4fd4ddb6c3878f1f498cdc486, stripped
[root@ /]# /usr/bin/date Sun Mar 20 10:57:51 UTC 2016
上記の結果より、ホストOSがFreeBSDの場合でも、Dockerコンテナ内のLinuxバイナリを実行できることが確認できました。ここで読者の皆さんは、不思議に感じるかもしれません。
FreeBSDという非Linux OSの環境で、Linuxのバイナリが稼働しています。Dockerはハイパーバイザ型の仮想化ソフトではありませんので、FreeBSDで直接dateコマンドがプロセスとして実行していることになります。ためしに、CentOS 7.2のDockerコンテナでtailコマンドを実行し、ホストOSからpsコマンドでプロセスが直接見えるかどうかを確認してみましょう。まず、FreeBSD上で稼働するCentOS 7.2のDockerコンテナでtailコマンド自体のバイナリの種類を確認し、tailコマンドのプロセスを起動します。
[root@ /]# file /usr/bin/tail /usr/bin/tail: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=efd00d2e58755551b295647f6fce8c3bb0126057, stripped [root@ /]# tail -f /dev/null
ホストOSのFreeBSDからpsコマンドを使って、Dockerコンテナ上で実行されているtailコマンドのプロセスが見えるかどうかを確認します。
# ps axuw |grep tail root 728 0.0 0.1 4336 1308 1 S+J 8:20PM 0:00.02 tail -f /dev/null
やはり、FreeBSD上からLinuxのコマンドがプロセスとして実行されているのが分かります。これは、一体どういうことでしょうか。
非Linux環境においてLinuxバイナリを稼働させることについて、ここは非常に重要ですが、FreeBSDには「Linuxバイナリ互換機能」というLinuxのバイナリを稼働させる機能がカーネルに搭載されています。決して完全ではありませんが、多くのLinuxバイナリをFreeBSD上で稼働させることができます。FreeBSDは、この機能を利用してDockerコンテナ上のLinuxバイナリをFreeBSDで稼働させているのです。
Copyright © ITmedia, Inc. All Rights Reserved.