Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Docker実践入門

6,500 views

Published on

HachikinでDockerを使った時のまとめです。

Published in: Engineering
  • Be the first to comment

Docker実践入門

  1. 1. Docker実践入門 Hachikinで使ってみました
  2. 2. 目次 ● Dockerとは ● MacでDocker ● イメージを作成してみる ● Dockerfile ● 実際の運用 ● まとめ
  3. 3. 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
  4. 4. Docker Engineとは LXC(Linux Containers), AUFS AUFSとは http://itpro.nikkeibp.co.jp/article/Keyword/20090209/324482/
  5. 5. Docker Hubとは ● Githubみたいなもの ● イメージを公開してバージョン管理
  6. 6. イメージとコンテナ ● イメージ(image) ○ セットアップしたインフラ(nginx, mysql, rubyとか)のス ナップショット ● コンテナ(container) ○ イメージを起動した状態。 ● イメージとコンテナの関係はクラスとインスタン スのような感じ
  7. 7. イメージ(image)のいめーじ 参照) http://docs.docker.com/terms/layer/
  8. 8. コンテナ(container)のいめーじ コンテナ1 Linux カーネル コンテナ2 nginx mysqlDocker Engine Server
  9. 9. いめーじ nginx java ruby hachikin Hachikinのイメージ hachikin:v2.0.1 run 57a07a3528f1 82a07x352443 run a3765da72ba1 run 同じイメージから複数のコンテナを起 動した時のいめーじ
  10. 10. Dockerを使うと ● 作成したイメージはどこでも使える ○ EC2, さくらのVPS ○ Google Compute Engine, Google App Engine, AWS, Openshift, Microsoft Azure ○ あっちのクラウドからこっちのクラウドへ今までよりも簡単に移行で きるかも ● Continuous Integration, Continuous Deliveryが今までよりも簡単にで きるかも ● Blue-Green Deploymentが今までよりも簡単にできるかも
  11. 11. Chefと比べた時のDockerの利点と欠点 ● Immutable ● 起動が早い(プロセスを起動するくらい) ● 少ないリソースで動作する ● 構成ファイルがほとんどシェルスクリプト ● ディスク容量が結構豊富にないときつい ● buildが早い(場合がある)
  12. 12. 参考 第41回 Linuxコンテナ(LXC)の基礎をまとめ直す http://www.school.ctc-g.co.jp/columns/nakai/nakai41.html
  13. 13. MacでDocker
  14. 14. MacでDockerを使うには ● VirtualBoxをインストール ● boot2dockerをインストール
  15. 15. いめーじ コンテナ1 VirtualBox (Linux) コンテナ2 Docker Engine Mac dockerコマンドで操作する(Linuxでやる場合と 変わらない) VirtualBoxはあまり意識しない操作できる $ docker ps -a $ docker run -i -t ubuntu /bin/bash
  16. 16. インストール https://docs.docker.com/installation/mac/ Boot2Docker-1.0.0.pkg 以下のアプリケーションがインストールされます ● VirtualBox ● Boot2Docker ● VirtualBoxいらないって人は以下からboot2dockerを入れれば いいんじゃないかと https://github.com/boot2docker/boot2docker
  17. 17. 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
  18. 18. 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
  19. 19. 何がおきたのか $ docker images $ docker images --tree $ docker ps -a
  20. 20. イメージを作成してみる
  21. 21. コンテナに接続してみる $ 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
  22. 22. vimをインストールしてみる root@f5cdc86f7c05:/# apt-get install vim -y 適当にファイルを開いてみる root@f5cdc86f7c05:/# vim /etc/resolv.conf exitで抜ける root@f5cdc86f7c05:/# exit
  23. 23. コンテナを起動しなおす もう一度同じコマンドで起動してみる $ docker run -i -t ubuntu /bin/bash vimコマンドはあるか?
  24. 24. コミットしてイメージを作成 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コマンドは?
  25. 25. Dockerfile
  26. 26. Dockerfileとは ● 今見てきたイメージ作成までの流れをまとめた ファイル ● Dockerfileをもとにビルドすることで、いつでもイ メージを作成することができる
  27. 27. 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
  28. 28. 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"]
  29. 29. イメージをビルドして実行 $ 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 で取得できるもの
  30. 30. ビルドのイメージ 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
  31. 31. 制限 autfsの制限から127レイヤまでしか作れない Tips RUNで実行するコマンドをまとめる 例) RUN apt-get update && apt-get install mysql nginx imagemagick vim
  32. 32. イメージにファイルを追加する カレントディレクトリにあるGemfileをイメージの/hachikin/Gemfileに追加する ADD Gemfile /hachikin/Gemfile カレントとは $ docker build -t hachikin . ←これ $ docker build -t hachikin - < /path/to/Dockerfile という感じでDockerfileを指定することもできるが、この場合、ADDが思ったように動 作しない(0.9のとき、今はどうか分からない)
  33. 33. イメージにファイルを追加する ディレクトリを指定することも可能 ADD . /hachikin これは、Hachikinのプロジェクトディレクトリをまる ごと転送する例。
  34. 34. Dockerfileまとめ FROM ・・・ ベースとなるイメージを指定       (docker hubなどからいいものを探すなど) RUN ・・・ build時に実行するコマンド ADD ・・・ イメージにファイルを追加する EXPOSE ・・・ ポート外部に開放する CMD ・・・ docker run時に実行するコマンド
  35. 35. docker run 基本的にはdocker runで実行するのは1つのコマンドだけ でも普通は、cron動かしたりssh動かしたりアプリ動かしたりと 複数のプロセスを一つのコンテナで動かす Supervisor使ったり、 phusion/baseimageとか、プロセスを複数起動する仕組みがあ るBaseimageを使ったりする。
  36. 36. バックグラウンドで実行 バックグラウンドで実行 $ docker run -d -p 8080:80 ubuntu:nginx $ docker ps -a
  37. 37. 実行時に環境変数を設定 $ docker run -i -t -e HOGE=”fuga” ubuntu /bin/bash root@c78cea1ee955:/# echo $HOGE ”fuga”
  38. 38. 永続化したい場合 ログファイルを永続化したい データを永続化したい → ホストマシンのファイルシステムをマウント $ docker run -d -v /data/logs:/var/log/nginx ubuntu:nginx その他 外部のストレージに転送する RDS、Fluentd、S3とか
  39. 39. イメージを作るコツ ● 環境に依って変わる値は実行時(docker run)に渡す ● アプリケーションもそれを前提で設計する ● データを永続化する必要がある場合は、Dockerを使うべき かどうかよく考える ● 永続化する場合は最小限にとどめる
  40. 40. コンテナ・イメージの削除 $ docker rm コンテナID $ docker rm $(docker ps -a -q) $ docker rmi イメージID $ docker rmi $(docker images | awk '/^<none>/ {print $3}')
  41. 41. その他 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
  42. 42. その他 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
  43. 43. その他 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
  44. 44. 実際の運用
  45. 45. 運用で考慮すること ● イメージの管理 ● デプロイ ● 監視 ● セキュリティ
  46. 46. イメージの管理 ● Docker Hubが出来たのでそっちで管理 ○ 有料の場合はプライベートリポジトリが使える ● Docker registryを使う ○ 今回はこっちを説明
  47. 47. Docker Registry イメージを管理するサーバ Docker indexとかregistryとかと呼ばれる Registry自身もDockerのイメージで提供 REST APIもある S3と連携して使うこともできる
  48. 48. HachikinでのDocker Registryを使ったデプロイメント AWS Registry S3 AP1 AP2 ステージング環境 Registry AP 1. build 2. run(検証) 3. タグ付け 4. push1. pull 2. run
  49. 49. 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のキャッシュを使うことで、イメージの情 報取得が速くなる(イメージがキャッシュされる わけではなさそう)
  50. 50. 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
  51. 51. 監視 Nagiosのように監視サーバから能動的にチェック するツールだと監視しにくい server container A container B Nagios:5666 :5666 :15666 :25666 :15666と :25666をそれぞれ監視? 面倒くさい。サーバが増えたら大変そう。
  52. 52. sensu 状態をクライアントがPush server container A container B Rabbit MQ Sensu - Server - API CheckWARN OK
  53. 53. サーバのリソースモニタリング munin ホストOSの直接クライアントをインストール server container A container B munin server munin server container munin
  54. 54. まとめ
  55. 55. まとめ 制約を理解して使えば強力

×