Docker?

Dockerを知っておいてね

dockerって?

dockerは、コンテナベースのオープンソースの仮想化プラットフォームです。

コンテナといえば倍に荷を積んだ四角い貨物の輸送用ボックスを考えることができる、それぞれのコンテナの中に服、靴、電子製品、酒、果物など様々な貨物を入れることができ、規格化されたコンテナ船やトレーラーなど、さまざまな輸送手段で容易に移動することができます。

サーバーで話をするコンテナも同様似様々なプログラム、実行環境をコンテナに抽象化し、同じインターフェイスを提供して、プログラムの展開と管理をシンプルにします。バックエンドプログラム、データベースサーバー、メッセージキュドゥンどのプログラムもコンテナに抽象化することができ組立PC、AWS、Azure、Google cloudなど、どこからでも実行できます。

コンテナを最もよく使用している企業は、Googleのに2014年に発表によると、Googleは、すべてのサービスがコンテナで動作して、毎週20億個のコンテナを駆動するそうです。


コンテナ(Container)

コンテナは、隔離された空間でのプロセスが動作する技術です。仮想化技術の一つが、従来の方法とは違いがあります。

従来の仮想化方式は、主にOSを仮想化しました。

私たちに馴染みのVMwareやVirtualBoxなどの仮想マシンは、ホストOS上のゲストOS全体を仮想化して使用する方式です。この方式は、様々なOSを仮想化(Linux上でWindowsを回転させるとか)ことができ、比較的使い方が簡単ですが、重くて遅い動作環境では使用できませんでした。

このような状況を改善するためにCPUの仮想化技術(HVM)を利用したKVM準仮想化方式のXenが登場します。この方法は、ゲストOSが必要ですが、全体のOSを仮想化する方法ではないだったので、ホスト型の仮想化方式に比べて性能が向上しました。これらの技術は、OpenStackやAWS、Rackspaceなどのクラウドサービスでは、仮想コンピューティング技術の基盤となった。

全仮想化も準仮想化も、追加のOSをインストールして仮想化する方法は、とにかくパフォーマンスの問題があってこれを改善するために、プロセスを隔離する方法が登場します。

Linuxでは、この方式を、Linuxコンテナとして、単純にプロセスを分離するため、軽くて速く動作します。CPUやメモリはぴったりのプロセスが必要な分だけ追加で使用して性能的にもほぼ損失がありません。

Dockerの基本的なネットワークモードは、Bridgeモードで若干のパフォーマンスの低下があります。ネットワークのパフォーマンスが重要なプログラムの場合、--net=hostオプションを考慮する必要があります。

1つのサーバー複数のコンテナを実行すると、お互いに影響を与えずに独立して実行され、まるで軽いVMを使用している印象を与えます。実行中のコンテナに接続してコマンドを入力することができapt-get、またはyumでパッケージをインストールすることができ、ユーザーも追加して複数のプロセスをバックグラウンドで実行することもできます。CPUやメモリの使用量を制限することができ、ホストの特定のポートに接続したり、ホストの特定のディレクトリを内部ディレクトリのように使用することもできます。

新しいコントインナーを作るにかかる時間はわずか1〜2秒で、仮想マシンと比較もできなく高速です。

これらのコンテナという概念は、dockerが初めて作成されたものはありません。もカーが登場する以前に、プロセスを隔離する方法で、Linuxでcgroupsとnamespaceを利用したLXCがあったFreeBSDでJail、SolarisではSolaris Zonesと呼ばれる技術がありました。グーグルでは、高大級の技術者が直接コンテナ技術を作成して使用しlmctfy(Let Me Contain That For You)というオープンソースのコンテナ技術を公開したが、成功しはしませんでした。

DockerはLXCをベースに開始して0.9バージョンでは、独自のlibcontainer技術を使用し、今後runC技術に合わせました。

イメージ(Image)

Dockerで最も重要な概念は、コンテナと一緒にイメージという概念です。

イメージは、コンテナの実行に必要なファイルや設定値などを含んでいることに状態値を持たず変わりません(Immutable)。コンテナは、イメージを実行した状態だと見ることができ、追加されたり変化する値は、コンテナに格納されます。同じイメージで複数のコンテナを作成することができ、コンテナの状態が変わったり、コンテナが削除されても、イメージは変わらずにそのまま残っています。

ubuntu画像はubuntuを実行するためのすべてのファイルを持っているMySQLのイメージは、debianベースのMySQLを実行するのに必要なファイルと実行コマンド、ポート情報などを持っています。より複雑な例としてGitlabイメージはcentosをベースにruby、go、database、redis、gitlab source、nginxなどを持っています。

文字通りのイメージは、コンテナを実行するためのモデルおおお来ても情報を持っているので、もはや依存ファイルをコンパイルして、あれこれインストールする必要がありません。今、新しいサーバーが追加されると、あらかじめ作っておいたイメージをダウンロードして、コンテナを作成するだけです。したサーバに複数のコンテナを実行することができ、数十、数百、数千台のサーバーでも問題ありません。

DockerイメージはDocker hubに登録したり、Docker Registryストアを直接作成して管理することができます。現在公開されたDockerイメージは50万が超えDocker hubのイメージのダウンロード数は80億回に達します。誰でも簡単にイメージを作成して展開することができます。


なぜこのようにホットか?

Dockerは、全く新しい技術ではなく、既に存在している技術を、よくパッケージしたと見ることができます。

コンテナ、Overlay Network、Union File Systemsなど、すでに存在している技術をDockerようによく組み合わせて使いやすくしたのはなかったユーザーが必要な機能を簡単ですが、画期的なアイデアで実装しました。


レイヤーの保存方法

