Red Hat Enterprise Linux OpenStack Platform環境での Docker活用テクニック Etsuji Nakai Cloud Evangelist Red Hat K.K. 4 November 2015 Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック 自己紹介 中井悦司(なかいえつじ) – Twitter @enakai00 日々の仕事 – Senior Solution Architect and Cloud Evangelist at Red Hat K.K. 企業システムでオープンソースの活用を希望される お客様を全力でご支援させていただきます。 昔とった杵柄 – 素粒子論の研究(超弦理論とか) – 予備校講師(物理担当) – インフラエンジニア(Unix/Linux専門) 本日のデモで使用する コンテナイメージの作り方は、 この本に記載されています。 1 好評発売中! Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック デモの詳細はブログを参照してください デモの手順(スクリプトやコマンド)の詳細は下記のブログに掲載しています。 – OpenStack上でRHEL7のDockerを使う手順 – http://enakai00.hatenablog.com/entry/2015/10/06/194542 本スライドに記載のスクリプトやコマンドは、一部を抜粋したものです。スクリプ トの全体像は上記のブログを参考にしてください。 2 Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック Contents OpenStackの機能概要(復習) Dockerの機能概要(復習) OpenStackとDockerを組み合わせるメリット Docker用仮想マシンの構成 (ブロックボリュームを使わない例) Docker用仮想マシンの構成 (ブロックボリュームを使う例と複数コンテナの連携例) Kubernetes/OpenShiftによるオーケストレーション 3 OpenStackの機能概要(復習) Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック OpenStackが提供するコンピューティングリソース OpenStackユーザ OpenStackのユーザは、Webコンソール/APIを利用して、 次のようなコンピューティングリソースを利用します。 外部ネットワーク – 仮想ネットワーク – 仮想マシンインスタンス – ブロックボリューム 各ユーザは特定の「プロジェクト」に 所属します。 – プロジェクト内でリソースを共有 – プロジェクト全体でのリソース使用 量の上限設定、リソース使用状況の レポーティングなどが可能 プロジェクト環境 仮想ルータ 仮想スイッチ OS領域 データ領域 5 仮想マシンインスタンス ブロックボリューム Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック カスタマイズ・スクリプト(UserData)による自動化 仮想マシンインスタンス起動時に「カスタマイズ・スクリプト(UserData)」を与えると任 意のテキストをメタデータとしてゲストOSに受け渡すことができます。 Cloud-Initは、カスタマイズ・スクリプトを解釈して、さまざまな自動化を実現します。 – 下図はシェルスクリプトを渡して、「/etc/motd」を設定しています。 – この他にもCloud-Init独自の構文で、処理内容を指示することができます。 $ curl http://169.254.169.254/2009-04-04/user-data #!/bin/sh echo 'Hello, World' > /etc/motd exit 0 6 Dockerの概要(復習) Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック Dockerが提供する基本機能 OS上にインストール可能な ものはすべてイメージ化可能 ① Dockerイメージを自動作成 Dockerfile イメージの 作成手順を記載 Docker イメージ OSイメージ ② Dockerイメージを保存・公開 ③ Dockerサーバーに イメージを配布・実行 8 アプリケーション フレームワーク アプリケーション ライブラリー Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック サービス環境へのDocker適用のメリット テストが実施された「確実動くアプリケーション」をそのままDockerイメージに 固めて、本番環境に自動デプロイするという運用を想像してみましょう・・・。 フレームワーク データベース アプリケーション フレームワーク ライブラリー Dockerイメージを 本番環境に展開! 9 OpenStackとDockerを 組み合わせるメリット Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック OpenStackによる自動化(オーケストレーション)手法 Dockerが無かった時代は・・・ – 仮想マシン、ストレージ、ネットワークなどのインフラは、OpenStackで自動構成 – ゲストOS上のアプリはChef/Ansible/Puppetなどの構成管理ツールで自動構成 ゲストOSとアプリの管理が別れているため「Immutable」な運用が困難! – ゲストOSのテンプレートはOpenStack側で管理 – 仮想マシン起動時に動的にアプリの導入・設定を実施 ゲストOSの変更に起因する アプリ導入の失敗が発生 11 「第14章 Dockerを利用したアプリケーション展開」より引用 Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック OpenStackとDockerの組み合わせ手法 Dockerを用いた運用だと・・・ – OpenStackは、「インフラ+DockerホストOS」の提供に専念 – アプリの実行環境は、Dockerイメージで作成・管理・デプロイ インフラとアプリの管理を分離することで「Immutable」な運用が容易に! – ゲストOSのテンプレートはDockerの稼働環境を提供 – 事前作成済みのDockerイメージを配布してアプリを起動 アプリの導入・管理を OpenStackから分離可能 12 「第14章 Dockerを利用したアプリケーション展開」より引用 Docker用仮想マシンの構成手順 (ブロックボリュームを使わない例) Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック Railsアプリをコンテナで起動する構成例 コンテナ内で Railsアプリを起動 Railsアプリ(伝言板) のイメージを事前登録 コンテナ (Railsアプリ) コンテナ イメージ Dockerで管理 OpenStackで管理 Dockerデーモン 仮想マシン フローティングIP フローティングIPにアクセス Docker導入済み VMテンプレート OS領域 イメージ 保存領域 追加の エフェメラルディスク 14 Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック ゲストOSとイメージ保存領域の用意 OS領域とイメージ保存領域のディスクを用意します。 – RHEL7の公式ゲストイメージにdockerパッケージを導入 したスナップショットを用意します。 – また、イメージ保存領域用に「一時ディスク」の容量を 設定したフレーバーを定義しておきます。 仮想マシン Docker導入済み VMテンプレート OS領域 イメージ 保存領域 # # # # # # 15 subscription-manager register subscription-manager attach --pool=<pool id> subscription-manager repos --disable=* subscription-manager repos --enable=rhel-7-server-rpms --enable=rhel-7-server-extras-rpms yum -y update yum -y install docker lvm2 Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック 仮想マシンの作成とコンテナの起動(Railsアプリ) Nova APIから仮想マシンを作成します。 – 先ほど準備したスナップショットとフレーバーで仮想マシンを起動します。 – 起動後に外部からアクセス可能なフローティングIPを割り当てます。 UserData(カスタマイズスクリプト)を用いて、下記の処理を実施します。 – イメージ保存領域をセットアップ cat <<'EOF' >/etc/sysconfig/docker-storage-setup VG=vg_pool DATA_SIZE=18G EOF rm -rf /var/lib/docker/* pvcreate -f /dev/vdb vgcreate vg_pool /dev/vdb docker-storage-setup 「/dev/vdb」にVGを作成して、 イメージ保存領域として構成 – コンテナイメージを取得して、コンテナを起動 docker run -itd -p 8000:80 --name dengonban01 \ registry01:5000/enakai00/rails:ver1.0 8000番ポートへのアクセスを コンテナの80番ポートに転送 仮想マシン Docker導入済み テンプレート ゲストOSからは 「/dev/vdb」として認識 16 OS領域 イメージ 保存領域 Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック (参考)Dockerの内部ネットワーク構成 それぞれのコンテナーには独立した仮想NICとプライベートIPアドレスが割り当てられて、ホ ストLinuxの仮想ブリッジ(docker0)に接続します。 – IPアドレスは自動で割り当てられますが、他のコンテナーからは環境変数で参照できるように設定が 可能です。 外部ネットワークからアクセスする際は、ホストLinuxで受信したパケットをコンテナー内に 転送するように設定します。 – 外部のクライアントはホストLinuxにアクセスするので、コン テナーの存在を意識することはありません。 – OpenStack環境の場合、外部からは、仮想マシンに割り当てた 「フローティングIP」にアクセスします。 コンテナー TCP 80 ホストLinux ポート フォワー ディング # docker run -it -p 8000:80 ... TCP 8000 17 外部ネットワーク vethXX docker0 eth0 ホストLinuxの IPアドレスに接続 eth0 172.17.42.1 Docker用仮想マシンの構成手順 (ブロックボリュームを使う例と 複数コンテナの連携例) Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック MySQLをコンテナで起動する構成例 コンテナ (MySQL) コンテナ内で MySQLを起動 MySQLのイメージを 事前登録 /var/lib/mysql コンテナ イメージ Dockerで管理 OpenStackで管理 Dockerデーモン OS領域 イメージ 保存領域 追加の エフェメラルディスク 19 /data 仮想マシン Docker導入済み テンプレート MySQLのデータ領域 「/var/lib/mysql」に ブロックボリュームの ディクレクトリを割り当て ホストLinuxの /dataにマウント 永続データ 領域 ブロックボリューム Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック 仮想マシンの作成とコンテナの起動(MySQL) Nova APIから仮想マシンを作成します。 – 先ほど準備したスナップショットとフレーバーで仮想マシンを起動します。 – 起動後にフローティングIPとブロックボリュームを割り当てます。 UserData(カスタマイズスクリプト)を用いて、下記の処理を実施します。 – イメージ保存領域をセットアップ – ブロックボリュームが割り当てられるのを待って、ホストLinuxの/dataにマウント mkfs.xfs -f /dev/vdd mkdir /data mount /dev/vdd /data chcon -Rt svirt_sandbox_file_t /data – コンテナイメージを取得して、コンテナを起動 docker run -itd --name mysql01 -v /data:/var/lib/mysql -p 10000:3306 registry01:5000/enakai00/mysql:ver1.0 sleep 5 docker exec mysql01 mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'nodeuser'@'localhost';" docker exec mysql01 mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'nodeuser'@'%' IDENTIFIED BY 'pas4mysql';" docker exec mysql01 mysql -u nodeuser -e "CREATE DATABASE shorturl_service;" docker exec mysql01 mysql shorturl_service -u nodeuser -e " \ CREATE TABLE url_list ( \ hash CHAR(12) PRIMARY KEY, \ この後で起動するnode.jsアプリで url VARCHAR(256) UNIQUE NOT NULL COLLATE utf8_bin \ 使用するデータベースを作成 );" EOF 20 Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック MySQLにアクセスするコンテナの構成例 接続先DBのIP/ポートは 環境変数で参照 var DBHOST = process.env.DB_PORT_3306_TCP_ADDR; var DBPORT = process.env.DB_PORT_3306_TCP_PORT; コンテナ (MySQL) /var/lib/mysql コンテナ イメージ コンテナ (node.jsアプリ) コンテナ イメージ Dockerデーモン /data Dockerデーモン フローティングIP フローティングIP フローティングIPにアクセス OS領域 イメージ 保存領域 21 永続データ 領域 OS領域 イメージ 保存領域 フローティングIPにアクセス Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック 仮想マシンの作成とコンテナの起動(node.jsアプリ) Nova APIから仮想マシンを作成します。 – 先ほど準備したスナップショットとフレーバーで仮想マシンを起動します。 – 起動後に外部からアクセス可能なフローティングIPを割り当てます。 UserData(カスタマイズスクリプト)を用いて、下記の処理を実施します。 – イメージ保存領域をセットアップ – コンテナイメージを取得して、コンテナを起動 docker run -itd --name shorturl01 -p 8000:80 \ -e DB_PORT_3306_TCP_ADDR=192.168.1.104 \ -e DB_PORT_3306_TCP_PORT=10000 \ registry01:5000/enakai00/shorturl:ver1.0 接続先DBのIP/ポートを 環境変数に設定して コンテナを起動 var DBHOST = process.env.DB_PORT_3306_TCP_ADDR; var DBPORT = process.env.DB_PORT_3306_TCP_PORT; 接続先DBのIP/ポートは 環境変数で参照 コンテナ (node.jsアプリ) コンテナ イメージ Dockerデーモン 仮想マシン 22 Kubernetes/OpenShiftによる オーケストレーション Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック Docker活用パターン1:アプリのデプロイを安全/簡単に 仮想マシン上のアプリケーションをコンテナイメージ化することで、アプリケー ションのデプロイを安全/簡単にします。 – 「1仮想マシンに1アプリケーション」という配置はあえて変更しないことで、運用方 法やアプリケーションのデザインへの影響を最小限に留めます。 – 外部からアプリケーションに接続するユーザー/外部システムは、アプリケーションが コンテナ化されていることを意識する必要がありません。 – コンテナイメージを開発する環境(OpenShiftなど)は、別途、必要となります。 アプリケーションの コンテナイメージ化 これまでの環境 アプリA 仮想マシン (ゲストOS) アプリB ・・・ 仮想マシン (ゲストOS) ・・・ OpenStack/仮想化基盤 24 アプリA (コンテナ イメージ) 仮想マシン アプリB (コンテナ ・・・ イメージ) 仮想マシン (Dockerホスト) (Dockerホスト) OpenStack/仮想化基盤 ・・・ Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック Docker活用パターン2:コンテナ化によるリソース有効活用 コンテナの配置先を自動的に振り分ける仕組みを用いて、複数ホストを「1つの コンピューティングリソース」として活用します。 – Kubernetesなどのオーケストレーションツールを使用します。 アプリケーションを機能単位に分割してコンテナ化することで、さらなるメリッ トが得られます。 – 必要な機能を負荷に応じてオートスケールします。 – 機能単位でコンテナを入れ替えることにより、稼働中のアプリケーションの動的な機能 変更が可能になります。 複数ホストを束ねて「1つのコンピュータ」として活用 仮想マシン 仮想マシン 仮想マシン (Dockerホスト) (Dockerホスト) (Dockerホスト) 25 OpenStack/仮想化基盤 ・・・ マイクロサービス化 アプリケーション Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック Kubernetes:Dockerをより高度に管理する仕組みを提供 今後は、Kubernetesを利用した DevOps基盤が開発されていきます http://jp.techcrunch.com/2014/07/11/20140710google-microsoft-ibm-and-others-collaborate-to-make-managing-docker-containers-easier/ 26 Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック OpenShift v3:DockerによるDevOps環境を実現 OpenShift v3は、Docker/Kubernetesをコアコンポーネントとして、インテグレートされた DevOps環境を提供します。 UI、モニタリング、 イメージ作成ワークフロー etc. OpenShift v3 DevOps環境 複数サーバーに跨る オーケストレーション Kubernetes ・・・ コンテナー管理 Docker Docker ・・・ 実行リソース提供 サーバー/仮想マシン サーバー/仮想マシン ・・・ 27 RHEL Atomic Host Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック まとめ サービス環境でDockerを使用するメリットは、大きく2種類あります。 アプリケーションのデプロイを簡単/安全に実施する。 本日ご紹介した 利用パターン – 開発側で、テスト済みのアプリケーション環境をイメージ化する仕組みを用意する必要 があります。OpenShiftの開発支援機能を活用してください。 – 1VM(1ホスト)に1コンテナを配置することで、アプリケーションの設計/運用は従 来と同じ方法を踏襲します。 – OpenStack + Dockerにより、VMの作成とコンテナの配置を自動化する事も可能です。 複数のホストをプール化して、リソースの有効活用を行う。 次世代のアプリ ケーション環境 – Kubernetes, OpenShiftなど、コンテナの自動配置(オーケストレーション)を行うツー ルと組み合わせる必要があります。OpenStackを用いて、Kubernetes/OpenShift環境を 自動構築する事も可能です。 – ハイパーバイザーのオーバーヘッドを回避したい場合は、OpenStackのベアメタルプロ ビジョニング機能が利用できます。 – アプリケーションのマイクロサービス化により、機能単位のオートスケール、アプリ ケーションの動的な機能変更が実現可能になります。 28 Red Hat Enterprise Linux OpenStack Platform環境でのDocker活用テクニック 参考資料 OpenStack上でRHEL7のDockerを使う手順 – http://enakai00.hatenablog.com/entry/2015/10/06/194542 "Docker is NOT Container." ~ Dockerとコンテナ技術、PaaSの関係を理解する – http://www.slideshare.net/enakai/docker-is-not-container-dockerpaas Dockerイメージ管理の内部構造 – http://www.slideshare.net/enakai/docker-43975886 Red Hat Enterprise Linux 7.1 Kubernetes入門 – http://www.slideshare.net/enakai/red-hat-enterprise-linux-71-kubernetes Open shift 3 technical architecture – http://www.slideshare.net/hyoungseunglee/open-shift-3-technical-architecture 29 Thank You Red Hat Forum 2015 Energize Your Enterprise
© Copyright 2025 ExpyDoc