Pa 2 様々な環境への Docke 「のインストー丿レ Chapter2-0 1 Docker の動作に必要なもの Docke 「環境でコンテナを稼働させるには、 Linux カーネルと Docke 「サーバー、 Docke 「クライアン トが必要です。これらを用意する際は、 Linux ディストリビューションを利用するのが手軽です。仮 想化ソフトを使えば、 Windows や OS X の上にも Docke 「稼働環境を構築できます。 Linux カーネルとロ ocker サーバー、ロ ocker クライアントが必要 Docke 「は Linux カーネ丿レの複数の機能を使ってコンテナ稼働環境を実現します。その ため、稼働させるには Linux カーネルが必要です。 Docke 「のバージョンによって、利用が推奨される Linux カーネルのバージョンは変わ ります ( 2-1-1 ) 。 201 5 年 1 2 月時点の最新版であるバージョン 1 .9 系列の Docke 「では、 カーネル 3. ] O 以降の利用が必須となっています。それ以前のバージョンのカーネルでも 部の機能が利用できなくなったり、動作が Docke 「を稼働できるケースはありますが、 不安定になったりする恐れがあります。 Docker のバージョンと利用が推奨される Linux カーネル Docker のバージョン推奨される Linux カーネルのバージョン >2-1-1 30 1 . O/ 1 . 1 1 .2 ~ 1 .4 1 .5 ~ 1 .9 3.8 以降 3.10 以降 ( 3.8 以降が必須 ) 3.10 以降 ( 3.10 以降が必須 ) また、 Docke 「の中核機能を提供する「 Docke 「サーバー」と、 Docke 「の管理コマンド である「 Docke 「クライアント」も必要です。 Docke 「サーバーは 201 5 年 ] 2 月時点で は、基本的に Linux 上でしか稼働しません。一方、 Docke 「クライアントは Linux 以外に Windows や OS X でも稼働します。 これらの Docke 「の必須コンポーネントを稼働させるべース環境としては、 Linux カー ネルと多数のソフトウェアを組み合わせて OS として稼働するように構成した「 Linux デ イストリビューション」を使うのが簡単です。
Pa 3 docke 「コマンドによるイメージ取得とコンテナ稼働 Docker サーバーの情報取得などに chapter3-1 2 使うサブコマンド Docker クライアント (docker コマンド ) には、 Docke 「サーバーの実行状態やバージョン情報など を取得するサブコマンドが用意されています。ここでは、 Docke 「クライアントと Docker サーバー のバージョン情報を表示する ve 「 sion サブコマンド、 Docker サーバーの実行状態を表示する info サ ブコマンドについて解説します。 ロ ocker クライアントとロ ocker サーバーのバージョン情報を 表示する (version サプコマンド ) Docke 「クライアントと Docke 「サーバーのバージョン情報を表示するのに使用するの が、 version サブコマンドです。 ve 「 sion サブコマンドの書式は次の通りです。 docker version オプションノ 実行すると、 3-12-1 のような情報が表示されます。 Docke 「のバージョンだけでなく、 Go 言語のバージョンや Docke 「クライアントやサーバーが稼働している OS の情報など が表示されます。 >3-12-1 ve 「 sion サブコマンドによる情報表示例 $ sudO dOCke 「 ve 「 S i on 引 i ent : Version: API version: GO version: G i 士 comm i t : Bu i 比 OS/A rch : ・ Server: Ve 「 Sion: API version: GO version: G i 士 cornm i t : OS/A rch : 164 1 . 9 . 0 1 . 21 g01 . 4.2 76d6bC9 Tue Nov 3 1 8 : 囲 : 05 UTC 2015 Ⅱ nux/amd64 1 . 2 1 g01 . 4.2 間 d6 bc9 Tue Nov 3 1 8 : 00 : 05 IJTC 2015 Ⅱ nux/arnd64
Chapter3-11 DOCke 「サーバーの動作制御に用いるサブコマンド ィレクトリにある「℃ sh 「 c 」 ( または「 . tcsh 「 c 」 ) というファイルの末尾に上記のコマン ドを記述した行を追加すると良いでしよう。 環境変数に設定した値をクリアする場合は、次のコマンドを実行します。 $ unsetenv DOCKER HOST Enter ストレージドライバを指定する - s オプション Linux で稼働する Docke 「サーバーは、バージョン 1 .9 の時点で「 aufs 」「 btrfs 」「 zfs 」 「 devicemapper 」「 ove 船 Y 」「 vfs 」の 6 種類のストレージドライバを切り替えて使用で きます。 ストレージドライバとは、コンテナのファイルシステムやイメージの差分管理のための 手段を提供するドライバです。 Docke 「が開発された当初は、 AUFS(Anothe 「 UnionFS) という、複数のファイルやディレクトリを透過的に重合わせられる「スタッカブルファ イルシステム」だけをストレージ管理に使用していましたが、バージョン O. 7 でストレー ジドライバの仕組みが導入され、利用するストレージ管理方式 ( ストレージバックエンド ) を切り替え可能になりました。 通常はストレージドライバを切り替える必要はありませんが、テストやべンチマーク目 的、あるいはよりストレージの利用効率が高いもの、安定性が高いもの、高速処理ができ るものを探す目的で切り替えるケースはあると思われます。そこでここでは、それそれの ストレージドライバの概要と切り替え方法について紹介します。 ー現在利用中のストレージドライバの調査方法 Docke 「サーバーが使用中のストレージドライバは、次のコマンドで調査できます。 Pa ュ 3 $ docker infO ー grep "Storage D て土 ve て” Enter 古いバージョンの Docke 「では AUFS を使用する「 aufs 」というストレージドライバが 主に使われていましたが、最近のバージョンでは、 Linux の論理ボリューム管理機構 「 Device Mappe 「」の dm - thin という機能を使う「 devicemappe 「」というストレージド ライバが使われることが多いようです。 なお、ストレージドライバを特に指定しないで Docke 「サーバーを起動した場合は、 「 aufs 」「 bt 「 fs 」「 zfs 」「 devicemappe 「」「 overlay 」「 vfs 」の順に利用可能なストレー ジバックエンドを探し、最初に見つかったものを使用します。 1 59
( h 。 pt 鉱 4-04 プライベートレジストリの構築と利用 >4-4-1 プライベートレジストリの起動時に指定するオプションの意味 Docke 「サーバーか稼働するホストの TCP5000 番リボジトリのデータを格納するための ボートで通信を待ち受けるための設定 ホスト上のディレクトリ $ docker run -d -p 5000 : 5000 -v /var/lib/docker-registr : /var/lib/registry -restart=always registry : 2 Enter 工ラーなどで停止した場合、自動的に コンテナを再起動する設定 なおこのコマンドでは、 Docke 「のバージョン ] .6 以降がサポートするバージョン 2 系 の A 曰 (Application P 「 og 「 amming lnte 「 face) に対応したレジストリを起動していま す。新しいレジストリ実装の方が処理性能や拡張性の面で優れていますし、近い将来に古 い実装は廃止される予定ですので、理由がなければこちらを使うことをお勧めします。 ただし、 20 ] 5 年 ] 2 月時点では、レジストリを構成するライブラリの一部がまだ完全 に安定している状態とは言えす、バージョン 1 系の A 曰だけに対応したレジストリの方に [latest 」というタグ名が付けられています。安定性を重視する場合は、「「 egist 「 y:2 」の 代わりに「「 egistry 」 ( タグ名を指定する場合は「「 egist 「 y:latest 」または「「 egist 「 y: O. 9.1 」 ) というイメージを使うと良いでしよう。イメージ内でのリボジトリ格納ディレク トリの設定が違うため、起動手順は次のようになります。 Pa ュ 4 $ sud0 mkdir -p /var/lib/docker-registry $ docker run -d -p 5000 : 5000 -v /var/lib/docker-registry : /tmp/registry —restart=always registry E nter Enter 以降では、バージョン 2 系の API に対応したレジストリを稼働させているものとして解 説していきます。 ー Docker サーバー側の準備 プライベートレジストリの構築手順は前述の通りですが、実はこれだけでは「完全版」 のレジストリを構築できるわけではありません。 Docke 「では、 Docke 「サーバーとレジストリとの間の通信を保護するため、 TLS (Transport Layer SecuritY) というプロトコルで通信路の暗号化と通信相手の認証を行 います。前述の手順だけで構築したプライベートレジストリには、この TLS で使用するデ ジタル証明書や暗号鍵が設定されていないため、 TLS を使った通信に対応していないので す。 1 93
( h 。 p 「 3-05 イメージ管理用サブコマンド ( 3 ) ーレジストリを使ったイメージ操作に関するサプコマンド $ curl -s https ://registry.hub.docker.com/v2/repositories/Y/ffY'hLJ名/tags/ ー grep -PO "'name Enter Docke 「 Hub では、公式イメージあれば「ⅱ b 「 a 「 Y / リボジトリ名」、非公式イメージであ れば「ユーザー名 / ユーザーが設定したリポジトリ名」の書式でリポジトリ名を指定しま す。つまり、公式イメージ「 ubuntu 」であれば「 lib 「 a 「 y/ubuntu 」、「 use 「 /ubuntu 」と いう非公式イメージであれば「 use 「 /ubuntu 」を指定します。実行結果は 3-5-8 のように なります。 Pa ュ 3 >3-5-8 Docker Hub のリボジトリに格納されているイメージのタグ名調査例 $ curl -s https://regist . hub. docker. com/v2/reposit0 「 ies/libra 「 y ん buntu/tags/ ー g 「 ep -Po name 气代爲 ty ~ 2 田 51028 気 p ロ i 望田 51028 " " ⅵⅵ十 20151106 " vivid バージョン 2 系の A を実装するレジストリでは、 sea 「 ch サプコマンドを利用できない Docker 社は、 2015 年 12 月の時点で新しいレジストリ実装の開発を進めています。新しいレ ジストリでは、バージョン 2 系の A 曰 (AppIication Programming lnterface) が利用できるよ うになり、処理の高速性や拡張性などが向上しています。 しかし、バージョン 1 .9 までの Docke 「の sea 「 ch サブコマンドは、この新しいレジストリに未 対応です ( 2015 年 12 月時点 ) 。新しい実装のレジストリにあるリボジトリー覧は、 cu 目コマンド を次のように実行すると調べられます。 CoIumn $ curl -s ースキーム : / 〃レシスリのオス名またな工アアレスレシスリのー番号ノ /v2/ catalog Enter
( hapte 「 5-01 複数のコンテナを連携させる一ⅱ nk オプション コンテナは、仮想ィーサネットインタフェース (veth) を通じて仮想ブリッジ (docke 「 O) に接続されており、仮想ブリッジを通じて他のコンテナと通信できるように なっています。他のコンテナとの通信を許可する「 --icc=t 「 ue 」という設定は、コンテナ 起動時に既定で有効化されます。そのため、ユーザーがあえてこれを無効にしなければ、 コンテナ同士の通信は問題なく実現できます。 ロコンテナ間で通信をする仕組み ただし、ここで問題になるのがコンテナの IP アドレスです。 Docke 「は各コンテナに、 「 ] 72. ] 7. O. O / ] 6 」というネットワーク範囲の IP アドレスを非固定的に割り当てます。 そのため、通信相手のコンテナにどのような IP アドレスが割り当てられるかを事前に知 ることはできません。通信相手を特定するための、何らかの手段が必要になります。 Docke 「はこの問題を、後述するコンテナの「リンク」という手続きで解決しています。 なお、他のホストで稼働するコンテナと通信する場合は、そのコンテナとホストの間で ボート転送設定が適切に行われてさえいれば、何も特別なことはありません。通常のサー バー連携と同じように、ホストの旧アドレスとボート番号を宛先にして通信が可能です。 この場合、ホストの特定のポートで通信を待ち受けるように、通信相手のコンテナを起動 しておく必要があります。また、ホストの旧アドレスは固定的に割り当てるか、ダイナミ ック DNS などの手段を使ってホスト名でアクセスできるようにしておく必要がありま す。 Pa ュ 5 バージョン 9 からマルチホスト連携が可能に Docke 「のバージョン ] .9 には、マルチホストネットワーク機能が追加されました。こ の機能を利用すると、異なるホストで稼働するコンテナを、同じ仮想ネットワークに接続 できるようになり、ホストの IP アドレスやポート転送設定などと無関係に、コンテナ同士 が直接通信できるようになります。 ーマルチホスト連携を利用する条件 非常に便利な機能ですが、利用するには若干の条件と、ある程度の準備が必要です。ま ず、同機能を利用する Docke 「環境では、 Linux カーネルがバージョン 3. ] 6 以降である必 要があります。また、それそれの Docke 「環境では、共通に利用できる分散型の「キーバ リューストア」 ( キーと値の組み合わせを格納できるデータベース ) を稼働させる必要があ ります。 Docke 「 ] .9 の時点で利用できる分散キーバリューストアは「 ConsulJ 「 Etcd 」 「 ZooKeeper 」のいずれかです。さらに、各ホストを「 Docker Swarm 」という Docke 「 201
Chapter4-04 プライベートレジストリの構築と利用 プライベートレジストリの利用 構築したプライベートレジストリを利用する方法は、 Chapte 「 3 ー 05 で紹介した通りで す。 Docke 「 Hub を利用する場合と違うのは、各種サブコマンドで、イメージやリポジト リを指定する箇所の前に「レジストリの IP アドレス : ボート番号 / 」という文字列を付加す るだけです。 実際にイメージをプライベートレジストリに登録したり、そこからダウンロードしたり してみましよう。プライベートレジストリの IP アドレスは「 192. ] 68. O. ] 46 」、ポート 番号は「 5000 」だとします。 ーイメージの登録と取得 ローカル環境にある「 mydate 」というイメージをプライベートレジストリに登録して みます。最初に tag サブコマンドでイメージにプライベートレジストリの情報を付加し、 続いて pus 目サブコマンドでイメージを登録します。実行手順は次の通りです。 Pa ュ 4 $ docker tag mydate 192 .168 . 0 .146 : 5000 / mydate $ docker push 192 .168 . 0 .146 : 5000 / mydate Enter Enter 実行後、実際にイメージが登録されたかどうかを、 cu 目コマンドで確認してみましよう。 実行手順は次の通りです。 $ curl http : / / 192 .168 . 0 .146 : 5000 / v2 / catalog Enter 実行結果は 4-4-2 の通りです。登録したイメージの情報が表示されていることが分かり ます。 cu 「ロマンドでプライベートレジストリにイメージが登録されたことを確認した例 4-4-2 $ curl h 量 p : 〃 192.168.0.146 : 5 囲 0 / v2 / ー cat og {" 「 epositories":C"mydate"]] なお残念ながら、 sea 「 ch サブコマンドは、 2015 年 12 月時点ではバージョン 2 系の A 曰に対応した新しい実装のレジストリでは利用できません。バージョン ] 系の A 曰だけ に対応した古い実装のレジストリでは利用可能です。そうしたレジストリに対しては、次 1 95
複数コンテナの連携と Docker Compose Pa 5 INDEX docker-compose. yml ファイルの記述例 docker-compose コマンドを使った管理手順 docker-compose. yml ファイルの書式 Docke 「 Compose の概要とインストール Chapter 5-02 Docker Compose を用いた複数コンテナの連携管理 コンテナの起動順序を守る必要がある 相手コンテナの情報を設定する -- ⅱ nk オプション バージョン 1 .9 からマルチホスト連携が可能に Docke 「のネットワーク chapter 5-01 複数のコンテナを連携させる一ⅱ nk オプション を使ったサービス管理 200 200 201 202 205 206 206 208 21 3 216 1 99 222
Part2 様々な環境への Docke 「のインストール スクリプトを使ったインストール手順 バッケージを使ったインストー丿レは手軽ですが、インストールされる Docke 「のバージ ョンがやや古いことに難点があります。例えば Ubuntu 14.04 では、バージョン ] . O 系 の Docke 「がインストールされます。バージョン 1 . 1 以降にしかない機能を使いたい場合 には、別の方法で Docke 「をインストールする必要があります。 Docke 「を手軽にインストールできるように、米 Docke 「社は、 https://get.docke 「 . com/ という IJ 日 L でインストールスクリプトを配布しています。これを利用することで、 最新安定版の Docke 「を Ubuntu をはじめとしたいくつかの Linux ディストリビューショ ンにインストールできます※ 2 。 このインストールスクリプトを使って Ubuntu ] 4.04 に Docke 「をインストールする には、「 wget 」というコマンドを利用します。まず、インターネットに接続した状態で 「 apt-get 」コマンドで wget を lJbuntu ヘインストールします。次に wget コマンドを実 行します※ 3 。 ※ 2 2015 年 ] 2 月時点でこのインストールスクリプトが対応しているのは、 CJbuntu のほか、 Amazon Linux AMI, Debian GNU/Linux 、 Fedo 「 a 、 Gentoo Linux 、 openSUSE 、などです。 ※ 3 既にバッケージを使って Docke 「をインストールしている場合は、 p. 42 を参考にして Docke 「とその関 連ファイルを完全に消去してからインストール用のコマンドを実行する必要があります。 $ sudo apt-get -y update $ sud0 apt-get -y 土 ns セ a11 wget $ wget -qO- https : //get. docker. com/ ー sh Enter E nte r Enter これにより、 Docke 「社のリボジトリが有効になり、そのリポジトリから「 docke 「 - engine 」というパッケージがインストールされます。 継続的に利用する場合は、次のコマンドを実行して、システム起動時に Docke 「サーバ ーが自動起動する設定を追加しておいた方がいいでしよう。 $ sudO update-rc. d docker enable Enter これで Docke 「を利用できるようになりました。 Docke 「が正しくインストールされて 稼働できるかを確認するには、 p. 38 同様にインターネットに接続した状態で、次のコマン ドを実行します。 イ 0
Docke 「とは何か、なぜ注目されるのか を区分するために「 ch 「 00t 」、通信データを適切に配分するために「 Netfilter 」や「仮想 ネットワークドライバ」などの機能を使っています。 Docke 「は、こうしたカーネル機能を活用して、コンテナやコンテナ内で稼働させるソ フトウェア環境の実行イメージなどを管理します。 なお、 Linux カーネルのコンテナ関連機能は、 2006 年頃から実装が始まり、 201 3 年 頃に一通りの機能が揃いました。コンテナ技術の有用性から、これらの機能は、さまざま なソフトウェアで利用されてきました。代表的なソフトウェアの ] つが、「 LXC 」 (Linux Container) というコンテナ管理ソフトです。 Docke 「は当初、 LXC を使ってコンテナを 管理していましたが、 20 ] 4 年 3 月にリリースされたバージョン O. 9 以降では LXC は不 要になり、既定設定では独自のライブラリ (libcontainer) を介して、コンテナ関連のカ ーネ丿レ機能を利用します。 イメージを柔軟に管理できるのがロ ocke 「の特徴 コンテナ型仮想化やそれに類似する技術は、決して目新しいものではありません。例え ば、 Linux と同様のフリーの IJNIX 系 OS である F 「 eeBSD では、「 jaiIJ と呼ばれるコンテ ナ作成機能が 2000 年から利用できますし、 Linux においても 200 ] 年には「 Vi 「 tuozzo 」 と呼ばれる有償のコンテナ型仮想化ソフトが利用できました。前述の LXC も、最初のバー ジョンがリリースされたのは 2008 年のことです。 これに対して Docke 「の最初のバージョンがリリースされたのは 20 ] 3 年です。同じコ ンテナ型仮想化を実現する他のソフトが複数存在する中、 Docke 「の何が注目を集めたの でしようか。 Docke 「が注目された理由の ] つに、コンテナの設定やコンテナで稼働するソフトウ工 ア群をまとめたテンプレートである「イメージ」を柔軟に管理できることが挙げられるで しよう。 Docke 「のイメージ管理の特徴は主に次の 2 つです。 ①イメージを階層的に管理・利用できる ②「 Docke 「 Hub 」のようなレジストリサービスにイメージ群を登録して再利用できる Docke 「のイメージ管理の概要を 1-2-3 に図示しました。 24 Pa 1