infrastructure.nagoya ~dockerで、何をする?~

25
Infrastructure.nagoya 2015/01/17 Vol.2 Dockerで、何をする?

Upload: hamajitakahisa

Post on 20-Jul-2015

295 views

Category:

Technology


0 download

TRANSCRIPT

Infrastructure.nagoya

2015/01/17 Vol.2

Dockerで、何をする?

自己紹介

● はまじ (@HmjKRS)○ 来栖川電算 社内ニート

○ 元インフラ担当 → 認識系エンジニア見習い

○ Chef, Vagrant, docker を広めようとした人

○ 変なことが好き

自己紹介

● はまじ (@HmjKRS)○ 来栖川電算 社内ニート

○ 元インフラ担当 → 認識系エンジニア見習い

○ Chef, Vagrant, docker を広めようとした人

○ 変なことが好き

最近、さらに引きこもりました。

自己紹介

● はまじ (@HmjKRS)○ 来栖川電算 社内ニート

○ 元インフラ担当 → 認識系エンジニア見習い

○ Chef, Vagrant, docker を広めようとした人

○ 変なことが好き

先日、社内勉強会を行いました。開発メンバーみんなの環境に docker を入れさせることに成功。docker 広まってます!

今日の目的

実運用で使えそうな docker 周辺ツールを紹介したい

今日やること

● Packer で docker イメージをつくろう

● docker registry を立てよう

● ngrok を使ってみよう

Packer で docker のイメージをつくろう

Dockerfile 書きたくない

● いままでの資産を再利用できない

Dockerfile は独自の DSL で記述する必要があり、

これまで使用していた Chef の Cookbook を再利用できない。

● レイヤー数に制限がある

Docker の AUFS レイヤーは最大 127 個まで。

Dockerfile だけで複雑なイメージを作成するには限界がある。

Packer って何?

● Packer とは

イメージの作成を行うツール。

統一された手順で、対応するプラットフォーム用のイメージを、

対応するプロビジョニングツールで作成できる。

$ packer build hoge.json

● 対応プラットフォーム

Amazon EC2 (AMI)、DigitalOcean、Docker、Google Compute Engine、OpenStack、Parallels、KVM、Xen、VirtualBox、VMware

● 対応プロビジョニングツール

ShellScript、Chef、Puppet、Ansible、Salt

Packer を使いたい理由

● これまでの資産を再利用できる

せっかく Cookbook があるのに、同じことをする Dockerfile をイチから書き直すのはもったいない。

Packer なら既存の Cookbook をそのまま再利用できる。

● docker 以外のプラットフォームにも簡単に移行できる

Dockerfile は docker 専用。

Vagrant などに移行するときは Cookbook に書き直さないといけないし、

イメージの作成手順も異なる。

Packer なら Cookbook は使いまわせるし、イメージの作成手順も統一されている。

Packer をインストールしよう

● CentOS 6 系$ curl -LO https://dl.bintray.com/mitchellh/packer/packer_0.7.5_linux_amd64.zip$ sudo unzip -d /usr/local/packer packer_0.7.5_linux_amd64.zip$ echo 'export PATH=/usr/local/packer:$PATH' | sudo tee /etc/profile.d/packer.sh

● 確認$ packerusage: packer [--version] [--help] <command> [<args>]

Available commands are: build build image(s) from template fix fixes templates from old versions of packer inspect see components of a template push push template files to a Packer build service validate check that a template is valid version Prints the Packer version

Packer で build するには?

● build コマンド

$ packer buildUsage: packer build [options] TEMPLATE

● TEMPLATE(json ファイル)の書き方

○ buildersどのような種類のイメージを作るか。

例えば、「iso ファイルを指定して VirtualBox のイメージを作る」など。

○ provisionersプロビジョニングについて。

ShellScript、Chef、Puppet、Ansible、Salt などを使用できる。

○ post-processors作成されたイメージに対する後処理。

例えば、「作成された VirtualBox の Box の名前を変更する」など。

docker + Chef の TEMPLATE● 実際の TEMPLATE ファイルの内容

$ cd ~/sample$ cat packer.json{ "builders":[{ "type": "docker", "image": "centos:centos6", "export_path": "image.tar" }], "provisioners":[ { "type": "shell", "inline": ["yum -y install sudo"] }, { "type": "chef-solo", "cookbook_paths": ["cookbooks"], "run_list": ["apache::default"] } ],

"post-processors": [{ "type": "docker-import", "repository": "hamaji/sample", "tag": "0.1" }]}

build してみよう

● TEMPLATE ファイルを指定して build コマンドを実行

$ packer build packer.jsondocker output will be in this color.

==> docker: Creating a temporary directory for sharing data...==> docker: Pulling Docker image: centos:centos6

docker: Pulling repository centos

Build 'docker' finished.

==> Builds finished. The artifacts of successful builds are:--> docker: Imported Docker image: hamaji/sample:0.1

● 確認$ docker images hamaji/testREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEhamaji/sample 0.1 55648676db6c 3 minutes ago 393 MB

docker のバージョンに注意

● docker のバージョンによっては build に失敗するdocker 1.2.0 => docker 側のバグで失敗

docker 1.4.1 => packer 側が未対応

docker 1.3.3 => 動いた

※ packer のログレベルを指定するには環境変数 PACKER_LOG をセットする。

$ PACKER_LOG=debug packer build packer-test.json

● 古いバージョンの docker を入れるには

docker 1.3.3 のバイナリをダウンロードして入れ替えればOK。$ sudo su# service docker stop# curl -L https://get.docker.com/builds/Linux/x86_64/docker-1.3.3 -o /usr/bin/docker# chmod +x /usr/bin/docker# service docker start

Packer でできないこと

● ビルド途中のイメージキャッシュdocker はイメージのビルド中に、コマンドごとにキャッシュを残すので、ビルドを中断したときでも、途中から再開できる。Packer にはまだこの機能がないので、ビルドを中断すると毎回はじめからビルドすることになる。

● EXPOSE や ENTRYPOINT の指定Dockerfile では EXPOSE や ENTRYPOINT などのメタデータを埋め込むことができるが、Packer にはこの機能がない。これらのメタデータは docker run のときに指定できるので大きな問題ではない。

docker registry を立てよう

docker registry を立てよう

● なぜ registry を立てたいか

DockerHub では全世界にイメージが公開されてしまう。

社内だけでイメージを共有したいときには使えない。

● docker registry の起動

公式イメージがあるので、run するだけで OK。$ docker run -d --name registry -p 5000:5000 -v $(pwd):/tmp/registry registry

push してみよう

● イメージを push$ docker tag centos:centos6 localhost:5000/centos:centos6$ docker push localhost:5000/centos:centos6

● push されているイメージを見るには

registry 単体では UI が無いので、REST API 経由で確認する。

$ curl -X GET http://localhost:5000/v1/search | jq '.'{ "num_results": 1, "query": "", "results": [ { "description": "", "name": "library/centos" } ]}

web インタフェースを使ってみよう

● web インタフェースの起動$ docker run -d --name registry-frontend \ --link registry:registry \ -e ENV_DOCKER_REGISTRY_HOST=registry \ -e ENV_DOCKER_REGISTRY_PORT=5000 \ -p 8080:80 \ konradkleine/docker-registry-frontend

● ブラウザで確認

ブラウザで http://localhost/ にアクセス

ngrok を使ってみよう

docker とは関係ないです

ngrok でできること

● ローカルマシンの任意のポートを

ngrok.com を経由して全世界に公開できる

コマンドひとつで公開できて、煩わしい設定は一切無し。

ngrok のインストール

● CentOS 6 系$ curl -LO https://dl.ngrok.com/linux_386/ngrok.zip$ sudo unzip ngrok.zip -d /usr/bin

● 確認$ ngrok -helpUsage: ngrok [OPTIONS] <local port or address>

ローカルのポートを公開してみよう

● 8080 ポートを全世界に公開

$ ngrok 8080ngrok (Ctrl+C to quit)

Tunnel Status onlineVersion 1.6/1.7Forwarding http://1c93e4cf.ngrok.com -> 127.0.0.1:8080Forwarding https://1c93e4cf.ngrok.com -> 127.0.0.1:8080Web Interface 127.0.0.1:4040

● 生成された URL にアクセスして確認ブラウザで http://1c93e4cf.ngrok.com にアクセス。

おわり