Dockerイメージは、コンテナを実行するためのすべての情報を持っているので、通常の容量が数百MBに達します。初めてイメージをダウンロードすることが時大きく負担ができないが、既存のイメージに1つのファイルを追加した数百メガを再ダウンロードする場合、非常に非効率的であることがしかできません。

Dockerは、このような問題を解決するために、レイヤー(layer)という概念を使用して、ユニオンファイルシステムを利用して、複数のレイヤーを一つのファイルシステムとして使用することができます。イメージは複数の読み取り専用read onlyレイヤーで構成され、ファイルが追加または変更されると、新しいレイヤーが作成されます。ubuntuイメージがA + B + Cのセットであれば、ubuntuイメージをベースに作成されたnginxのイメージは、A + B + C + nginxになります。webappイメージをnginxイメージに基づいて作成した場合、期待どおりA + B + C + nginx + sourceレイヤーで構成されます。webappソースを変更するとABCnginxレイヤーを除いた新しいsource(v2)レイヤーだけダウンすればされるので、とても効率的にイメージを管理することができます。

コンテナを作成するときにも、レイヤー方式を使用する既存のイメージレイヤーの上にread-writeレイヤーを追加します。イメージレイヤーをそのまま使用しながら、コンテナが実行中に生成されるファイルや変更された内容は、read-writeのレイヤーに保存されるため、複数のコンテナを作成しても、最小限の容量だけを使用します。

仮想化の特性上、イメージの容量が大きく、複数のサーバーに展開することを勘案すれば、シンプルだが非常に巧妙な設計です。


イメージのパス

イメージはurl方法で管理し、タグを付けることができます。ubuntu 14.04のイメージは、docker.io/library/ubuntu:14.04またはdocker.io/library/ubuntu:trustyであり、docker.io/libraryは省略可能で、ubuntu:14.04利用することができます。この方法は、理解しやすく、便利に使用でき、タグ機能をうまく利用すれば、テストやロールバックも簡単に行うことができます。

Dockerfile

# vertx/vertx3 debian version
        FROM subicura/vertx3:3.3.1
        MAINTAINER chungsub.kim@purpleworks.co.kr
        
        ADD build/distributions/app-3.3.1.tar /
        ADD config.template.json /app-3.3.1/bin/config.json
        ADD docker/script/start.sh /usr/local/bin/
        RUN ln -s /usr/local/bin/start.sh /start.sh
        
        EXPOSE 8080
        EXPOSE 7000
        
        CMD ["start.sh"]

Dockerは、イメージを作成するためにDockerfileという名前のファイルに独自のDSL(Domain-specific language)言語を利用して、イメージの作成プロセスを少なくなります。上記のサンプルを見ると、そのように複雑ではないことを知ることができます。

これは非常に簡単ですが、有用なアイデアだが、サーバー上の任意のプログラムをインストールしようとあれこれ依存パッケージをインストールして、設定ファイルを作った経験がある場合は、もはやその過程をブログ、またはメモ帳に少なからずDockerfileに管理します。このファイルは、ソースと一緒にバージョン管理されて必要な場合誰イメージ作成プロセスを表示して変更することができます。


Docker Hub

Dockerイメージの容量は、通常、数百メガに手記がを超える場合も一般的です。このように大容量のイメージをサーバーに保存し、管理することは容易ではないDockerはDocker hubを通じて公開イメージを無料で管理します。一日も膨大な容量のイメージが全世界でダウンロードされ、トラフィックのコストだけでも、ものすごいことだと思う、それはすべて無料!です。


CommandとAPI

DockerクライアントのコマンDockerマンドは、実際に自己アアル作られています。ほとんどのコマンドは、直感的で使いやすく、コンテナの複雑なシステム構成を理解していなくても楽に使用することができます。また、httpベースのRest APIもサポートして拡張性が非常に良く、優れた3rd partyツールが出てくる良い環境です。


便利な新機能

Dockerは発展速度が非常に速いオープンソースです。使用して不足していると感じた部分は急速に改善され、新しいバージョンが出てくる便利な機能が大幅に追加されます。どのように見れば、プログラムをより小さな部分に分割し、複数のプログラムを組み合わせて動作させるUnixの哲学には合わないが..とても良いです。

1.13バージョンでは、Docker stacksという複数のコンテナを一度に管理する機能が正式にリリースされたsystemコマンドが追加され、イメージ、コンテナ管理がより楽になりました。Secrets Managementという秘密情報を管理する機能も追加されます。

新機能が継続追加されていて、次のリリースが期待されます。


素晴らしい生態系

Dockerはとても大きな生態系を持っている大きな企業と協力して、事実上、クラウDockerンテナの世界のde factoなりました。ログ記録、監視、ストレージ、ネットワーク、コンテナ管理、配布など様々な分野で、さまざまなツールが存在し、最初からDockerのOS(coreos-> container linux)も存在します。

現在Dockerをベースにしたオープンソースプロジェクトは、10万が超えとても活発に行われています。


コミュニティサポート

Dockerは技術企業にふさわしくなく広報とコミュニティ管理にとても気を使っています。コミュニティのためのステッカーやTシャツを無料で提供して、必要に応じ講演依頼もできます。ホームページでは、世界中で開催されるミトオプ状況を見ることができ、一週間ごとに送信されるニュースレターでは、さまざまな開発者たちの文が載っています。


まとめ

ここまでDockerに基本的な内容を非常に浅く説明しました。今本番に入りましょう!

Additional Images




Comments

Add your comment

user-symbol

Stay in touch

Get Practical Tips For Business and Developers.

Learn about PieceX Community Needs for Source Code Projects.

Be the First to Know PieceX Newest Free Community Code Projects.