Ubuntu Weekly Recipe

第458回 UbuntuでDocker再入門

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

高速で軽量な仮想環境を構築できるDockerは,その利便性から,ソフトウェアの開発者にとってもシステムの管理者にとっても使い方を知っておくべきソフトウェアとしての地位を確立しつつあります。今回はより新しいDockerをUbuntu上で使う上で,気をつけるべきことをおさらいします。

UbuntuにおけるDocker

Dockerはカーネルのコンテナ技術などを利用して,アプリケーションをサンドボックス環境の中で動かす仕組みです。Dockerでは最小限のルートファイルシステムである「Dockerのベースイメージ」の上に,各種ソフトウェアのインストール手順や設定手順をファイルとして記述したDockerfileを用いて環境を構築します。Dockefileさえあれば,機械的に何度でもいろいろなところで同じ環境を再構築できるのです。折しも現在発売中の『Software Design 2017年2月号』の第1特集は「いまはじめるDocker」と題したDocker特集になっていますので,より応用的な使い方を知りたい場合はそちらを参照してください※1)⁠

※1
とはいえこの記事が公開される数日後には,2017年3月号が発売されます。電子版でもよければGihyo Digital PublishingでPDF版を購入する法もあります。

さてそのDockerを使うためには,まずDockerエンジンと呼ばれるデーモンとそのDockerエンジンを操作するクライアントをインストールする必要があります※2)⁠UbuntuにDockerをインストールする方法は,実はいくつか存在します。

※2
必ずしもデーモンとクライアントを同じホスト上にインストールする必要はありません。Dockerイメージを立ち上げるLinuxサーバーにDockerエンジンのみをインストールし,WindowsやmacOS上にインストールしたDockerクライアントから操作することも可能です。本記事ではデーモンもクライアントも同じUbuntuホストマシンにインストールすることを想定して説明します。
  • Docker公式のdocker-engineパッケージをインストールする方法
  • Ubuntu公式リポジトリにあるdocker.ioパッケージをインストールする方法
  • snapを使ってdockerパッケージをインストールする方法

最新版を使いたいのであれば,Docker公式のパッケージを使う方法が一番確実です。常に最新のリリースに追随していますし,そのパッケージの作りもUbuntuの流儀から外れてはいません。

最新版にこだわりがないのであれば,公式リポジトリのパッケージをインストールする方法が一番簡単でしょう。なにせ公式リポジトリにパッケージがあるので,インストールはaptコマンドを実行するだけです。Dockerは昨今のシステムでは必須とも言えるコンポーネントになっているため,LTSへのSRUも積極的に行われています。末尾の「.1」のリリース以降のいずれかのタイミングでUbuntu 16.04 LTSにも導入されますので,2017年2月頭の時点でインストールできるのは「1.12.3」です。また,おそらく近いうちに「1.12.6」に更新される見込みです。よって,常にリリースされたばかりのバージョンが必要という用途でなければ,Ubuntuリポジトリのパッケージも選択肢に入ってくるでしょう。

ちなみにdocker.ioパッケージにはLXD上でDockerを使うためのパッチが当たっています。LXDの上でDockerを使いたいのであれば,Ubuntuのdocker.ioパッケージを使うと良いでしょう。

snap版は,新しいパッケージングシステムである「snap」でパッケージ化されたDockerです。snapではアプリケーションやサービスをすべてAppArmorやseccomp,cgroup,namespaceなどを用いて「ホストから隔離した環境」上で実行する仕組みになっています。現時点でのsnap版のdockerパッケージは,⁠このような隔離環境でもDockerがきちんと動く」ことを示す技術的デモに近い位置づけですので,現時点でこれを通常のデスクトップやサーバーで使う意味はありません。たとえばIoT向けのUbuntu Coreシステム上で,Dockerを用いたサービスを立ち上げたいといった用途であれば,意味が出てくるでしょう※3)⁠

※3
snap版Dockerの状況はこちらのGoogle Documentにまとまっています。

Dokcer公式のdocker-engineパッケージ

Docker公式のdocker-engineパッケージについては,Dockerのドキュメントにとても丁寧なインストール手順が記載されています。この手順に従えば何の問題もありません。ここではいくつか細かい注意点を付記しておきましょう。

