IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

コラム

クラウド時代のオープンソース実践活用

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第43回 「Dockerイメージ」のポータビリティとLinuxカーネルのABI (中井悦司) 2014年5月

はじめに

 前々回の連載より、Dockerの話題を取り上げてきました。この連載に目をつけられた(?)わけではないと思いますが、さっそく、勉強会の依頼をいただいて、「Linux女子部」「hbstudy」「カーネル読書会」の3つの勉強会で講師をつとめることになりました。すでに満席の所もありますが、勉強会で使用予定の資料を公開していますので、興味のある方はご参照ください(*1)(*2

 今回は、Dockerを利用する上で知っておくとよい知識として、Linuxの「ABI(Application Binary Interface)」を説明したいと思います。

実行ファイルのポータビリティ

 いきなり「ABI」と言われてもピンとこない方も多いかも知れません。たとえば、あるLinuxサーバで動いているアプリケーションの実行ファイルについて、「そのまま他のLinuxサーバにコピーしても同じように動くか?」という問題を考えます。これが、「Linuxの実行ファイルをWindowsにコピーしても動くか?」なら答えは簡単です ―― 「そんなの無理!」

 一方、Linux同士の場合は、なんとかなりそうな気もします。Linuxにも色々な種類(ディストリビューションやバージョン)がありますが、基本的にはLinusが設計した同じLinuxカーネルで動いています。共有ライブラリなども含めて、アプリケーションの実行に必要なファイルを全部まとめて移動すれば、Debian用の実行ファイルをRHELで動かすことなどできそうです。

 とはいえ、Linuxカーネルのバージョンによる違いはないのでしょうか? 実は、Linuxカーネルの開発においては、バージョンアップにおける後方互換性について、相当な注意が払われています。カーネルのバージョンが上がっても同じ実行ファイルがそのまま使える、それを実現するのが「ABIの互換性」です。

Linuxカーネルの開発ルール

 アプリケーションの実行ファイルはその内部で、カーネルの様々な機能を呼び出します。典型的には、I/O処理などのシステムコールになりますが、その他、procファイルシステムから情報を読み出す際なども、内部的にはカーネルの機能を呼び出しています。このようにアプリケーションの実行ファイル(バイナリファイル)とカーネルがやりとりするインターフェースのことを「ABI(Application Binary Interface)」と言います。

 仮にカーネルのバージョンが上がって、ABIの仕様が変わると ―― たとえば、あるシステムコールを呼び出す引数や返ってくるエラーの種類が変わったら ―― 以前のカーネルで動いていたアプリケーションが新しいカーネルでは動かなくなる恐れがあります。

 Linuxカーネルの開発においては、基本的には、このようなABIの変更をしないことがルールになっています。特にLinusは厳格で、開発者(メンテナ)の誰かがABIを変更するパッチを取り入れようとすると、頭から湯気が出ているのが見えるぐらいに怒ります。LKML(Linuxカーネル開発者のメーリングリスト)を検索すると、このような例があり、「WE DO NOT BREAK USERSPACE!(ユーザスペースを壊す変更はするな!)」と叫んでいます。

Dockerイメージのポータビリティ

 それでは、ABIとDockerにはどのような関係があるのでしょうか? 前回に説明したように、Dockerでは、誰かが作成したディスクイメージをダウンロードして、自分の用意したサーバ上のコンテナで起動することが可能です。そして、前々回に説明したように、コンテナ内のプロセスは、ホストLinuxのカーネル上で動作します。

 つまり、最初にこのディスクイメージを作成・テストしたホストLinuxのカーネルと、自分が使っているホストLinuxのカーネルは同一ではありません。前述のようにカーネルのABIに互換性があるおかげで、ほとんどの場合はうまく動きます。とはいえ、問題が起きないと確約されているわけでもありません。特に新しいバージョンのカーネル上で用意されたものを古いカーネル上に持ってきた場合、そのアプリケーションが新しいカーネルにしかない機能を使っていれば、その時点でアウトです。Dockerで作成したイメージは、いろいろな環境に持ち運べるので便利ですが、ホストLinuxの種類が異なる環境で利用する際には、思わぬ問題が発生する恐れがあることを知っておく必要があります。

次回予告

 ちなみに、Dockerイメージを複数環境で利用する際の思わぬ問題を避けるには、Dockerを使用するホストLinuxを最初から同じものにそろえておくという手もあります。いま、Docker専用のLinuxディストリビューションを開発・提供するような話を耳にすることもあります。今後、どのようなLinux環境がDockerの標準環境として広がっていくのか、少し注意して動向を見ておくのがよいでしょう。

 さて、今週は、LinuxCon Japanが開催されています。私も「Gluster Community Day」というプログラムに登壇する予定です。次回は、LinuxConからの話題をお届けしたいと思います。

参考資料

(*1) 「Dockerクイックツアー

(*2) 「Dockerを支える技術

 

++ CTC教育サービスから一言 ++
このコラムでLinuxや周辺技術の技術概要や面白さが理解できたのではないかと思います。興味と面白さを仕事に変えるには、チューニングやトラブルシューティングの方法を実機を使用して多角的に学ぶことが有効であると考えます。CTC教育サービスでは、Linuxに関する実践力を鍛えられるコースを多数提供しています。興味がある方は以下のページもご覧ください。
 CTC教育サービス Linuxのページ
 http://www.school.ctc-g.co.jp/linux/
 

Linux研修トレーニングならCTC教育サービス


 

筆者書籍紹介

Software Design plusシリーズ
「独習Linux専科」サーバ構築/運用/管理
  ――あなたに伝えたい技と知恵と鉄則

本物の基礎を学ぶ!新定番のLinux独習書

中井悦司 著
B5変形判/384ページ
定価3,129円(本体2,980円)
ISBN 978-4-7741-5937-9
詳しくはこちら(出版社WEBサイト)
「独習Linux専科」サーバ構築/運用/管理

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes