infrastructure.nagoya ~dockerで、何をする?~
TRANSCRIPT
自己紹介
● はまじ (@HmjKRS)○ 来栖川電算 社内ニート
○ 元インフラ担当 → 認識系エンジニア見習い
○ Chef, Vagrant, docker を広めようとした人
○ 変なことが好き
自己紹介
● はまじ (@HmjKRS)○ 来栖川電算 社内ニート
○ 元インフラ担当 → 認識系エンジニア見習い
○ Chef, Vagrant, docker を広めようとした人
○ 変なことが好き
最近、さらに引きこもりました。
自己紹介
● はまじ (@HmjKRS)○ 来栖川電算 社内ニート
○ 元インフラ担当 → 認識系エンジニア見習い
○ Chef, Vagrant, docker を広めようとした人
○ 変なことが好き
先日、社内勉強会を行いました。開発メンバーみんなの環境に docker を入れさせることに成功。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 を立てよう
● なぜ 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 のインストール
● 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 にアクセス。