Ubuntu

Docker は以下のオペレーティング・システムをサポートしています。

  • Ubuntu Xenial 16.04 (LTS)
  • Ubuntu Wily 15.10
  • Ubuntu Trusty 14.04 (LTS)
  • Ubuntu Precise 12.04 (LTS)

このページは、Docker が管理しているパッケージとインストール手順で作業します。Docker が提供する最新リリースのパッケージを使えるようにします。もし Ubuntu が管理するパッケージを使いたい場合は、Ubuntu のドキュメントをお調べください。

注釈

Ubuntu Utopic 14.10 と 15.04 には Docker の apt リポジトリが存在しますが、(Dockerが)公式にサポートしていません。

動作条件

Docker は 64 bit でインストールされた何らかの Ubuntu バージョンを必要とします。加えて、kernel は少なくとも 3.10 以上が必要です。最新の 3.10 マイナーバージョンか、それよりも新しいバージョンを利用可能です。

3.10 よりも低いカーネルは、Docker コンテナ実行時に必要な一部の機能が足りません。古いバージョンは既知のバグがあります。その影響により、特定条件下でデータの損失や定期的なカーネルパニックを引き起こします。

現在のカーネル・バージョンを確認するには、ターミナルを開き、 uname -r を使ってカーネルのバージョンを確認します。

$ uname -r
3.11.0-15-generic

注釈

以前に Docker を apt でインストールしていた場合は、 apt ソースを新しい Docker リポジトリに更新してください。

apt ソースの更新

Docker 1.7.1 以上は Docker の apt リポジトリに保管されています。 apt が新しいリポジトリにあるパッケージを使えるように設定します。

  1. マシンに sudo もしくは root 特権のあるユーザでログインします。
  1. ターミナルのウインドウを開きます。
  1. パッケージ情報を更新します。 APT が https メソッドで動作することを確認し、 CA 証明書がインストールされるのを確認します。
$ apt-get update
$ apt-get install apt-transport-https ca-certificates
  1. 新しい GPG 鍵を追加します。
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
  1. /etc/apt/sources.list.d/docker.list ファイルを任意のエディタで開きます。

ファイルが存在しなければ、作成します。

  1. 既存のエントリがあれば削除します。
  1. Ubuntu オペレーティング・システム向けのエントリを追加します。

利用可能なエントリは以下の通りです。

  • Ubuntu Precise 12.04 (LTS)
deb https://apt.dockerproject.org/repo ubuntu-precise main
  • Ubuntu Trusty 14.04 (LTS)
deb https://apt.dockerproject.org/repo ubuntu-trusty main
  • Ubuntu Wily 15.10
deb https://apt.dockerproject.org/repo ubuntu-wily main
  • Ubuntu Xenial 16.04 (LTS)
deb https://apt.dockerproject.org/repo ubuntu-xenial main

注釈

Docker のパッケージは全てのアーキテクチャに対応していません。しかし、毎晩構築(nightly build)のバイナリは https://master.dockerproject.org/ にあります。Docker をマルチ・アーキテクチャのシステムにインストールするには、 [arch=...] エントリの項目を追加します。詳細は Debian Multiarch wiki をご覧ください。

  1. /etc/apt/sources.list.d/docker.list ファイルを保存して閉じます。
  1. apt パッケージのインデックスを更新します。
$ sudo apt-get update
  1. 古いリポジトリが残っているのなら、パージします。
$ sudo apt-get purge lxc-docker
  1. apt が正しいリポジトリから取得できるか確認します。
$ apt-cache policy docker-engine

これで apt-get update を実行したら、 apt は新しいリポジトリから取得します。

Ubuntu バージョン固有の動作条件

  • Ubuntu Xenial 16.04 (LTS)
  • Ubuntu Wily 15.10
  • Ubuntu Trusty 14.04 (LTS)

Ubuntu Trusty・Wily・Xenial では、 linux-image-extra カーネル・パッケージのインストールを推奨します。この linux-image-extraaufs ストレージ・ドライバを利用可能にします。

自分のカーネル・バージョンに対応した linux-image-extra パッケージをインストールします。

  1. Ubuntu ホスト上のターミナルを開きます。
  1. パッケージ・マネージャを更新します。
$ sudo apt-get update
  1. 推奨パッケージをインストールします。
$ sudo apt-get install linux-image-extra-$(uname -r)
  1. Docker のインストールに進みます。

Ubuntu Precise 12.04 (LTS)

