WEBアプリ開発に関する技術を綴るブログ

php,js,apache,mysql,laravel,fuelphpあたりの技術

dockerと既存仮想化技術の違い

ハイパーバイザー その上で仮想マシンが動作するソフトウェアで ・ベアメタル型(ハイパーバイザー型):ハードウェア上でハイパーバイザが動作。ハイパーバイザーが直接ハードウェアを制御するため、 高速動作可能 ・ホスト型:ハイパーバイザーが直接ハードウェアの制御を行うベアメタルに比べ動作遅い。 VirtualBoxVMWareあたりはHost型の仮想マシン

の上記2種類

物理マシン,仮想マシン,コンテナのイメージ 物理マシン:一軒家 仮想マシン:賃貸マンション(独立性重視) コンテナ:シェアハウス(軽量性重視)

Docker Docker社(旧dotCloud社)がPaas事業で使っていた技術をOSS化したもの

軽量コンテナ環境Dockerとは 2013/3公開。オープンソースプロジェクトで、Git hub上でソースコードが公開されている。 GO言語で書かれている。 コンテナ型の仮想環境を作成、配布、実行するためのプラットフォーム Linuxのコンテナ技術を使っている

Dockerデーモン

dockerコマンドは、コマンド自体(client) + dockerデーモン(server)という構成。 run,build→Dockerデーモンが処理をしてる。

Dockerコンテナ

Dockerイメージから作られて実行される仮想環境 Dockerイメージをrunすることで作成される アプリ本体、必要なライブラリなどをパッケージングしたもの

コンテナの分け方

(Physical server,HostOS,Docker Engine)→bins/libs→PHP →bins/libs→MySQL

Docker Bridge

コンテナがホスト外と通信する場合 NATする必要がある。 Nat:2つのネットワーク間のIPアドレスを中継する技術 グローバルIPアドレス←→プライベートIPアドレスの変換を行う仕組み NATをパワーアップさせたのがNAPT

上記問題を解決するツール ・Weave ・SocketPlane ・Docker v1.7〜

Dockerイメージ

コンテナのファイルシステム、設定をまとめて保存

Dockerイメージ→(build)→Dockerイメージ→(run)→コンテナ

Docker Registryと呼ばれる場所にある

[Docker Registry:Dockerイメージ]→(pull)→[サーバ:Dockerイメージ→(build)→Dockerイメージ→(run)→コンテナ]

Dockerサーバ

コンテナやイメージの管理を行う

Dockerクライアント

ユーザがDockerを操作する際に使うコマンド,GUIツール。Dockerを利用する周辺ツールも含まれる。

Dockerのコマンド

DockerToolboxでインストールした場合はDockerQuickTerminalを起動してコマンド入力。 Docker gor Macでは、「ターミナル」アプリケーションで直接コマンドを入力できる。

Hello Worldの実行

$ docker run hello-world

Ubuntuの実行

$ docker run -I -t ubuntu /bin/bash

Nginxの実行(8080)

$docker run -p 8080:80 nginx

コンテナの一覧

$ docker ps

終了

$ docker kill [コンテナID/名前]

削除

$ docker rm [コンテナID/名前]

詳細確認

$ docker version

Is the docker daemon running?.

docker daemonが起動していない

Docker quick start terminalで起動

Is the docker daemon running?.にまだなる。

一度アンインストールしてみる $ brew uninstall --force docker docker-machine docker-compose Uninstalling docker... (8 files, 52.3MB) Uninstalling docker-compose... (887 files, 9.4MB)

アンインストールされていることを確認 tanaka:~ tanakaakio$ docker --version -bash: /usr/local/bin/docker: No such file or directory

Dockerfile

Dockerイメージの構築方法をコードとして記述するファイル。 元となるイメージや、実行するコマンドを記述。

Dockerの仕組み

Dockerでは、コンテナを実現するためLinuxの機能を利用します。

chroot コンテナごとにファイルシステム空間を分ける

・スタッカブルファイルシステム ファイルシステムの階層を利用してディスクを効率よく利用

・ネームスペース コンテナごとに名前空間を分ける。 名前空間には、プロセス,ネットワーク,IPC,マウント,ホスト名,ユーザがある。

・cgroups CPU,メモリ,ディスク入出力などのリソース管理をする

Docker の純正ツール

・Docker Engine

Docekr本体とも言える、コンテナ,イメージの管理,実行を行うツール

・Docker Hub(レジストリ)

Dockerイメージを集めたサイト。

