Ubuntu

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

  • Ubuntu Wily 15.10
  • Ubuntu Vivid 15.04
  • Ubuntu Trusty 14.04 (LTS)
  • Ubuntu Precise 12.04 (LTS)

このページでは、Docker が管理しているパッケージとインストール手法を使ってインストールします。これらパッケ―ジを使い、Docker の最新リリースを入手します。もし Ubuntu が管理するパッケージを使いたい場合は、Ubuntu のドキュメントをお調べください。

注釈

Ubuntu Utopic 14.10 には Docker の apt レポジトリが存在しますが、公式にサポートしていないものです。

動作条件

Docker は 64bit でインストールされた何らかの 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. まだであれば Ubuntu サーバに特権ユーザでログインします。
  1. ターミナルのウインドウを開きます。
  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 Vivid 15.04
deb https://apt.dockerproject.org/repo ubuntu-vivid main
  • Ubuntu Wily 15.10
deb https://apt.dockerproject.org/repo ubuntu-wily main
  1. /etc/apt/sources.list.d/docker.list ファイルを保存して閉じます。
  1. apt パッケージのインデックスを更新します。
$ apt-get update
  1. 古いレポジトリが残っているのなら、パージします。
$ apt-get purge lxc-docker
  1. apt が正しいレポジトリから取得できるか確認します。
$ apt-cache policy docker-engine

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

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

  • Ubuntu Wily 15.10
  • Ubuntu Vivid 15.04
  • Ubuntu Trusty 14.04 (LTS)

Ubuntu Trusty・Vivid・Wily では、 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 の場合、更新が必要です。環境に応じてどのパッケージが必要になるかは、次の表を参照ください。

libgl1-mesa-glx-lts-trusty

  • 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. ファイルを保存して閉じます。

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 を使います。

$ 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

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