狠狠撸

狠狠撸Share a Scribd company logo
顿辞肠办别谤実践入门
Hachikinで使ってみました
目次
● Dockerとは
● 惭补肠で顿辞肠办别谤
● イメージを作成してみる
● Dockerfile
● 実际の运用
● まとめ
Docker
Docker Engine
Docker Hub
Docker Remote API
Docker社は、コンテナ型仮想化を実現する Dockerと、アプリケーションの開発や配布を統合する Docker
Hub、API、サードパーティによるエコシステムを指して、「 Dockerはプラットフォームであり、 Docker Hubは
その一部である」としています。
引用) http://www.publickey1.jp/blog/14/docker_hubdockerdocker.html
Docker Engineとは
LXC(Linux Containers), AUFS
AUFSとは
http://itpro.nikkeibp.co.jp/article/Keyword/20090209/324482/
Docker Hubとは
● Githubみたいなもの
● イメージを公开してバージョン管理
イメージとコンテナ
● イメージ(image)
○ セットアップしたインフラ(nginx, mysql, rubyとか)のス
ナップショット
● コンテナ(container)
○ イメージを起動した状態。
● イメージとコンテナの関係はクラスとインスタン
スのような感じ
イメージ(image)のいめーじ
参照) http://docs.docker.com/terms/layer/
コンテナ(container)のいめーじ
コンテナ1
Linux カーネル
コンテナ2
nginx mysqlDocker Engine
Server
いめーじ
nginx
java
ruby
hachikin
Hachikinのイメージ
hachikin:v2.0.1 run
57a07a3528f1
82a07x352443
run
a3765da72ba1
run
同じイメージから複数のコンテナを起
動した時のいめーじ
Dockerを使うと
● 作成したイメージはどこでも使える
○ EC2, さくらのVPS
○ Google Compute Engine, Google App Engine, AWS, Openshift,
Microsoft Azure
○ あっちのクラウドからこっちのクラウドへ今までよりも簡単に移行で
きるかも
● Continuous Integration, Continuous Deliveryが今までよりも簡単にで
きるかも
● Blue-Green Deploymentが今までよりも簡単にできるかも
Chefと比べた時のDockerの利点と欠点
● Immutable
● 起動が早い(プロセスを起動するくらい)
● 少ないリソースで動作する
● 構成ファイルがほとんどシェルスクリプト
● ディスク容量が結構豊富にないときつい
● buildが早い(場合がある)
参考
第41回 Linuxコンテナ(LXC)の基礎をまとめ直す
http://www.school.ctc-g.co.jp/columns/nakai/nakai41.html
惭补肠で顿辞肠办别谤
惭补肠で顿辞肠办别谤を使うには
● VirtualBoxをインストール
● boot2dockerをインストール
いめーじ
コンテナ1
VirtualBox (Linux)
コンテナ2
Docker Engine
Mac
dockerコマンドで操作する(Linuxでやる場合と
変わらない)
VirtualBoxはあまり意識しない操作できる
$ docker ps -a
$ docker run -i -t ubuntu /bin/bash
インストール
https://docs.docker.com/installation/mac/
Boot2Docker-1.0.0.pkg
以下のアプリケーションがインストールされます
● VirtualBox
● Boot2Docker
●
VirtualBoxいらないって人は以下からboot2dockerを入れれば
いいんじゃないかと
https://github.com/boot2docker/boot2docker
Dockerのセットアップ
Applicationフォルダのboot2docker.app実行でセットアップしてくれるっぽいが、今回は
手動でセットアップ
$ boot2docker init
$ boot2docker up
$ export DOCKER_HOST=tcp://192.168.59.103:2375
or
$ export DOCKER_HOST=tcp://$(boot2docker ip 2>/dev/null):2375
セットアップができているか以下のコマンドで確認
$ docker info
Hello World
$ docker run ubuntu echo hello world
Unable to find image 'ubuntu' locally
Pulling repository ubuntu
ad892dd21d60: Download complete
511136ea3c5a: Download complete
e465fff03bce: Download complete
23f361102fae: Download complete
9db365ecbcbb: Download complete
hello world
何がおきたのか
$ docker images
$ docker images --tree
$ docker ps -a
イメージを作成してみる
コンテナに接続してみる
$ docker run -i -t ubuntu /bin/bash
-i 標準入力を受け付け
-t 端末を仮想環境に割当てる
ubuntu Ubuntuのベースイメージを使って
/bin/bash bashを実行する
root@f5cdc86f7c05:/# ls
bin boot dev etc home lib lib64 media mnt opt
proc root run sbin srv sys tmp usr var
vimをインストールしてみる
root@f5cdc86f7c05:/# apt-get install vim -y
適当にファイルを開いてみる
root@f5cdc86f7c05:/# vim /etc/resolv.conf
exitで抜ける
root@f5cdc86f7c05:/# exit
コンテナを起動しなおす
もう一度同じコマンドで起動してみる
$ docker run -i -t ubuntu /bin/bash
vimコマンドはあるか?
コミットしてイメージを作成
vimをインストールした時のコンテナのIDをしてしてイメージを作成
$ docker commit f5cdc86f7c05 ubuntu:installed_vim
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu installed_vim c0daa0d380da 43 seconds ago 318.6 MB
ubuntu latest ad892dd21d60 6 days ago 275.5 MB
作成したイメージから起動してみる
$ docker run -i -t ubuntu:installed_vim /bin/bash
vimコマンドは?
Dockerfile
Dockerfileとは
● 今見てきたイメージ作成までの流れをまとめた
ファイル
● Dockerfileをもとにビルドすることで、いつでもイ
メージを作成することができる
vimがインストールされたイメージを作るためのDockerfileとビ
ルド
$ mkdir test
$ cd test/
$ vim Dockerfile
FROM ubuntu
RUN apt-get install vim -y
ビルド
$ docker build -t ubuntu:installed_vim2 .
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu installed_vim2 7ffcb526a1e6 8 seconds ago 319 MB
ubuntu installed_vim c0daa0d380da 8 minutes ago 318.6 MB
ubuntu latest ad892dd21d60 6 days ago 275.5 MB
nginxがインストールされたイメージを作成
$ mkdir nginx && cd nginx
$ vim Dockerfile
FROM ubuntu:installed_vim2
RUN apt-get update && apt-get install nginx -y
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx"]
イメージをビルドして実行
$ docker build -t ubuntu:nginx .
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu nginx 95d4bbf20ea4 8 minutes ago 339.9 MB
ubuntu installed_vim2 7ffcb526a1e6 20 minutes ago 319 MB
ubuntu installed_vim c0daa0d380da 28 minutes ago 318.6 MB
ubuntu latest ad892dd21d60 6 days ago 275.5 MB
$ docker run -p 8080:80 ubuntu:nginx
下記URLにアクセス
http://192.168.59.103:8080/
IPは $ boot2docker ip で取得できるもの
ビルドのイメージ
ubuntu:installed_vim2
apt-get update & install nginx
Change nginx.conf
ubuntu
EXPOSE 80
CMD [“nginx”]
c7a05e03581b
2b5719aac28e
10abfe510d55
b7003aac8fc9
f526769d1d3e
a64d0129c675 nginx
installed_vim
2
IMAGE ID TAG
制限
autfsの制限から127レイヤまでしか作れない
Tips
RUNで実行するコマンドをまとめる
例)
RUN apt-get update && apt-get install mysql
nginx imagemagick vim
イメージにファイルを追加する
カレントディレクトリにあるGemfileをイメージの/hachikin/Gemfileに追加する
ADD Gemfile /hachikin/Gemfile
カレントとは
$ docker build -t hachikin . ←これ
$ docker build -t hachikin - < /path/to/Dockerfile
という感じでDockerfileを指定することもできるが、この場合、ADDが思ったように動
作しない(0.9のとき、今はどうか分からない)
イメージにファイルを追加する
ディレクトリを指定することも可能
ADD . /hachikin
これは、Hachikinのプロジェクトディレクトリをまる
ごと転送する例。
Dockerfileまとめ
FROM ??? ベースとなるイメージを指定
      (docker hubなどからいいものを探すなど)
