Dockerconf2017で発表のあったlinuxkitとMoby Project。
デモを見て衝撃を受け、今後のDockerに新たなImmutable infrastructureの可能性を感じたので調べたり試したりしてみました。
実際に動かしてみたスクリーンショットも載せてあります。
皆さんにも僕の感じた衝撃と可能性を知ってもらいたいです。是非最後まで読んでいってください!
これを読んでわかること
- Moby Projectとlinuxkitの概要
- mobyを使ってbuildやrunをする方法
- mobyを使ってGCPでインスタンスを立てる方法
環境
OS: MacOSX Sierra
Go: version 1.8.1
docker: version 1.13.1
前置きと解説
動かす方法だけ知りたい、という人はスキップしてください。
2016年のDocker
Dockerコンテナはポータビリティに優れたアーキテクチャでしたが、当初はLinuxでしか動かず、macやwindowsではdocker-machineなどの仮想環境上にdockerをインストールして使うしかありませんでした。
Docker for mac, windows
しかし、2016年にDocker for macやDocker for windowsがリリースされました。
macOS上ではhyperkit、windows上ではhyper-Vを使っておりネイティブではありませんでしたが、VM構築などの作業をしなくてもdockerを動かせるようになりました。
infrakit
dockerは2016年の10月にinfrakitというものをリリースしています。あんまり注目してなかったので詳しくは知りません。
詳しくはこちら: http://www.publickey1.jp/blog/16/dockerinfrakitdocker.html
InfraKitはこうしたクラウドごと、環境ごとに異なるDocker環境の構築と運用の自動化と共通化をすることで、Dockerの導入と運用を容易にしてしまおうというもの。さまざまな環境に対応するため、プラガブルな構造になっています。
これは差別化による優位性を実現しようとするクラウドベンダーに対して、クラウド基盤の差別化を吸収し抽象化して共通化してしまおうというDocker側の試みといえます。
windowsコンテナ
Windows Server 2016やWindows 10 Anniversary Update以降ではWindowsコンテナが使えるようになりました。
詳しくはこちら: http://www.atmarkit.co.jp/ait/articles/1611/04/news028.html
今回のkeynoteでもazureのアーキテクトが登壇され、Azure上でのWindowsコンテナのデモを行っていました。
https://blogs.technet.microsoft.com/hybridcloud/2017/04/18/dockercon-2017-powering-new-linux-innovations-with-hyper-v-isolation-and-windows-server/
docker swarm mode
docker v1.12ではdocker swarm modeがdocker engineに統合されました。
docker stackコマンドによりdocker-composeファイルを使ったデプロイや、内部KVS・内部LBなどが搭載されDockerコンポーネント内でのオーケストレーションやデプロイ機能が大幅に強化されました。
これまでの流れ
このように、2016年のdockerはオーケストレーションやクラウド環境など、今までのコンテナのよりも一歩上の枠組みへの挑戦を進めてきたといえると思います。
そして、今回のDockerCon2017ではこれらのさらに上のレイヤーにまで大きく枠組みを広げてきました。それでは本題に入りましょう!
Moby ProjectとLinuxkit
LinuxKit
今日のDockerConf2017で発表されたツールがLinuxKitです。
しかも、keynote中にLiveでprivateリポジトリからpublicリポジトリに切り替えられ、OSS化されました。カッコイイ。
https://github.com/linuxkit/linuxkit
下記記事がannounceです。
https://blog.docker.com/2017/04/introducing-linuxkit-container-os-toolkit/
Last year, one of the most common requests we heard from our users was to bring a Docker-native experience to their platforms. These platforms were many and varied: from cloud platforms such as AWS, Azure, Google Cloud, to server platforms such as Windows Server, desktop platforms that their developers used such as OSX and Windows 10, to mainframes and IoT platforms – the list went on.
公式リポジトリではこう紹介されています。
LinuxKit, a toolkit for building custom minimal, immutable Linux distributions.
LinuxKitはcontainerdが動くための最小限のLinuxをビルドするためのツールキットで、Immutable infrastructureであるDockerコンテナをLinux distributionとして配布するためのものです。
これだけの説明だとあまりピンと来ていなかったんですが、次に紹介されたMoby Projectとその中のデモで目指すビジョンが伝わってきました。
(この後の僕の説明とGetting Startedで少しでも伝われば、と思いますが…)
Moby Project
Moby is an open project created by Docker to advance the software containerization movement. It provides a “lego set” of dozens of standard components and a framework for assembling them into custom platforms.
ぶっちゃけこのページだけ見てもよくわからないと思うので、デモの説明で使われていた下記のスライドを元に簡単に説明します。
デモではredisのコンテナが使われていたので "RedisOS"と書かれています。
下の紫色の枠がホストOS部分、そして上の青い枠で囲われている部分が "RedisOS" と紹介されている部分です。
mobyを使うことでこの青い枠の部分をパッケージングしてビルドすることが出来ます。
今まではLinuxカーネルなどに依存していたDockerですが、linuxkitによりminimum linux distributionとして上の部分がパッケージとして提供されます。
Linux distributionのoutput formatとして下記のようなものがサポートされています。
- kernel + initrd (for hyperkit)
- iso-bios (for Qemu)
- iso-efi (for Hyper-V)
- vmdk (for vmware)
- iso-bios (for CD image)
- gcp-img (for Google Cloud Platform!)
参考: https://github.com/linuxkit/linuxkit/blob/master/docs/yaml.md#output
mobyはこれらのformatでビルド結果を出力することができます。
気づかれた方も多いと思うのですが、これらのファイル形式はいずれも OS配布に使われるファイル形式 です。
そう、今までDockerコンテナはOSの中で動く1つのプロセスでした。
しかし、mobyを使うことによって OSレベルでのImmutable infrastrcureを実現できる と言えます。
mobyによって受けた衝撃
特に最後の gcp-img
が大きな衝撃でした。
今まではDockerの動作環境を構築したり、ベンダーロックインを受けながらクラウド上にDockerの動作するOSをホスティングしていましたが、mobyを使うことによって OSレベルでのimmutable infrastructure が実現されています。
プロセスレベルのImmutable Infrastructure → OSレベルのImmutable Infrastructureへ
さらに、上記にもあったinfrakitはpluggableで、mobyは内部的にinfrakitを使っているように見えるので、恐らくmobyもpluggableな仕組みになっているはずです(linuxkitのREADMEにも書いてます)。
つまり、pluginが作られているクラウド環境であれば どの環境にも開発環境でビルドされたOSを持ち込み、サーバを起動することが可能 なのではないでしょうか。
もはやサーバにprovisioningなど不要。
mobyを使うことでOSをビルドしてクラウドに持ち込み、古いインスタンスをそのまま捨てて新しいインスタンスを起動するのがデプロイになってしまう可能性まであります。
冪等性とはなんだったんでしょう。
Getting Started
さて、というわけで早速試してみましょう。
といっても何も難しいことはありません。公式のREADME通りにすれば動きます。
※動かすにはgoとdockerが必要です。GOPATHも通しておいてください。
環境構築
docにはbuildする手順が書いてましたが、go getでそのまま使えるみたいだったので手っ取り早くgo getします。
# moby
$ go get -u github.com/docker/moby/src/cmd/moby
# infrakit-instance-hyperkit -> macユーザ(hyperkitを使う人)以外は不要だと思います
$ go get -u github.com/docker/moby/src/cmd/infrakit-instance-hyperkit
これで環境構築は終わりです。
moby help
を実行してhelpが表示されることを確認してください。
build
公式のexampleをbuildしてみましょう。
# 作業用ディレクトリに移動
$ cd tmp
# exampleのymlファイルをダウンロード
$ curl https://raw.githubusercontent.com/linuxkit/linuxkit/master/examples/sshd.yml > sshd.yml
$ moby build sshd.yml
このsshd.ymlのformatは以下のようになっています。
outputs:
- format: kernel+initrd
- format: iso-bios
- format: iso-efi
build自体はすぐ終わります。buildが終わったら成果物を確認しましょう。
これらのファイルができていれば成功です。
run
では起動してみましょう。
$ moby run hyperkit sshd
macなのでbackendにhyperkitを指定しています。
なお、backendを省略した場合以下のような優先順位でbackendが指定されます。
$ moby run --help
...(省略)
If not specified the platform specific default will be used
Supported backends are (default platform in brackets):
gcp
hyperkit [macOS]
qemu [linux]
vmware
packet
moby run sshd
を実行すると、ログが流れて下記のような画面になりました。
sshdが起動しているか、確認してみましょう。
はい、 たった数秒でsshdのコンテナが起動したOSが起動しました 。
今の気持ちはこんな感じなはずです
起動したOSは halt
で終了します。
これでOSごと綺麗サッパリなくなりました。
GCPでの起動
さて、では次にGCP上でインスタンスを起動してみましょう。
準備
これを行うにはGoogle Cloud Platformのアカウントとgoogle-cloud-sdkが必要です。
詳しくは説明しませんが、linuxkitの公式にもドキュメントがあるのでこちらも参考にしつつセットアップしてください。
https://github.com/linuxkit/linuxkit/blob/master/docs/gcp.md
google-cloud-sdkとGCPアカウントの準備が終わったらドキュメントに従って下記のコマンドでloginします。
export CLOUDSDK_CORE_PROJECT=<GCP project>
export CLOUDSDK_COMPUTE_ZONE=europe-west1-d
gcloud auth login
次に、こちらの手順にしたがってサービスアカウントを作成します。
作成時にはこちらのチェックを入れてJSONファイルをダウンロードしましょう。
ファイルをダウンロードしたら、service-accountで認証します。
$ gcloud auth activate-service-account [ACCOUNT] --key-file=KEY_FILE
また、gcpのイメージのインポートにはgoogle cloud storageを使うので権限が必要です。
IAMで権限を割り振ってください。
ウィンドウが開くので、メンバーに先程作ったサービスアカウントを、権限にProjectの編集者を与えます。
さらに、アップロード先のGCSのバケットを作成します。
バケット名はあとで使うので控えておいてください。
ここまでで準備完了です。
ビルド
exampleのgcp.ymlをダウンロードしてビルドします。
$ curl https://raw.githubusercontent.com/linuxkit/linuxkit/d422c70ac6da78da3d32237735d86eb9001df384/examples/gcp.yml > gcp.yml
ダウンロードしたgcp.ymlのbucket名を、さっき作ったバケット名とプロジェクト名に指定します。
あとは普通にbuildします。
$ moby build gcp.yml
buildと同時にtarのuploadとimageの作成が行われます。
コンソールからも確認してみましょう。
一番上が今作成したイメージです。出来てますね。
run
ではrunしてみましょう。
$ moby run gcp -project myproject gcp # myprojectを自分のプロジェクト名にする
さくっとインスタンスが作成されました!
nginxのプロセスも動いてるようです。
コンソールからも確認してみましょう。
ちなみにhaltしてインスタンスが消えるのも確認したかったんですが、打ったらハングアップしてしまいました……まあご愛嬌ということでとりあえず今回はここまでで(´・ω・`)
あ、使ったインスタンスやバケットは料金がかからないように消しておいてくださいね。
まとめ
いかがだったでしょうか。
僕の感じた 新たなImmutable infrastructureの可能性 に少しでも共感してもらえれば幸いです。
まだ発表されてすぐですし、Docker界隈は流れが早いので、この情報もすぐに古くなっていくかもしれませんが、頑張って追いかけていきましょう!