必要なパッケージのインストール

まず最初に,最低限必要なパッケージをインストールします。

$ sudo apt update
$ sudo apt install curl apt-transport-https ca-certificates \
    software-properties-common linux-image-generic linux-image-extra-$(uname -r)

curlはこのあとリポジトリのGPG鍵をダウンロードするために使用します。サーバー版だと最初からインストールされていますが,デスクトップ版だと入っていないかもしれません。apt-transport-httpsとca-certificatesはDockerのリポジトリがHTTPSであるために必要なパッケージです。software-properties-commonはadd-apt-repositoryコマンドのためにインストールしています。ただし普通にUbuntuをインストールすれば,いずれのパッケージも最初からインストールされているはずです。

最後の2つのカーネル関連のパッケージは,Storage Driverとしてaufsを使いたいかOverlayFSを使いたい場合に必要となります。Dockerのインストールドキュメントには「⁠インストールしない)強い理由がないのであればインストールしましょう」と書いてありますので,特に理由がなければインストールしておきましょう。ちなみにデスクトップ版であれば最初からインストールされています。

DockerのStorage Driverは,Dockerイメージを保存するための仕組みです。過去にはaufsが使われていましたが,最近はOverlayFSやDevice Mapperなど複数のStorage Driverをサポートするようになりました。Select a storage driverには個々のStorage Driverの特性や選択基準が記載されていますので,必要に応じて確認すると良いでしょう。Ubuntuの場合,上記カーネルパッケージをインストールしているとaufsを使うようになります。

「linux-image-generic」⁠linux-image-extra-VERSION」そしてDockerのドキュメントにある「linux-image-extra-virtual」の関係についても説明しておきましょう。Ubuntuにおいてカーネル本体とカーネルモジュールは「linux-image-VERSION-generic」パッケージによって提供されます※4)⁠⁠linux-image-generic」「リポジトリにある最新のバージョンのパッケージに依存している」ため,⁠linux-image-generic」をインストールしておけばパッケージの更新によって常に最新のパッケージがインストールされます。

※4
「generic」の部分は「カーネルフレーバー」と呼ばれます。⁠genericフレーバー」以外にも主にUbuntu Studioで使われる「lowlatency」⁠Ubuntu Phoneのエミュレーターとして使われる「goldfish」⁠仮想マシンであるAWS向けに物理デバイス用ドライバーの多くを無効化した「aws」が存在します。

カーネルモジュールのうち起動時には使わないものは「linux-image-extra-VERSION」に分離してパッケージ化されています。しかしながら「linux-image-generic」「linux-image-VERSION」「linux-image-extra-VERSION」の両方に依存しているため,普通のデスクトップやサーバーにおいてはこれらを区別することはありません。それに対して仮想環境で使われる「linux-image-virtual」「linux-image-VERSION」のみに依存しています。これは「linux-image-extra-VIRSION」で提供するハードウェアドライバーのほとんどは仮想環境では不要だからです。以前は「linux-image-virtual」「linux-image-generic」とは別のカーネルだったのですが,14.04ぐらいからカーネルイメージそのものは同一でパッケージの依存関係だけ変えている状態になっています。そのため「linux-image-extra-virtual」をインストールすることと「linux-image-generic」をインストールすることは本質的には同じです。

Dockerで使うaufsのドライバーは「linux-image-extra-VERSION」に入っています。仮想マシンやクラウドインスタンスなど「linux-image-virtual」を使っている環境で,最新の「linux-image-extra-VERSION」をインストールするために上記では「linux-image-generic」を指定しているわけです。ちなみに「linux-image-generic」は常に「リポジトリにある最新のバージョンのlinux-image-extra-VERSIONのパッケージ」に依存しています。しかしながら何らかの理由で「現在そのホストで使っているカーネルパッケージのバージョン」「リポジトリの最新バージョン」と異なることもあるでしょう。そこで上記ではlinux-image-extra-$(uname -r)と指定することで「現在使っているカーネルバージョン」のaufsドライバーもインストールしています。

上記を踏まえた上で,カーネルパッケージを明示的にインストールするかどうかを個々の環境にあわせて判断してください。

著者プロフィール

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

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

コメント

コメントの記入