Ubuntu Weekly Recipe

第459回 LXDを使ってDockerコンテナをマイグレーション

この記事を読むのに必要な時間:およそ 11 分

第458回ではUbuntuにおけるDockerのインストール方法を紹介しました。ところでDockerと同じコンテナ技術を利用したソフトウェアとしてLXDが存在します。このLXDとDockerは排他的な存在ではなく,用途にあわせて組み合わせて使うと便利なツールです。そこで今回はLXDで作った仮想環境上でDockerコンテナを動かす方法を紹介します。

LXDの上でDockerを使う

Dockerと同様にカーネルのコンテナ技術を利用したソフトウェアのひとつにLXDが存在します。Dockerがひとつのコンテナでひとつのアプリケーションを動かす「アプリケーションコンテナ」としての利用をメインに据えているのに対して,LXDは軽量な仮想マシンのように使える「システムコンテナ」としての使い方を提案していることがもっとも大きな違いです※1)⁠

※1
とはいえどちらも似たような技術に立脚している以上,メインの用途とは異なる使い方も可能です。たとえばひとつのDockerコンテナでも,プロセス管理ツールを使えば複数のサービスを立ち上げるようなシステムコンテナとして設定できますし,LXDコンテナを単一のアプリケーションを起動するアプリコンテナとして動かせます。また以前はDockerもLXDと同じく裏でLXCを利用してコンテナの作成を行なっていました。現在のDockerはLXCではなくrunCと呼ばれるツールを使っています。

両者の具体的な違いを見ていきましょう。ちなみに個々の環境や運用方針によって成り立たないものもあります。オプションやツールを組み合わせることで変えられるものもあります。あくまで「原則として」という但し書きがつく違いだということを踏まえてください。

Docker
  • 単一のコンテナには単一のサービスが動いている
  • docker runで構築済みイメージをコンテナインスタンスとして実行する
  • /sbin/init実行されない
  • 個々のコンテナの設定はdocker runコマンドの引数として渡す
  • イメージはDockerfileによって構築する
  • 永続的なデータは「データボリューム」に保存する
  • ユーザーはコンテナインスタンスの中に入って操作することはない
  • CMDで指定したプロセスが終了すればインスタンスは停止する
  • コンテナのrootはホストのrootと同じUIDが使われる
  • マシン間のライブマイグレーションは将来的に対応予定
  • コンテナはホストから名前空間の機能によって隔離されている
  • Dockerコンテナの中でDockerコンテナを起動できる
LXD
  • 単一のコンテナの中に複数のサービスが動いている
  • lxc startで構築済みイメージをコンテナインスタンスとして起動する
  • /sbin/init実行される
  • 個々のコンテナの設定は設定コマンドを使ってメタデータファイルに保存する
  • イメージはrootfsイメージとして構築する
  • 永続的なデータはコンテナの中に保存する
  • ユーザーはコンテナインスタンスの中に入って操作する
  • コンテナの中でshutdownコマンドを実行すればインスタンスは終了する
  • コンテナのrootはホストのrootと異なるUIDが使われる
  • マシン間のライブマイグレーションが実験的ではあるものの実装済み
  • コンテナはホストから名前空間の機能によって隔離されている
  • LXDコンテナの中でLXDコンテナを起動できる

使う上で一番大きな違いは,コンテナとして起動したインスタンス対する操作の方法です。Dockerを「使用する」場合は,すでに目的のサービスやアプリケー ションを提供する構築済みイメージが存在します。構築済みイメージは「完成されたもの」であるため,デバッグ用途でもない限りはインスタンスの中に入っ てインタラクティブに何かすることはありません。コンテナの内容を恒久的に変更したい場合は,新たにイメージを作りなおしてそれをdocker runで実行することに なります。

それに対してLXDは,起動した段階ではインストール直後のOSと大差ありません。Cloud InitやAnsibleといったツールを併用することで,自動的に目的のサー ビスやアプリケーションの環境を構築することも可能ではありますがそれはLXDの範囲外の話です。コンテナの内容を変更したい場合は,そのインスタンスに「 ログイン」した上で,普通のLinuxと同じようにコマンド操作することになります。もちろんコンテナを終了してもインスタンスの変更は残っていますし,再び 起動すればPCを再起動した時と同じような状態になります。

実際のところLXDが比較されるべきはDockerよりもむしろ,VMWareやvirt-manager,VirtualBoxといった仮想マシンの管理ツールです。KVMやXenの代わりにコンテナを利用して仮想環境を管理するツールがLXDなのです。それゆえにLXDは「コンテナのハイパーバイザ」と名乗っています。既存の導入方法が確立しているサービスやツールをコンテナの中で動かしたいのであればDockerを選び,とりあえず何でもできるUbuntu環境がほしいのであればLXDを選ぶと良いでしょう。

ところでLXDによって「何でもできるUbuntu環境」を用意できるのであれば,その環境の上でDockerを動かせたら何かと便利です。そこでここからは,Ubuntu 16.04 LTSを使ってLXDの上でDockerを導入する方法を紹介します※2)⁠

※2
LXDを支えているコンテナ技術全般については,gihyo.jpで連載されているLXCで学ぶコンテナ入門が参考になります。ちなみにLXCはカーネルのコンテナ機能を用いてシステムコンテナを構築するためのツールやライブラリ群です。LXDはLXCが提供するAPIを利用して,より簡単にユーザーがコンテナを管理できるようにしたコマンドやサービスとなります。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入