RUN ??? build時に実行するコマンド
ADD ??? イメージにファイルを追加する
EXPOSE ??? ポート外部に開放する
CMD ??? docker run時に実行するコマンド
docker run
基本的にはdocker runで実行するのは1つのコマンドだけ
でも普通は、cron動かしたりssh動かしたりアプリ動かしたりと
複数のプロセスを一つのコンテナで動かす
Supervisor使ったり、
phusion/baseimageとか、プロセスを複数起動する仕組みがあ
るBaseimageを使ったりする。
バックグラウンドで実行
バックグラウンドで実行
$ docker run -d -p 8080:80 ubuntu:nginx
$ docker ps -a
実行時に環境変数を設定
$ docker run -i -t -e HOGE=”fuga” ubuntu /bin/bash
root@c78cea1ee955:/# echo $HOGE
”fuga”
永続化したい場合
ログファイルを永続化したい
データを永続化したい
→ ホストマシンのファイルシステムをマウント
$ docker run -d -v /data/logs:/var/log/nginx ubuntu:nginx
その他
外部のストレージに転送する
RDS、Fluentd、S3とか
イメージを作るコツ
● 環境に依って変わる値は実行時(docker run)に渡す
● アプリケーションもそれを前提で設計する
● データを永続化する必要がある場合は、Dockerを使うべき
かどうかよく考える
● 永続化する場合は最小限にとどめる
コンテナ?イメージの削除
$ docker rm コンテナID
$ docker rm $(docker ps -a -q)
$ docker rmi イメージID
$ docker rmi $(docker images | awk '/^<none>/ {print $3}')
その他 Tips
$ docker build --no-cache --rm -t hachikin/app:v2.0.1 .
--rm ビルド時に作成される中間コンテナを削除
-t イメージにタグを付ける
--no-cache イメージのキャッシュを使わずにビルドする
$ docker run -d --name hachikin_app hachkin/app:v2.0.1
--name コンテナに名前を付ける
名前を付けると、start, stop, restart, inspectコマンド実行時にコンテナ
IDの代わりにこの名前を指定できる
$ docker inspect hachikin_app
その他 Tips
ビルド時にできる一時ファイルなどはなるべく消す
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/*
/var/tmp/*
FROMに指定するイメージはタグを指定する
FROM ubuntu:12.04
とか
FROM phusion/baseimage:0.9.8
その他 Tips
RUN, ADDの実行結果はキャッシュされる
→ ビルド時にキャッシュが使えるならそれを使う
→ ビルドに掛かる時間が節約できる
例) Gemfileに変更がなければ、bundle installをスキップ
ADD Gemfile /hachikin/Gemfile
ADD Gemfile.lock /hachikin/Gemfile.lock
RUN bundle install --path /hachikin_bundle --without development test
ADD . /hachikin
実际の运用
運用で考慮すること
● イメージの管理
● デプロイ
● 監視
● セキュリティ
イメージの管理
● Docker Hubが出来たのでそっちで管理
○ 有料の場合はプライベートリポジトリが使える
● Docker registryを使う
○ 今回はこっちを説明
Docker Registry
イメージを管理するサーバ
Docker indexとかregistryとかと呼ばれる
Registry自身もDockerのイメージで提供
REST APIもある
S3と連携して使うこともできる
HachikinでのDocker Registryを使ったデプロイメント
AWS
Registry
S3
AP1 AP2
ステージング環境
Registry
AP
1. build
2. run(検証)
3. タグ付け
4. push1. pull
2. run
Registryの設定
common:
loglevel: info
boto_bucket: _env:AWS_BUCKET
secret_key: _env:SECRET_KEY
s3_access_key: _env:AWS_KEY
s3_secret_key: _env:AWS_SECRET
s3_bucket: _env:AWS_BUCKET
s3_encrypt: true
s3_secure: true
s3_encrypt: true
s3_secure: true
prod:
loglevel: warn
storage: s3
storage_path: "_env:STORAGE_PATH:/prod"
cache:
host: _env:CACHE_REDIS_HOST
port: _env:CACHE_REDIS_PORT
cache_lru:
host: _env:CACHE_LRU_REDIS_HOST
port: _env:CACHE_LRU_REDIS_PORT
環境変数で実行時に置き換えられる
redisのキャッシュを使うことで、イメージの情
報取得が速くなる(イメージがキャッシュされる
わけではなさそう)
Registryの起動
$ docker run -d --name registry -p 5000:5000 
-v /var/registry/registry-conf:/registry-conf 
-e SETTINGS_FLAVOR=prod 
-e AWS_BUCKET=example-docker-bucket 
-e AWS_KEY=XXXXXXX -e AWS_SECRET=XXXXXXXX 
-e STORAGE_PATH=/images -e SECRET_KEY=xxxxxxxxx 
-e CACHE_REDIS_HOST=172.xxx.xxx.12 -e CACHE_REDIS_PORT=6379 
-e CACHE_LRU_REDIS_HOST=172.xxx.xxx.12 -e CACHE_LRU_REDIS_PORT=6379 
-e DOCKER_REGISTRY_CONFIG=/registry-conf/config.yml 
registry:0.6.7
監視
Nagiosのように監視サーバから能動的にチェック
するツールだと監視しにくい
server
container A container B
Nagios:5666 :5666
:15666 :25666
:15666と :25666をそれぞれ監視?
面倒くさい。サーバが増えたら大変そう。
sensu
状態をクライアントがPush
server
container A container B
Rabbit MQ
Sensu
- Server
- API
CheckWARN
OK
サーバのリソースモニタリング
munin
ホストOSの直接クライアントをインストール
server
container A container B munin
server
munin server container munin
まとめ
まとめ
制約を理解して使えば強力

More Related Content

顿辞肠办别谤実践入门