Ubuntu Precise では、Docker は カーネル・バージョン 3.13 が必要です。カーネルのバージョンが 3.13 よりも古い場合は、更新が必要です。環境に応じてどのパッケージが必要になるかは、次のリストをご覧ください。

  • linux-image-generic-lts-trusty… generic の Linux カーネル・イメージ。このカーネルは AUFS が組み込み済み。Docker 実行に必要。
  • linux-headers-generic-lts-trusty … ZFS と VirtualBox のゲスト追加に依存するようなパッケージを利用可能にします。既存のカーネルに対して headers をインストールしなければ、”trusty” カーネル向けのヘッダをスキップします。自信がなければ、安全のためにこのパッケージを導入すべきです。
  • xserver-xorg-lts-trusty , libgl1-mesa-glx-lts-trusty … Unity/Xorg を持たない(グラフィカルではない)環境向けのオプションです。Docker をグラフィカルな環境で実行する時に 必要 です。これらのパッケージが必要な理由は、バックポートされたカーネルに関するインストール手順をご覧ください。 LTS Enablement Stack の note 5 にある各バージョンをご覧ください。

カーネルのアップグレードと追加パッケージのインストールは次のようにします。

  1. Ubuntu ホスト上でターミナルを開きます。
  1. パッケージ・マネージャを更新します。
$ sudo apt-get update
  1. 必要なパッケージとオプションのパッケージの両方をインストールします。
$ sudo apt-get install linux-image-generic-lts-trusty

環境に応じて、先ほどのリストにあるパッケージをインストールします。

  1. ホストを再起動します。
$ sudo reboot
  1. システムの再起動後、Docker のインストールに移ります。

インストール

インストール前に、各 Ubuntu バージョン固有の作業を終えてください。それから、以降の手順で Docker をインストールします。

  1. インストールする Ubuntu に、 sudo 特権を持つユーザでログインします。
  1. apt パッケージのインデックスを更新します。
$ sudo apt-get update
  1. Docker をインストールします。
$ sudo apt-get install docker-engine
  1. docker デーモンを開始します。
$ sudo service docker start
  1. docker を正常にインストールしたかを確認します。
$ sudo docker run hello-world

このコマンドは、テストイメージをダウンロードし、コンテナとして実行します。コンテナを実行時にメッセージ情報を表示して、それから終了します。

オプション設定

このセクションは、Ubuntu と Docker がうまく機能するようなオプション手順を紹介します。

docker グループの作成

docker デーモンは TCP ポートの代わりに Unix ソケットをバインドします。デフォルトでは、Unix ソケットは root ユーザによって所有されており、他のユーザは sudo でアクセスできます。このため、 docker デーモンは常に root ユーザとして実行されています。

docker コマンド利用時に sudo を使わないようにするには、 docker という名称のグループを作成し、そこにユーザを追加します。 docker デーモンが起動したら、docker グループの所有者により Unix ソケットの読み書きが可能になります。

警告

docker グループに所属するユーザは root と同等です。システム上のセキュリティに対する影響の詳細は、 Docker デーモンが直面する攻撃 をご覧ください。

docker グループを作成し、ユーザを追加するには、

  1. Ubuntu に sudo 特権のあるユーザでログインします。

ログイン時のユーザ名は ubuntu ユーザかも知れません。

  1. docker グループを作成し、ユーザを追加します。
$ sudo usermod -aG docker ubuntu
  1. ログアウトしてから、再度ログインします。

対象ユーザが適切な権限を持つようにするためです。

  1. sudo を使わずに docker の実行を確認します。
$ docker run hello-world

失敗時は、次のようなメッセージが表示されます。

Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?

DOCKER_HOST 環境変数をシェル上で確認します。もし設定されていれば、unset します。

メモリとスワップ利用量の調整

ユーザが Docker を実行する時、イメージ実行時に次のメッセージを表示する場合があります。

WARNING: Your kernel does not support cgroup swap limit. WARNING: Your
kernel does not support swap limit capabilities. Limitation discarded.

このメッセージを出さないようにするには、システム上でメモリとスワップの利用量(アカウンティング)を設定します。メモリとスワップ利用量の設定を有効にしますと、Docker を使っていない時、メモリのオーバヘッドとパフォーマンスの低下を減らします。メモリのオーバヘッドは利用可能な全メモリの1%程度です。パフォーマンス低下は、おおよそ10%です。

GNU GRUB (GNU GRand Unified Bootloader) システム上で、メモリとスワップを次のように設定します。

  1. Ubuntu に sudo 特権のあるユーザでログインします。
  1. /etc/default/grub ファイルを編集します。
  1. GRUB_CMDLINE_LINUX 値を次のように設定します。
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
  1. ファイルを保存して閉じます。
  1. GRUB を更新します。
$ sudo update-grub
  1. システムを再起動します。

UFW 転送の有効化