・Docker Toolbox Mac,windows上でDockerを利用するためのインストーラVirtualBox仮想マシン上でLinux、Dockerサーバを動作

・Docker for Mac Mac上でDockerを利用するためのインストーラVirtualBox不要でMacと統合されていて、Docker Toolboxより便利に利用できる。 VirtualBoxと同時に利用可能

・Docker for Windows Windows上でDockerを利用するインストーラVirtualBox不要でWindowsと統合されていて、 VirtualBoxと同時に利用はできない。

・Kitematic GUI操作でDockerを操作するツール。 Dockerインストール後、タスクバーに表示されるDockerのクジラアイコンをクリック。 Kitematicを選択。ダウンロードサイトに。 Applicationsファイルをダウンロード→アプリケーションフォルダに入れる。

・Docker Machine,Docker Swarm,Docker Compose

クラスタ環境にアプリケーションを展開するためのツール。

Docker Machineは、実行環境を構築、管理。 以前はLinuxでしか動作しなかったから、MacとかWindowsはDocker Machineで VirtualBox上に環境を作り、その上でデーモンやエンジンを動かしてたけど、 今は各プラットフォームに対応してるので、ローカル実行の時は使われない。 古いOSを使ってる時は必要

Docker Swarmは、クラスタ管理。

Docker Composeは、コンテナは1プロセスを立ち上げて利用するので、 複数の機能を提供する場合、いくつかのコンテナが協調して動作する必要が あるけれど、それを簡単にするのがDocker Composeです。

Docker Cloud

ウェブ上で、Dockerホストの管理や、アプリケーションのデプロイが行えるツール。

考え方

・Immutable Infrastructure

サーバ起動後に設定を変更したりアプリケーションをインストールせず、 必要に応じてコンテナを作り直すので、適用忘れやサーバごとに状態が 変わることを避けます。

・マイクロサービス(Micro Service)

軽量かる起動が速いというコンテナの特徴を生かして、 アプリケーション・プロセスなど小さい単位でコンテナを分離するので、 依存関係が減り、開発やアップデートが簡単になる。

・Infrastructure as Code

マシンの状態をコードで記述するという考え方。 コードで記述し自動化することで、ミスを減らして変更・管理が簡単になる。

・DevOps

ソフトウェア開発とマシンの管理を統合し、効率よく開発するという考え方。

メリット

・軽量で高速に起動、停止などが可能 ・コード化されたファイルを共有することで、どこでも誰でも同じ環境が作れる。 ・作成した環境を配布しやすい ・スクラップ&ビルドが容易にできる ・開発工程の中で使っていた環境をそのまま本番環境に持っていくことも可能 ・Dockerイメージを他の人にも渡して使ってもらうことで、各自の環境のバージョンずれ防止や、開発環境準備の短縮化にもつながる ・新規メンバ参画時のコスト削減や、環境依存問題を減らせる! ・ゲストOSが不要 ・サイズが小さい ・起動が早い ・高いポータビリティ(必要な部分のみポータビリティを確保するので軽量) ・アプリの高密度化可能(ゲストOS用のリソースが不要=コンテナ数増加可能) ・環境構築手順コード化可能(ブラックボックスを防ぐ)

デメリット ・セキュリティ上の様々な問題を抱えている。 ・ルート権限を必要とするコンテナ実行の仕組みが、致命的な脆弱性に繋がりやすい ・開発スピードが速すぎる(今日入れたバージョンが数ヶ月後には古くなると、メンテナンス,保守性,セキュリティパッチなど不安) ・ライブマイグレーションできない ・ネットワークまわりカオス 従来の仮想化<Dockerとは言い切れない。上位互換ではない

Gunosyが試したDocker投入・検証記 Gunosyはエンジニア25名ほどの会社 900万ダウンロード達成。 2104/4頃からDockerを運用

仮想マシンとは

ホストマシン上でハイパーバイザを利用しゲストOSを動かし、 その上でミドルウェアなどを動かしている。

メリット

デメリット

・仮想化マシンではホストOSとアプリケーションの間に、ゲストOS,ハイパーバイザなどが 介在してるのでオーバーヘッドが大きく環境構築に手間がかかる。 ・起動が遅い ・イメージが大きい

Dockerと仮想マシンの違い

1.仮想マシンではマシン単位の仮想化を行う、コンテナではOS単位での仮想化を行う。 そのため、コンテナは必要なリソースが少なく、非常に高速に起動する。