第24回 非Linux環境のDocker FreeBSDで実際に動かしてみると……古賀政純の「攻めのITのためのDocker塾」(6/7 ページ)

» 2016年06月15日 08時00分 公開

なぜFreeBSDでLinuxバイナリが実行できるのか

 次に、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で稼働させているのです。

FreeBSDにおけるLinuxバイナリ互換機能

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