Vagrant & Dockerによるイマドキの開発環境構築Japan System Laboratory GEEKLAB.NAGANO Yuichi Nakazawa
本日の話題
•イマドキの開発環境事情 • Vagrant/Dockerとは •両者の使いわけ •おまけ(構成管理ツールについて)
本日のゴール
Vagrant&Dockerに興味を持って頂くこと
https://goo.gl/Nvc6yw
デモ用URL
開発サーバーでは問題無いのに本番サーバーで動かない
Aさんの環境と自分の環境で挙動が違う
・バージョン違い ・環境の違い 設定ファイル 環境パス ディレクトリ構成等
原因
サーバー移行に伴う度重なるセットアップ
同じサーバー構成を作りたいけど、時間がない。というか、面倒くさい!!
Infracture as code
そんな時に使うのがVagrant であり Dockerです
Vagrant&Dockerを ざっくり言うと
コマンド一発でホストマシンに依存せずに、開発環境やテスト環境を構築できるツール
Vagrant&Dockerを ざっくり言うと2
カスタマイズしたLAMP環境を好きな時にコマンド一発で起動できる
登場した背景
•多様化する開発スタイル •オンプレからクラウド
•公式HP:https://www.vagrantup.com •仮想環境構築ツール 2012年 V1.0 2017年2月 現在:V1.9.1 •MITライセンス(= タダ) •指定したプロバイダ(デフォルトは、VirtualBox(Oracle))に対して 指定したBox(OSイメージ)の環境を何度でも、どのホストOSでも同じ環境 •ホストOS型の仮想環境構築を支援 (Vagrantというより、プロバイダの特性)
Vagrant
$ vagrant up
起動はコマンド一発
ホストOS型
ハードウェア
ホストOS
仮想化ソフト(VirtualBox等)
ゲストOS
仮想環境ゲストOS
•ホストPC(OS)上に仮想化ソフトをインストールし、そのソフト上でゲストOSを動作させる •比較的導入が容易 •H/WへのアクセスはホストOSを経由 = オーバーヘッドになりやすい(後述するコンテナ型と比較した場合)
ホストOS型の特徴
•ホストOS型の仮想環境をいくつも簡単に起動できる
•何度でも壊せる = 色々試せる
•複数の開発者間で同様の環境を共有できる
Vagrantの特徴
•VirtualBox •VMWare(Fusion) •Hyper-V •Docker •Amazon EC2
プロバイダはアドオンで変更可能
1. $ vagrant box add [box名] BOXの登録 2. $ vagrant init 環境立ち上げたい場所で 3. $ vagrant up 環境立ち上げ
Vagrant環境構築手順
Vagrant その他のコマンド例
$ vagrant halt ・・ 停止 $ vagrant reload ・・ 再起動 $ vagrant ssh ・・ SSH接続
Vagrant その他のコマンド例
$ vagrant destroy ・・ VMイメージを消す $ vagrant box remove [box名] ・・ BOXを消す
・ruby形式のフォーマット ・以下のような設定ができます。 ネットワーク設定 共有フォルダの設定、 プロビジョニングの設定 etc・・
Vagrantfile
Vagrantfileイメージ# -*- mode: ruby -*- # vi: set ft=ruby :
Vagrant.configure(2) do |config|
config.vm.box = "centos67"
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.synced_folder "../data", "/vagrant_data" end
Vagrant メリット
• VagrantFileを共有することにより エンジニア間で環境を共有できる。
•とはいえ、個々でカスタマイズは可。(Vim派/Emacs派、bash/zsh、各種環境設定等) → VMツールで立ち上げることは変わらないので
Vagrant デメリット
• VMイメージが貯まる→ ストレージを圧迫する(使い捨てることで解決可)
• 起動が遅い(個人的感想)→ VMで立ち上げることは変わらないので
•公式HP:https://www.docker.com •Apache License2.0(= タダ) •コンテナ型の仮想環境構築(Javaのコンテナとは別もの) •初期は、Linux上での構築しか出来なかった。
Docker
$ docker run
起動はコマンド一発
コンテナ型(Docker)
ハードウェア
ホストOS(Linux)
Dockerエンジン
ゲストOS
コンテナゲストOS
コンテナ
•ホストOSの1プロセスとして起動する → オーバーヘッドが少ない
•OS(カーネル)をホストOSと共有するため、VMごとにOSインストールをする必要はない→ 起動/動作が早い
コンテナ型の特徴
•Dockerサーバー・・コンテナ実行 •Dockerクライント ・・Dockerコマンド
Dockerエンジンの構成
•開発向け •運用向け ①効率的なデプロイ ②マイクロサービス
Dockerの用途
•軽量 •携帯性 •揮発性(基本的にはLinuxカーネルに構築)
Dockerの特徴
•カーネル共有によりコンテナサイズを 抑えられる •デバイスI/Oのエミュレートが不要のため高速化が可能→オーバーヘッドが少ない •提供されるDockerイメージも必要最低限 •原則的に1コンテナ1プロセス
Dockerの特徴 - 軽量
•Dockerイメージをそのまま他のホストOSへ •Dockerfile元に他のホストOSで新規に立ち上げ
Dockerの特徴 - 携帯性
•コミットしない限り、作業内容は保持されない・・
Dockerの特徴 - 揮発性
Docker導入方法
•Docker(各OSの仮想環境) •Kitematic(GUI。VirtualBox) •Docker Tools(Linux以外に構築する場合)
•読み方:カイトマティック
•VirtualBox上に自動でCore Linuxをインストールしその環境でコンテナを起動する(VirtualBoxが無くてこちらも勝手にやってくれる)。 •GUI上ではコミットはできない・・。コンテナ生成は可
•コンテナイメージは、「Docker Hub」から取得
Kitematic
Kitematic
VirtualBox
•Window(64bit) / OS X向けの インストーラー •VirtualBox上に構築(含まれる) •Kitematic も含まれる
Docker Toolbox
•基本は、Docker ToolBox •Hyper-V上に構築 (VirtualBoxとの共存できない) •Win10 64bitでないとダメ
Docker For Windows
•基本は、Docker ToolBox •HyperKit上に構築(OSX 10.10+) •インストール位置がToolBox と異なるhttps://docs.docker.com/docker-for-mac/docker-toolbox/
Docker For Mac
• 起動が早い • 軽量 • オーバーヘッドが少ない
Docker メリット
• コミットを忘れるとツライ→作業したものがご破産に
• 全部入りのイメージが少ないので、開発環境を揃えるまでに、Vagrant比べ時間が掛かる(個人的主観)
Docker デメリット
Vagrant / Docker使い分け
• 開発環境 ・・ Vagrant
• 動作検証 (新OSやサービスの検証) ・・ Docker / Vagrant
• 本番運用(Dockerイメージをデプロイ) ・・Docker
まとめ• Vagrant / Docker似てるようで、まるで違う。(簡易的なコマンドで制御できるのは一緒)
• Vagrant / Dockerそれぞれ一長一短なので用途によって使いわけましょう。
• 類似ツールが多いので、選定をちゃんとしないと環境が余計混乱してしまう可能性も。
• 確実に生産性と保守性はあがります。
Infracture as code
•環境構成を決まったシナリオに従ってインストールや環境構築をしてくれる
•冪等性がある(何度流しても同じ結果になる)。
ざっくりいうと
$ yum install nginx $ chkconfig nginx on $ sudo nginx start
ざっくりいうと、これが
これになります。 exp.) Ansible のplaybook
- name: install nginx yum: name=nginx state=present - name: set auto start nginx command: chkconfig nginx on - name: restart nginx command: service nginx restart
•Ansible •chef •puppet
メジャーなもの
•エージェントレス •サーバーはPython2.6+クライアントは、Python2.5 •設定ファイルがシンプル(主なファイルは2つ程度)
Ansible
•同じ環境を何度も立てたい場合に使えます。(開発、ステージング、本番)
•設定ファイルに変数を指定できる。 •Vagrant/Dockerにも設定ファイルはありますが、ツールに依存してしまう。
まとめ
さいごに
•インフラエンジニアでなくても手軽にインフラ構築ができます。 → インフラエンジニア不要説→ 明日は我が身かも・・・
•自動構成や構成管理ツールで楽出来る?? → 基本が大事(銀の弾丸ではない)