Docker を実行するホスト上で UFW (Uncomplicated Firewall) を使っている場合、追加設定が必要になります。Docker はコンテナのネットワーク機能のためにブリッジを使用します。デフォルトでは、UFW は全ての転送(forwarding)トラフィックを破棄(drop)します。そのため、UFW が有効な状態で Docker を実行する場合、UFW の forwarding ポリシーを適切に設定しなくてはいけません。

また、UFW のデフォルト設定は incoming トラフィックを全て拒否します。他のホストからコンテナに接続したい場合、Docker のポートに対する incoming トラフィックを許可する設定をします。Docker のポートは TLS が有効であれば 2376 であり、そうでなければ 2375 です。デフォルトでは、TLS が有効でなければ通信は暗号化しません。Docker のデフォルトは、TLS が有効ではありません。

UFW を設定するには、Docker ポートに対する incoming 接続を許可します。

  1. Ubuntu に sudo 特権のあるユーザでログインします。
  1. UFW のインストールと有効化を確認します。
$ sudo ufw status
  1. /etc/default/ufw を開き、編集します。
$ sudo nano /etc/default/ufw
  1. DEFAULT_FOWRARD_POLICY ポリシーを設定します。
DEFAULT_FORWARD_POLICY="ACCEPT"
  1. ファイルを保存して閉じます。
  1. UFW を新しい設定を使って再読み込みします。
$ sudo ufw reload
  1. Docker ポートの incoming 接続を許可します。
$ sudo ufw allow 2375/tcp

Docker が使う DNS サーバの設定

Ubuntu や Ubuntu 派生システムのデスクトップを動かすシステムは、デフォルトで /etc/resolv.conf ファイルで使用する nameserver127.0.0.1 です。NetworkManager も dnsmasq をセットアップする時は、 /etc/resolv.confnameserver 127.0.0.1 に設定します。

デスクトップ・マシンでコンテナを起動時、このような設定であれば、次の警告が出ます。

WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers
can't use it. Using default external servers : [8.8.8.8 8.8.4.4]

この警告は、Docker コンテナがローカルの DNS サーバを使えないためです。そのかわりDocker はデフォルトで外部のネームサーバを使います。

警告を出ないようにするには、Docker コンテナが使うための DNS サーバを指定します。あるいは、NetworkManager で dnsmasq を無効にもできます。 dnsmasq を無効にすると、同一ネットワークの DNS 名前解決が遅くなるかも知れません。

Docker が使う DNS サーバの指定方法は、次の通りです。

  1. Ubuntu に sudo 特権のあるユーザでログインします。
  1. /etc/default/docker ファイルを開き、編集します。
$ sudo nano /etc/default/docker
  1. Docker の設定を追加します。
DOCKER_OPTS="--dns 8.8.8.8"

8.8.8.8192.168.1.1 のようなローカルの DNS サーバに置き換えます。複数の DNS サーバも指定できます。その場合は、次の例のようにスペースで分離します。

--dns 8.8.8.8 --dns 192.168.1.1

警告

この作業を PC 上で行う場合は様々なネットワークに接続するため、パブリック DNS サーバを選択してください。

  1. ファイルを保存して閉じます。
  1. Docker デーモンを再起動します。
$ sudo restart docker

あるいは、先ほどの手順とは別の方法として、NetworkManager で dnsmasq を無効化する方法もあります(ネットワークが遅くなるかも知れません)。

  1. /etc/NetworkManager/NetworkManager.conf ファイルを開き、編集します。
$ sudo nano /etc/NetworkManager/NetworkManager.conf
  1. dns=dnsmasq 行をコメントアウトします。
dns=dnsmasq
  1. ファイルを保存して閉じます。
  1. NetworkManager と Docker の両方を再起動します。
$ sudo restart network-manager
$ sudo restart docker

ブート時の Docker 起動設定

Ubuntu 15.04 以上はサービス・マネージャに systemd を使って起動します。 14.10 以下のバージョンでは upstart です。

15.04 以上で docker デーモンをブート時に起動するようにするには、次のように実行します。

$ sudo systemctl enable docker

14.10 以下では、自動的に upstart を使って Docker デーモンをブート時に起動する設定がインストール時に行われます。

Docker のアップグレード

Docker の最新版をインストールするには、 apt-get を使います。

$ sudo apt-get upgrade docker-engine

アンインストール

Docker パッケージをアンインストールします。

$ sudo apt-get purge docker-engine

Docker パッケージと必要のない依存関係をアンインストールします。

$ sudo apt-get autoremove --purge docker-engine

上記のコマンドは、イメージ、コンテナ、ボリュームやホスト上の設定ファイルを削除しません。イメージ、コンテナ、ボリュームを削除するには次のコマンドを実行します。

$ rm -rf /var/lib/docker

ユーザが作成した設定ファイルは、手動で削除する必要があります。