今回はDocker+Oracleという縛りの中でのLTとなりました。
様々な人がdockerでOracleをいじり倒した結果を共有してくれる素晴らしい勉強会でした!
はじめてのDockerパーフェクトガイド(2017年版)
早川 博様 @hhiroshell様
Dockerのテクノロジーを知る
- 全体像として、Dockerホスト上でレジストリから引っ張ってきたイメージを使ってコンテナを動かす
- Dockerクライアントはdockerコマンドを用いて各種dockerの操作ができる
- Dockerホストの中でDockerデーモンが動いている
- Dockerデーモンはクライアントからの指示を受けてイメージの管理等を行う
- Dockerイメージとコンテナの関係として、イメージは雛形で、コンテナは実際に動くもの
仮想化の実現方式の違い
- ハイパーバイザーとの比較として、ハイパーバイザーの上でゲストOSが動いてソフトウェアを動かすが、コンテナだとハードウェアのシミュレートが必要なく、OSを動かさないので直接ソフトウェアを動かせる
- コンテナ型だとハイパーバイザーの層が存在せず、OSから見るとプロセスがいるだけのようにみえるので、起動が早かったりする。
- OSを含まないので容量がとても小さい
- エミュレートする層がないのでオーバーヘッドなく、パフォーマンスが落ちにくい
Dockerイメージの実態
- dockerイメージはカーネルの層から差分をのっけたレイヤー構造をとったものがイメージになっている
- 全ての層が適用された結果として見せているファイルシステムがUnionFileSystemになる
- ただしカーネルはホストOSを共有するのでイメージには含まれない
- 下から上に変更差分として層を付け足していくとイメージになる
- イメージをコンテナとして動かそうとすると、階層構造の上に書込み可能なレイヤーが書き足される
- これに、起動して何かの処理が走るプロセスがはしってハードウェアのリソースが割り当てられてコンテナとして稼働する
- UFSのマウント+プロセス+リソース = コンテナ
- OS上でプロセスを動かしているだけなので他のコンテナのプロセスやファイルが見えたり、OSが見えてしまうとまずいので隔離することで一つの独立したマシンに見える
コンテナを起動するときの挙動
- 所定の場所にコンテナごとにカーネルの機能を使ってマウントされる
- プロセス空間もnamespaceの機能を使って隔離してコンテナ同士が認識しないようにする
- ネットワークはdockerデーモンが仮想ブリッジというのをたて、その上に仮想NIC(veth)を作り、コンテナからみるとそれがeth0のNICに見える。
- ホストから見るとホストOSに立てている仮想NICに見える
- IPマスカレードを利用してうまくネットワークを分断する
Dockerイメージの作り方
- Dockerのイメージは階層構造をもっているが、実際起動すると書込み可能なレイヤーが追加されて書き換えて行くが、その書き換えた内容をdocker commitとすると書込み可能なレイヤーをレイヤーとして追加される。
- Dockerfileを使うと、dockerコンテナを起動して操作しなくてもイメージを作ることができる
- dockerイメージの内容を記している
- 「docker build」コマンドでイメージが作成される
Dockerレジストリ
- Dockerレジストリはdockerイメージを保管する場所
- Docker hubだとubuntuにpythonがインストールされたものがあったり、3rdパーティのものもあったり、自分用のプライベートなものも作れる
- OracleもだしていてOracle Container Registryはデータベースのイメージを取得できる
Dockerの使い所を知る
アプリケーション開発
- アプリケーションを作るときに、1回作ったアプリケーションを受け入れテスト、キャパシティテストなど、環境ごとにコンテナイメージを用意してテストしたりと継続的デリバリーができる
- コンテナイメージの中に必要なソフトウェアが用意されるので、それぞれの環境でテストをすることができるようになる
- 各環境を自動化して作ることができるので時間を短縮できる
- 自分でアプリケーションを試したい人が、自分でイメージを落としてきて試したりと、ローカル開発環境も整いやすい
- ポケモンGOのサーバーサイドはKubernetesを組み合わせて運用したりしている
- キャンペーンなどの大量アクセスに耐えうるようにコンテナを増やして運用している
- ファームウェアを書き換えられるキーボードを作ったりしているが、各種モジュールをインストールしたdockerイメージを用意しておくことでwindows/linux問わずにmakeすることができるようになったりする。
Dockerの周辺事情を知る
コンテナ・オーケストレーション
- 複数のコンテナをdeployして、自動化して複数にしたりコンテナ同士を連携させるのをコーディネートしてくれるもの
- Kubernetes, mesos, docker swamなどいろいろあるがいまはKubernetesが主流になりつつある
- Google/MSでホスティングをしはじめている
- Docker EEでサポートし始めている
- 大きなリソースのプールがあって、そのなかでコンテナを動かす
- どうコンテナが動くかはクライアントは関与せず、どこでコンテナを動かす、自動でF/Oといったことはオーケストレーションが管理する
Cloud Native Computing Foundation
- Kubernetesを中心としたfoundation
- Fluentd, prometheusなどが有名
- 主要なベンダーがプラチナメンバーとして参画している
Oracle Database (CDB) on Docker を動かしてみる
佐々木 亨様
dockerの現状
- OracleのDocker対応状況(Doc ID 2216342.1 Doc ID 2220780.1)
- dockerのホストとして認められているのはOracle Linux, RHELをサポートしている
- サポートされるDocker ImageはOracle公式のものを使う
- RACはサポートしていないが、近日中にサポート予定とのこと
- Docker Store / Oracle Containr Registoryからイメージが取れるが、12.2.0.1のEEになる
- 制限事項: RAC構成、DataGuard構成、DBオプションの使用、パッチ適用ができない
- 考慮事項: デフォルトでコンテナ削除するとDBも削除されるので、データファイルを残して別のコンテナから利用したい場合はオプションを指定して別のボリュームにDBを作成する必要がある
- Githubからファイルを入手してビルドする場合は、12.2.0.1, 12.1.0.2 EE/SE2, 11gも使えます
Demo
- コンテナを起動する際にデータファイルは別途マウントして操作するようにしており、Oracle 12.2EEの環境のコンテナを使ったデモを実践
docker runで立ち上げる
dockerに入る
ディレクトリが別途マウントされている
データファイルはこの中にあります
sqlplusで入れます。
cdbとして構成されています。
その他
- テストDBを複製して作る場合は、PDBを使って複製するのが良いが、別のディレクトリにデータをコピーしてマウントすれば同じことをコンテナを使ってやることもできる
- なぜCDB構成なのか?
- 不必要な複製を避ける点でMTAとDockerは共通点があるが、プロビジョニングするベストな方法はMTA
- VMよりdockerの方がライトにできる
Oracle Linux と Docker とその周辺のもの
渡辺 剛様
Oracle LinuxでDocker
- OracleLinuxでDockerをするときは、oracle linuxの中にドキュメントやエラータがあり、特にマニュアルにdockerを使う章があるのでおすすめ
- yumで必要なものは落とせる。
- コンテナイメージはOracleから出されているが、Oracle Container Registryから使わないとサポートされない
- Oracle LinuxはUEKを使う想定なので、RHCKにしない、
- dockerのrpmが更新されたとかはOracle Linuxのエラータを登録しておくとお知らせしてくれます
- http://yum.oracle.com/boxes
- OL6.9 と OL7.4 があり、デフォルトでYumのリポジトリが多めに(developerとか、previewとか)有効化されていて、すぐにdockerをいれやすい
- Oracle Linuxでdockerやっていてもdocker hubなどが使えるが、Oracle製品を使うときはOracle Container Registryを見たほうが良い
- UEKR4が入ってないとインストールできない縛りがあります
Kubernetes
- 複数のdockerホストをクラスタにして利用する仕組み
- マスターノードとワーカノードというものがある
- kubectlというコマンドで操作する
- oracleのKubernetesだと、Kubernetesのサービスをdockerコンテナで起動するようにしている
- kubeadm-setup.shはkubeadmのrpmにはいってます
- Kubernetesのセットアップ、ノードの起動停止、バックアップ・リストアができる内容になっている
- docker runで今までコンテナを起動していたが、Kubernetesはymlファイルを定義して一気に起動する方法が一般的
- コンテナの集合であるPodを定義するとグループで起動できる
- setupは簡単だが、あまりカスタマイズができない。
- バックアップ・リストアの機能動かなかった
- とりあえず始めるにはおすすめ
- Kubernetesはdockerにネイティブで組み込まれるのでこの形は試すなら今だけ。
OpenStack
- R2から全部Dockerコンテナとしてデプロイする
- パッケージングツールとしてdockerを使う例になる
- Oracle VM Serverにdockerが入ってきている
- OpenStackのイメージとしては、ハイパーバイザの上にcontrol nodeを立ち上げているが、Oracle OpenStackだと、マスターノードとターゲットノードを別々に持つ
- Kollaという仕組みを使ってコンテナを管理する
- Kollaを用いるとansibleで構築してOpenStackが使えるようになる
Oracle RAC on Docker
大島正樹様
Oracle RACとは
- 複数のサーバーで同一のデータを参照更新するクラスタデータベース
- Public LAN、private LAN, 共有ディスクがあると動きます
Oracle RAC on Dockerの構築ポイント
- DockerではIPアドレスはdockerエンジンを通して割り当てられ、コンテナ側から柔軟にIPアドレスを制御するのは難しい=仮想IPは難しい
- コンテナ間をvxlanという仮想ネットワークで接続することでできるようにしている
- vxlanは論理的な仮想的なL2ネットワークを構築するための規格で、Linuxカーネルに、標準で組み込まれている
- コンテナからiscsiを直接扱うことはできないので、NFSでマウントして共有ディスクとして使っている
ハマったところ
- RHEL7以降、systemd前提だが、Oracle者のDockerイメージにはsystemdが含まれていないので、systemdを有効化したイメージを作成する必要がある
- コンテナのデフォルト権限では厳しすぎてsystemdやvxlanインターフェースが起動できないので、コンテナ起動オプションに—priviledgedという特権モードを付与して起動する必要がある
- コンテナのRAMは64Mで起動してきて、ASMインスタンスを起動できないので、1.2G以上は振ってあげないといけない
demo
rac_on_xx/dockerを実践。
8台のノードとして立ち上がっている
お馴染みcrsctl stat res -t を叩くとクラスタとして動いていることがわかる
Oracle対応アプリケーションのDockernize事始め
永安悟史様 @snaga様
- 自分で作ったHecatoncheirについて、環境構築がめんどくさくて使ってくれない問題があるが、dockerを使ってうまく使えるのではと思い、使い始めた
- Hecatoncheirはデータソースからデータを収集してプロファイリング、カタログ化し、データ品質の監視などをしたりするツールになる
- クライアントと12cの通信がうまくいかなかったので、RDS for Oracleを使うようにした
デモ
Docker hubからイメージを取得
docker runを使ってクライアントを実行する
サーバ側もdockerで実行することで取得したレポジトリのファイルを使ってツールが使えるようになる
Dockerfileでimageを作る
- Dockerイメージの開発は、ベースのイメージを決定してコンテナを起動し、環境構築のコマンドをdockerfileに記述してイメージを作るのがいいと思う
DBエンジニアのマイクロサービス入門~Oracle Database と Docker ではじめる API サービス~
吉田成利様 @miyosh0008様
マイクロサービス
- モノリシック・パターンというwebサーバ/APサーバ/DBの形でよくある
- APサーバを増やせばスケールしやすい
- しかし、規模が大きくなると、モジュールの境界があやふやになり、変更の影響が読めなかったり、一部分のみスケールが難しかったり、デプロイが難しかったりする
- マイクロサービスは各サービスを独立させて疎結合にさせる
- モジュールの境界が明白になり、独立してデプロイ・スケールができ、独立した運用管理ができる
- しかし、分散システムは複雑になりがち。
- 複数のサービスにまたがるアプリケーション開発、サービス間の通信の取り決めを考える必要がある
- 設計が難しい
Dockerとの関連性
- マイクロサービスのデプロイメントの一つの方法としてDockerがある
- Dockerが勧めてきたインフラコード化、Immutable Infrastructureといったコンセプトが非常にマイクロサービスと相性がいい
- RESTful API
- HTTPをフル活用してwebのリソースをシンプルに操作するための設計
- httpメソッドで操作、URLでリソースの名前を表す
- ステータスコードでAPI結果を返す
- APIサービスを設計するならユーザが必要としているリソース・操作を提供するのが大事
demo
- 社員管理のAPIサービスを作ってみたのでデモをしました
dockerで立ち上げ、nodeを動かしておく。
curlでapiを叩くと・・・
無事値が帰ってきました。
Dockerを今までふんわりとしか理解してませんでしたが、そんなDockerのイメージや使い方の雰囲気を掴められるような面白いセッションでした。
JPOUG Advent Calendar 2017の内容をdockerの内容に変えようかちょっと迷っています・・・
View Comments
Your article gave me a lot of inspiration, I hope you can explain your point of view in more detail, because I have some doubts, thank you.
Thanks for sharing. I read many of your blog posts, cool, your blog is very good.
Thank you for your sharing. I am worried that I lack creative ideas. It is your article that makes me full of hope. Thank you. But, I have a question, can you help me?