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
が新しいリポジトリにあるパッケージを使えるように設定します。
- マシンに
sudo
もしくはroot
特権のあるユーザでログインします。
- ターミナルのウインドウを開きます。
- パッケージ情報を更新します。 APT が
https
メソッドで動作することを確認し、CA
証明書がインストールされるのを確認します。
$ apt-get update
$ apt-get install apt-transport-https ca-certificates
- 新しい
GPG
鍵を追加します。
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
/etc/apt/sources.list.d/docker.list
ファイルを任意のエディタで開きます。
ファイルが存在しなければ、作成します。
- 既存のエントリがあれば削除します。
- 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 をご覧ください。
/etc/apt/sources.list.d/docker.list
ファイルを保存して閉じます。
apt
パッケージのインデックスを更新します。
$ sudo apt-get update
- 古いリポジトリが残っているのなら、パージします。
$ sudo apt-get purge lxc-docker
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-extra
は aufs
ストレージ・ドライバを利用可能にします。
自分のカーネル・バージョンに対応した linux-image-extra
パッケージをインストールします。
- Ubuntu ホスト上のターミナルを開きます。
- パッケージ・マネージャを更新します。
$ sudo apt-get update
- 推奨パッケージをインストールします。
$ sudo apt-get install linux-image-extra-$(uname -r)
- 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 にある各バージョンをご覧ください。
カーネルのアップグレードと追加パッケージのインストールは次のようにします。
- Ubuntu ホスト上でターミナルを開きます。
- パッケージ・マネージャを更新します。
$ sudo apt-get update
- 必要なパッケージとオプションのパッケージの両方をインストールします。
$ sudo apt-get install linux-image-generic-lts-trusty
環境に応じて、先ほどのリストにあるパッケージをインストールします。
- ホストを再起動します。
$ sudo reboot
- システムの再起動後、Docker のインストールに移ります。
インストール¶
インストール前に、各 Ubuntu バージョン固有の作業を終えてください。それから、以降の手順で Docker をインストールします。
- インストールする Ubuntu に、
sudo
特権を持つユーザでログインします。
apt
パッケージのインデックスを更新します。
$ sudo apt-get update
- Docker をインストールします。
$ sudo apt-get install docker-engine
docker
デーモンを開始します。
$ sudo service docker start
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
グループを作成し、ユーザを追加するには、
- Ubuntu に
sudo
特権のあるユーザでログインします。
ログイン時のユーザ名は ubuntu
ユーザかも知れません。
docker
グループを作成し、ユーザを追加します。
$ sudo usermod -aG docker ubuntu
- ログアウトしてから、再度ログインします。
対象ユーザが適切な権限を持つようにするためです。
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) システム上で、メモリとスワップを次のように設定します。
- Ubuntu に
sudo
特権のあるユーザでログインします。
/etc/default/grub
ファイルを編集します。
GRUB_CMDLINE_LINUX
値を次のように設定します。
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
- ファイルを保存して閉じます。
- GRUB を更新します。
$ sudo update-grub
- システムを再起動します。
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 接続を許可します。
- Ubuntu に
sudo
特権のあるユーザでログインします。
- UFW のインストールと有効化を確認します。
$ sudo ufw status
/etc/default/ufw
を開き、編集します。
$ sudo nano /etc/default/ufw
DEFAULT_FOWRARD_POLICY
ポリシーを設定します。
DEFAULT_FORWARD_POLICY="ACCEPT"
- ファイルを保存して閉じます。
- UFW を新しい設定を使って再読み込みします。
$ sudo ufw reload
- Docker ポートの incoming 接続を許可します。
$ sudo ufw allow 2375/tcp
Docker が使う DNS サーバの設定¶
Ubuntu や Ubuntu 派生システムのデスクトップを動かすシステムは、デフォルトで /etc/resolv.conf
ファイルで使用する nameserver
は 127.0.0.1
です。NetworkManager も dnsmasq
をセットアップする時は、 /etc/resolv.conf
を nameserver 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 サーバの指定方法は、次の通りです。
- Ubuntu に
sudo
特権のあるユーザでログインします。
/etc/default/docker
ファイルを開き、編集します。
$ sudo nano /etc/default/docker
- Docker の設定を追加します。
DOCKER_OPTS="--dns 8.8.8.8"
8.8.8.8
を 192.168.1.1
のようなローカルの DNS サーバに置き換えます。複数の DNS サーバも指定できます。その場合は、次の例のようにスペースで分離します。
--dns 8.8.8.8 --dns 192.168.1.1
警告
この作業を PC 上で行う場合は様々なネットワークに接続するため、パブリック DNS サーバを選択してください。
- ファイルを保存して閉じます。
- Docker デーモンを再起動します。
$ sudo restart docker
あるいは、先ほどの手順とは別の方法として、NetworkManager で dnsmasq
を無効化する方法もあります(ネットワークが遅くなるかも知れません)。
/etc/NetworkManager/NetworkManager.conf
ファイルを開き、編集します。
$ sudo nano /etc/NetworkManager/NetworkManager.conf
dns=dnsmasq
行をコメントアウトします。
dns=dnsmasq
- ファイルを保存して閉じます。
- 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 パッケージをアンインストールします。
$ sudo apt-get purge docker-engine
Docker パッケージと必要のない依存関係をアンインストールします。
$ sudo apt-get autoremove --purge docker-engine
上記のコマンドは、イメージ、コンテナ、ボリュームやホスト上の設定ファイルを削除しません。イメージ、コンテナ、ボリュームを削除するには次のコマンドを実行します。
$ rm -rf /var/lib/docker
ユーザが作成した設定ファイルは、手動で削除する必要があります。
参考
- Installation on Ubuntu
- https://docs.docker.com/engine/installation/linux/ubuntulinux/