Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

そろそろ知っておきたい!!コンテナ技術と Dockerのキホン

15,330 views

Published on

NTT-AT社内で定期的に実施している勉強会(CORETECH技術講習会)で発表した資料です。

Published in: Technology
  • Be the first to comment

そろそろ知っておきたい!!コンテナ技術と Dockerのキホン

  1. 1. そろそろ知っておきたい!! コンテナ技術と Dockerのキホン NTTアドバンステクノロジ株式会社 アプリケーションソリューション事業本部 長住 直樹
  2. 2. 自己紹介  長住 直樹(ながずみ なおき)/ Twitter @nk_ngzm  NTTアドバンステクノロジ株式会社 アプリケーションソリューション事業本部  社内で技術者育成活動(通称:CORETECH)を推進しています。
  3. 3. Linux Container Linuxカーネルが持つ機能を 使って実現するコンテナ。 略して、LXCと表記することもある。
  4. 4. ここで、VMのおさらい VMは、コンピュータの上で動くOSやVMを実現するためのハイパーバイザの上で、実際 のハードウェアをエミュレートするVMが動きます。つまり実際の物理的なコンピュータ と同じようなものがソフトウェアによって実現されているので、このVMを使うにはOS が必要になります。つまり、物理的なコンピュータ上で動くOSの上でさらにOSが動き ます。 引用: http://gihyo.jp/admin/serial/01/linux_containers/0002
  5. 5. 対してコンテナの原理 起動する全てのプロセスはコンピュータ上にインストールされたOS(ホストOS)上で 直接起動します。通常のプロセスの動作と異なるのは、そのプロセスの一部をグループ 化し、他のグループやグループに属していないプロセスから隔離した空間で動作させる 点です。貨物輸送のコンテナのように、隔離された空間にプロセスが入っているので、 この空間を『コンテナ』と呼ぶわけです。実際のコンテナのように、あるコンテナの内 部から他のコンテナの内部を見ることはできません。 引用: http://gihyo.jp/admin/serial/01/linux_containers/0002
  6. 6. コンテナを実現するカーネル機能 名前空間とも呼ばれ、マウント、ホスト・ドメイン名、プロセス空間、ソケットや メッセージキューの空間、ユーザ・グループ、ネットワークなどの名前空間ごとに 識別・隠蔽できる機能。例えば、マウント名前空間を使うと、名前空間内で行った マウント操作を他の名前空間には反映させないといったことができる。すなわち, コンテナ内でマウント操作を行った場合、そのマウントはホストOSや他のコンテ ナからは見ない。 名前空間の名前 隔離されるリソース 実装されたカーネル バージョン マウント名前空間 マウントの集合,操作 2.4.19 UTS名前空間 ホスト名,ドメイン名 2.6.19 PID名前空間 プロセスID(PID) 2.6.24 IPC名前空間 SysV IPCオブジェクト,POSIXメッセージキュー 2.6.19 ユーザ名前空間 UID,GID 3.8 ネットワーク名前空間 ネットワークデバイス,アドレス,ポート,ルーティ ングテーブル,フィルタなど 2.6.26
  7. 7. コンテナを実現するカーネル機能 「Control Group」の略。プロセスをグループ化して,そのグループ内に存在する プロセスに対して、たとえば、CPUやメモリなどのリソースに制限を行うなど、グ ループ単位のリソース管理が行える機能。 サブシステム 機能 blkio ブロックデバイスの入出力アクセスを制御 (Read <= N bytes/sec) cpu スケジューラにより CPU のアクセスを制御 cpuset マルチコアの場合に利用する CPU, メモリノードを制御 devices デバイスへのアクセス制御 freezer 処理の一時停止, 再開 memory メモリリソースの制御 hugetlb N byteまでとかの制限 net_cls Linux トラフィックコントローラ (tc) がパケットを識別できるよう, クラス識別子 (classid) によりネットワークパケットにタグをつける net_prio NIC 別にトラフィックのプライオリティを設定する
  8. 8. コンテナを実現するカーネル機能 ルートディレクトリを、任意の特定のディレクトリに変更できる機能。 chroot 内で起動されるプロセスは、設定された任意の場所をルートディレクトリ として動作するため、その範囲外のディレクトリやファイルへは一切アクセスでき なくなる。 / libbin usr homeetc bin lib chroot → / etc usr
  9. 9. コンテナを実現するカーネル機能 netns(Linux Network Namespace)は、ホストサーバ内に、仮想的ブリッジ 「br0」と、「veth」と呼ばれる直結した仮想NICのペアからなる仮想ネットワー クを構築する。コンテナ毎に独立した veth が生成され、その片側をコンテナ内部 のイーサネット「eth0」として割り当てる。 引用 : http://www.school.ctc-g.co.jp/columns/nakai/nakai41.html
  10. 10. デモ(その1) chroot を使ったルートファイルシステムの隔離
  11. 11. chroot / libbin usr demoetc bin lib chroot → / etc usr
  12. 12. chroot  新たな ルートディレクトリの作成  bashの動作に最低限必要な環境を新たな ルートディレ クトリ配下にコピー  新たなルートディレクトリでbashを動かす $ sudo mkdir -p /demo/chroot $ sudo cp -pr /bin /lib /lib64 /usr /etc /demo/chroot/ $ sudo chroot /demo/chroot /bin/bash
  13. 13. LXC Linuxカーネルの機能のみを用いてコンテナの操作 を行うソフトウェアとして、2008年ごろから linuxcontainers.orgで 開発されている。 Linuxカーネルにパッチを当てたりすることなく、 カーネルに実装されているコンテナに関する機能 を前提にして簡単にコンテナの操作が行える。
  14. 14. Container と LXC LXCという用語は以下の2つの意味で使われることがある。 I. Linuxカーネルが持つ機能を使って実現するコンテナ という一般的な意味で使う場合 II. linuxcontainers.org で開発されているコンテナを扱 うためのソフトウェアという狭い意味 本講習会では、前者の意味では「Container/コンテナ」、 後者の意味では「LXC」と区別して説明する。
  15. 15. ちなみに、LXC以外には? LXC以外の代表的なコンテナ方面のソフトウェア。 Linuxカーネルにコンテナ関連の技術が充分に実装されていない頃から、カーネルにパッチを当 ててコンテナを実現してきた本分野のパイオニア的ソフトウェア。現在Linuxカーネルに実装さ れているコンテナ機能にはOpenVZ由来のものが数多くある。なお、これをベースとした商用 ソフト「Virtuozzo」は、現在でも、世界中のホスティングサービスで広く使われている。 Cloud Foundry というPaaSを構築できるソフトウェアで、その心臓部といえるコンテナ機能 を提供するコンポーネント。 主に、Linux kvm サーバ仮想化環境を管理するツールであるが、Linuxコンテナにも対応して いる。
  16. 16. デモ(その2) LXCを使用したコンテナの利用
  17. 17. LXCの利用条件 LXCのインストールには、ubuntu OSがお勧め、 出来る限り ubuntu14.04 以降のバージョンを使 用すること。 centos など RedHat系OSにもインストールでき るようであるが、ubunutに比べて環境設定が激し く面倒くさい。(インストーラでいろいろやってくれない) LXCは、root ユーザで操作する必要がある。
  18. 18. デモ環境  ホスト ubuntu 14.0.4 trusty / 64bit Kernel 3.13.0-48-generic  lxc version 1.0.7-0ubuntu0.1
  19. 19. LXC インストール  ubuntuの場合、以下のコマンド一発でインストールが 終わる。  ubuntu01という名前でubuntuベースのコンテナ作成 ※ 社内ネットワークを経由する場合は、別途Proxy設定が必要。 $ sudo apt install lxc $ sudo lxc-create -t ubuntu -n ubuntu01
  20. 20. LXCでコンテナ作成 LXCコンテナは、仮想マシンのようにDVDなどのISOイ メージからインストールすることはできない。 従って、LXCには、コンテナを作成するためのスクリプト としてテンプレートが付属しており、テンプレートを使っ て、コンテナイメージを作成する。 また、 lxc-downloadという名前のテンプレートが付属し ており、あらかじめ構築されたコンテナイメージをLXCの サイトからダウンロードしてコンテナを作成することも可 能である。
  21. 21. コンテナ起動と停止  ubuntu01 という名前のコンテナを起動  起動したコンテナに接続(その1)  起動したコンテナに接続(その2)  起動したコンテナを停止 $ sudo lxc-start -n ubuntu01 -d $ sudo lxc-attach -n ubuntu01 $ sudo lxc-stop -n ubuntu01 $ sudo lxc-console -n ubuntu01
  22. 22. その他の基本操作  作成したコンテナの一覧を見る  ubuntu01 という名前のコンテナの情報を見る $ sudo lxc-ls ubuntu01 $ sudo lxc-ls -f NAME STATE IPV4 IPV6 AUTOSTART --------------------------------------------- ubuntu01 RUNNING 10.0.3.18 - NO $ sudo lxc-info -n ubuntu01 Name: ubuntu01 State: RUNNING PID: 26948 ... ...
  23. 23. その他の基本操作  ubuntu01コンテナをubuntu02という名前でクローン  ubuntu02 という名前のコンテナを削除 その他、メモリやCPU、ディスクなどのコンテナ・リソー スを制御するコマンド(lxc-cgroup)などがある。 $ sudo lxc-clone -o ubuntu01 -n ubuntu02 $ sudo lxc-destroy -n ubuntu02
  24. 24. 入門編
  25. 25. Docker 「Docker」は、米国 Docker社(旧dotCloud)が開 発するオープンソースのコンテナ管理ソフトウェ アのひとつ。Go言語で実装されている。 軽量な仮想化環境であるコンテナを提供し、アプ リケーション実行環境をそのまま Dockerイメー ジとして保存できる。
  26. 26. Docker 仮想サーバではなくアプリケーションに最適化さ れているため、原則的に、ひとつのコンテナに、 ひとつのアプリケーションが実行する構成となる。 さらに、Dockerは、ネットワーク、ストレージ、 ロギング、ディストリビューションなどマシン特 有の設定を抽象化しているため、どんなマシンへ も、どんな構成でも実行でき、ポータブルデプロ イを実現できる。
  27. 27. LXCとDocker もともとDockerは、 LXCを経由してLinuxコ ンテナ機能を利用して いた。 Docker Ver0.9 より、 libcontainer という独 自のライブラリを経由 するように改良。 現在でもオプションで LXCを選択することが可 能。 引用 : https://blog.docker.com/2014/03/docker-0-9-introducing-execution-drivers-and-libcontainer/
  28. 28. AUFS AUFS(Another Union FS)とは、レイヤ構造の ファイルシステムである。 親のファイルシステムをリード・オンリーとし、 その上にライタブルなレイヤを重ねていく。 こうして複数のレイヤを積み重ね、レイヤを通じ て、ひとつのファイルシステムのように扱う。 親コンテナからの差分管理ができるため、コンテ ナイメージの容量を軽量化できる。
  29. 29. AUFS 親コンテナか らの差分管理 ができるため、 コンテナイ メージの容量 を軽量化でき る。 引用 : http://gesellix.github.io/gradle-summit-2014/
  30. 30. DockerイメージとDockerコンテナ Dockerイメージとは、Docker コ ンテナ生成のベースとなるひな形。 代表的な例として ubuntu や centos 等のディストリビュー ションがイメージ化されている。 Dockerコンテナとは、ある Dockerイメージをベースにして 個別アプリケーションの環境を セットアップして作成するコンテ ナ実行環境。 Docker コンテナ Docker イメージ Docker イメージ docker run docker commit
  31. 31. Docker Hub Docker社は、Docker Hub というクラウド上のリポジトリ を提供しており、様々な団体や個人が作成した Dockerイ メージを利用したり、自分で作成したイメージを共有する ことが可能。 https://hub.docker.com/ Docker コンテナ Docker イメージ Docker イメージ docker run docker commit docker pull docker push
  32. 32. デモ(その3) Dockerの基礎的な利用方法
  33. 33. Docker の利用条件 Docker をインストールできる環境は、 Red Hat 系 OS もしくは ubuntu系 OS であること、およ び 64bitマシン+OS であること。 カーネルが古いとうまく動作しないので、インス トール前に 最新バージョンにアップ・トゥ・デー トしておくこと Dockerは、root ユーザ で操作する必要がある。
  34. 34. デモ環境 ホスト cnetos 6.6 / 64bit Kernel 2.6.32-504.el6.x86_64 docker version 1.4.1, build 5bc2ff8/1.4.1
  35. 35. Docker インストール  centos 6.6 へインストール  centos 6.6 で自動起動設定(必要に応じて) ※ 社内ネットワークを経由する場合は、別途Proxy設定が必要。 $ sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6 $ sudo yum -y install ¥ http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm $ sudo yum install docker-io $ sudo chkconfig docker on
  36. 36. Docker インストール  centos 7系 へインストール  centos 7系 で自動起動設定(必要に応じて) ※ 社内ネットワークを経由する場合は、別途Proxy設定が必要。 $ sudo yum install docker $ sudo systemctl enable docker.service
  37. 37. Docker インストール  ubuntu 14.04 LTS へインストール  ubuntu 14.04 LTS で自動起動設定(必要に応じて) ※ 社内ネットワークを経由する場合は、別途Proxy設定が必要。 $ sudo apt install docker.io $ sudo update-rc.d docker.io defaults
  38. 38. Docker イメージ取得  centos 最新版のDockerイメージをDL  ubuntu 最新版のDockerイメージをDL  ubuntu 12.04 DockerイメージをDL $ sudo docker pull ubuntu:latest $ sudo docker pull ubuntu:12.04 $ sudo docker pull centos:latest ※社内ネットワークを経由する場合は、別途 DNSサーバの設定と Proxy設定が必要。
  39. 39. Docker イメージ管理  Dockerイメージの一覧表示  DLした ubuntu 12.04 イメージを削除 $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos latest 214a4932132a 40 hours ago 229.6 MB ubuntu latest d0955f21bf24 3 weeks ago 192.7 MB ubuntu 12.04 9c5e4be642b7 3 weeks ago 132.1 MB $ sudo docker rmi ubuntu:12.04 $ sudo docker rmi [IMAGE ID で指定することも可能]
  40. 40. Docker コンテナ生成+起動  centos 最新版イメージから centos01という名 前でコンテナを作成、そして、アプリケーショ ンに bash を指定して実行する  Dockerコンテナ centos の bash に入る  Dockerコンテナの bash を exit するとコンテナ自体も終了する $ sudo docker run -i -t --name centos01 centos:latest /bin/bash [コンテナ内のbashでいろいろ操作] ... ... # exit (bash を exit)
  41. 41. Docker コンテナ生成+起動  ubuntu 最新版イメージから ubuntu01 という 名前でコンテナを作成、同じくアプリケーショ ンに bash を指定して実行  Dockerコンテナ ubuntu の bash に入る  コンテナの bash を exit するとコンテナも終了する $ sudo docker run -it --name ubuntu01 ubuntu /bin/bash
  42. 42. Docker コンテナ生成+起動  docker run コマンド書式 # docker run ¥ [オプション] ¥ [--name コンテナ名] ¥ イメージ名 [:タグ名] ¥ [コンテナで実行するコマンドとその引数]
  43. 43. Docker コンテナ生成+起動  docker run の主なオプション option 説 明 -d コンテナをバックグラウンドで実行する。 WebサーバやDBサーバなど、デーモン系のプロセスを常時実行す るコンテナの場合に指定する。 -i コンテナの標準入力を開く。 /bin/bashなどでコンテナを対話で操作する場合に指定する。 -t 端末デバイス(tty)を確保する。-iと同時に使用することが多い。 /bin/bashなどでコンテナを対話で操作する場合に指定する。 -p "-p ホスト側ポート:コンテナ側ポート" で、Dockerサーバとホス トサーバ間のポートマッピングを構成する
  44. 44. Docker コンテナ生成+起動 Docker は、仮想サーバではなくアプリケーションに最適化されているため、 原則的に、ひとつのコンテナに、ひとつのアプリケーションが実行する構成と なる。 すなわち、Dockerは、docker run で作成 したコンテナ内で、同コマンドで指定する ひとつの アプリケーションを実行する。 指定したアプリケーションが exit すると同 時にそのDockerコンテナも 停止 する。
  45. 45. デタッチ/アタッチ  centos02コンテナを作成してbashを起動  Dockerコンテナをデタッチ  Dockerコンテナにアタッチ  再び、Dockerコンテナに入る  bash を exit でコンテナを終了 $ sudo docker run -it --name centos02 centos:latest /bin/bash コンテナ内で [Ctrl] + [p] → [Ctrl] + [q] キーを押下 $ sudo docker attach centos02
  46. 46. Docker コンテナ管理  既存コンテナ centos02 を再起動  docker start コマンド書式 $ sudo docker start –i centos02 # docker start [-i] {コンテナ名|コンテナID} option 説 明 -i コンテナの標準入力を開く。 /bin/bashなどでコンテナを対話で操作する場合に指定する。
  47. 47. Docker コンテナ管理  Docker コンテナ一覧(動いているものだけ)表示  止まってるものを含め全部の一覧 $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0e9b0b2759ec centos:latest "/bin/bash" 4 minutes ago Up 50 seconds centos02 $ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0e9b0b2759ec centos:latest "/bin/bash" 6 minutes ago Up 3 minutes centos02 1352f3ef1c8b ubuntu:latest "/bin/bash" 11 minutes ago Exited (0) 11 minutes ago ubuntu01 cc8c0601370d centos:latest "/bin/bash" 13 minutes ago Exited (0) 12 minutes ago centos01
  48. 48. Docker コンテナ管理  起動中の centos02コンテナを停止  Docker コンテナの削除 $ sudo docker stop centos02 $ sudo docker stop [container ID で指定することも可能] $ sudo docker rm centos02 $ sudo docker rm [container ID で指定することも可能]
  49. 49. カスタム Docker イメージ作成 Docker コンテナ Docker イメージ Docker イメージ docker run docker commit Docker コンテナ docker run httpd install httpd 起動 with httpd
  50. 50. カスタム Docker イメージ作成  centos03 コンテナを作成して bashで起動  Dockerコンテナのシェルに入る  centos03コンテナに httpd をインストール  Ctrl+p+q で Dockerコンテナをデタッチ [コンテナ内のbashで操作] # yum install -y httpd $ sudo docker run -it --name centos03 centos:latest /bin/bash ※社内ネットワークを経由する場合は、コンテナ内部のサーバに対する Proxy設定が必要。
  51. 51. カスタム Docker イメージ作成  centos03 コンテナを停止  Apache をインストールした centos03 コンテ ナから「hoge/httpd」という名前の新たな Dockerイメージを作成 $ sudo docker stop centos03 $ sudo docker commit centos03 hoge/httpd
  52. 52. カスタム Docker イメージ作成  docker commit コマンド書式 # docker commit ¥ {コンテナ名|コンテナID} ¥ [ユーザ名/]イメージ名
  53. 53. カスタム Docker イメージ作成  docker imagesで、作成したイメージを確認 $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE hoge/httpd latest 140390d72115 13 seconds ago 311.2 MB centos latest 0114405f9ff1 6 hours ago 229.6 MB ubuntu latest d0955f21bf24 3 weeks ago 192.7 MB
  54. 54. カスタム Docker イメージ作成  作成した hoge/httpd イメージを元に、web01 というコンテナを作成、バックグラウンドモー ドで起動する  docker ps で起動確認  ホストの8080ポートにアクセスしてテスト! $ curl localhost:8080 $ sudo docker run -d -p 8080:80 --name web01 ¥ hoge/httpd /usr/sbin/httpd -D FOREGROUND
  55. 55. Docker コンテナ管理  バックグラウンドで起動中の web01コンテナに接続  バックグラウンドで起動中の web01コンテナを停止 $ sudo docker exec -it web01 /bin/bash $ sudo docker stop web01 $ sudo docker stop [container ID で指定することも可能]
  56. 56. Docker Hub でイメージ共有  Docker Hub のアカウントを作成  Docker Hubにログイン  Docker Hub に先ほど作成した「hoge/httpd」 イメージをPUSH $ sudo docker login $ sudo docker push hoge/httpd https://www.docker.com/
  57. 57. 実践編
  58. 58. Dockerfile Dockerには、Dockerコンテナ の構成情報をテキスト形式で記 述できる「Dockerfile」という 仕様がある。 そして、Dockerfile を解釈し Dockerイメージを作成する 「docker build」コマンドが用 意されている。 Dockerfile docker build Docker イメージ
  59. 59. Dockerfile FROM ubuntu MAINTAINER hoge<hoge@sample.net> RUN apt-get install -y httpd EXPOSE 80 CMD ["httpd", "-D" "FOREGROUND"] ① ubuntu(latest)をベースとする ② 管理者はhoge <hoge@sample.net> ③ httpdをインストール ④ ポート80番をオープン ⑤ httpdサーバをフォアグランドに起動(上書き可能) 以上の手順が実行された Docker イメージを作成
  60. 60. Dockerfile コマンド 意味 FROM 元となるDockerイメージの指定 MAINTAINER 作成者の情報 RUN コマンドの実行 ADD ファイル/ディレクトリの追加 CMD コンテナーの実行コマンド 1 ENTRYPOINT コンテナーの実行コマンド 2 WORKDIR 作業ディレクトリの指定 ENV 環境変数の指定 USER 実行ユーザーの指定 EXPOSE ポートのエクスポート VOLUME ボリュームのマウント
  61. 61. Dockerイメージのビルド  Dockerfile をビルドし hoge/ubu:1.0 という Dockerイメージを生成 $ cd [Dockerfileがあるディレクトリ] $ sudo docker build –t hoge/app:1.0 ./ Dockerfile docker build Docker イメージ hoge/app:1.0
  62. 62. Dockerイメージのビルド  docker build 書式 # docker build ¥ [-t ユーザ名/イメージ名[:タグ名]] ¥ Dockerfile格納ディレクトリ
  63. 63. 引用 : http://www.slideshare.net/durdn/be-a-better-developer-with-docker Dockerイメージのビルド
  64. 64. Data Volume 複数のコンテナ間で永続的なデータや共有データ を扱うための特別なヴォリューム (ディレクトリ)。 Data Volume に対する変更は直接反映され、イ メージの変更に含まれない。 Data Volume は参照するコンテナがなくなって も存続する。
  65. 65. Data Volume ホストとのヴォリューム共有 引用 : http://www.slideshare.net/durdn/be-a-better-developer-with-docker
  66. 66. Data Volume  ホストの /opt/test-app/ をコンテナの /app と してマウントさせる $ sudo docker run -it -v /opt/test-app:/app ubuntu /bin/bash ホスト側 マウントされるディレクトリ コンテナ側 マウントディレクトリ
  67. 67. Data Volume Container コンテナ間のヴォリューム共有 引用 : http://www.slideshare.net/durdn/be-a-better-developer-with-docker -v /var/volume1 -v /var/volume2 Data Volume Container
  68. 68. Data Volume Container  /var/volume を共有するデータボリュームコン テナを生成+起動する  上記コンテナの /var/volume を共有するコン テナを生成+起動する $ sudo docker run -it -v /var/volume --name vol1 ubuntu /bin/bash $ sudo docker run -it --volumes-from vol1 ubuntu /bin/bash FROM ubuntu ... ... VOLUME ["/var/volume"] CMD ["/bin/bash"]
  69. 69. Data Volume Container ユーザデータなど、壊せない情報の格納場所とし て Data Volume Container を利用する。 Webサーバ コンテナ APサーバ コンテナ DBサーバ コンテナ Data Volume コンテナ ログ保存先 Volume DB データ格納 Volume
  70. 70. ネットワークポートマッピング コンテナを起動するときに、コンテナ内部で使用 するポートを、任意のホスト側ポート番号 (49152以降推奨)に割り当てることができる。 ホスト側のポート番号は、49000 ~ 49900 の 範囲で自動的にランダムな番号を割り当てたり、 ユーザが任意の番号を指定したりすることが可能。 ホスト コンテナ IP :X PORT:X IP :Y PORT:Y ポート マッピング
  71. 71. ネットワークポートマッピング  コンテナ内でオープンしているポートをホスト 側ランダムなポート番号にマッピング  コンテナのポート22がホストのどのポートに マッピングされたか知る方法 $ sudo docker run -d -P ubuntu:latest /usr/sbin/sshd -D $ sudo docker port [コンテナID] 22 $ sudo docker run -d -p 22 ubuntu:latest /usr/sbin/sshd -D
  72. 72. ネットワークポートマッピング  コンテナのポート22をユーザが指定するホスト 側ポート番号2222にマッピング $ sudo docker run -d -p 2222:22 ubuntu:latest /usr/sbin/sshd -D ホスト コンテナ IP :X PORT:2222 IP :Y PORT:22 ポート マッピング ホスト側ポート コンテナ側ポート
  73. 73. コンテナ・リンク 複数のコンテナ間で、専用のネットワークを構築 することができる。 コンテナA (コンテナBに接続) コンテナB (リンク元)
  74. 74. コンテナ・リンク  リンク元のコンテナA  コンテナAに接続するコンテナB $ sudo docker run –d --name pg ubuntu:latest postmaster -D /usr/local/pgsql/data $ sudo docker run -d --link pg:db ubuntu:latest /someService コンテナB 環境変数 DB_PORT_5432_TCP_ADDR=172.17.0.2 DB_PORT=tcp://172.17.0.2:5432 DB_5432_TCP=tcp://172.17.0.2:5432 DB_PORT_5432_TCP_PORT=5432 /etc/hosts 172.17.0.2 db
  75. 75. デモ(その4) Dockerを使用した 書籍管理アプリケーション実行環境構築
  76. 76. デモ環境 ホスト cnetos 6.6 / 64bit Kernel 2.6.32-504.el6.x86_64 docker version 1.4.1, build 5bc2ff8/1.4.1 基本編と 同じ環境
  77. 77. ホストサーバ Data Volume 完成イメージ APサーバ コンテナ Tomcat DBサーバ コンテナ postgresql データベース ファイル ログ ファイル ポート フォワード 8080:8080 コンテナ リンク DB接続 利用者 簡易版書籍管理 アプリケーション
  78. 78. Data Volume DBサーバ構築 postgreSQL 構築用 Dockerfile docker build PostgreSQL Dockerイメージ hoge/postgres:1.0 DB初期化用 コンテナ データベースファイル PostgreSQL 実行コンテナ DBファイル 初期化
  79. 79.  DBサーバのDockerfile DBサーバ構築 FROM centos:latest MAINTAINER hoge <hoge@mail.jp> # postgerSQL セットアップ RUN yum -y install postgresql-server # PORT 開放 EXPOSE 5432 # コンテナ実行コマンド CMD su - postgres -c "postgres -D /var/lib/pgsql/data"
  80. 80.  DBサーバイメージ(hoge/postgres)ビルド  Data Volume を格納するディレクトリをホスト に作成 DBサーバ構築 $ sudo docker build -t hoge/postgres:1.0 [dockerfile格納DIR] $ sudo mkdir -p /docker_mnt/pgsql/data
  81. 81. DBサーバ構築  Postgresql初期セットアップ用コンテナ起動  Postgresqlの初期セットアップ $ sudo docker run -it --rm ¥ -v /docker_mnt/pgsql/data:/var/lib/pgsql/data ¥ hoge/postgres:1.0 /bin/bash [コンテナ内のbashで操作] # chown -R postgres:postgres /var/lib/pgsql/data # su - postgres $ initdb --encoding=UTF8 --no-locale $ pg_ctl -D /var/lib/pgsql/data start $ psql・・ 必要に応じてDBオブジェクトを構築し当該コンテナを終了 PostgreSQL初期セットアップは、Data Volumeに格納されるデータベースファイルを作成するものである。 このため、本作業は最初に一度だけ行えば良い。
  82. 82. DBサーバ構築  DBサーバコンテナ生成してPostgrrSQLを起動 $ sudo docker run -d ¥ -v /docker_mnt/pgsql/data:/var/lib/pgsql/data ¥ -p 5432:5432 --name db01 hoge/postgres:1.0 実行コマンドの指定がない場合 Dockerfile の CMD で定義した コマンドが起動する
  83. 83. Data Volume APサーバ構築 Tomcat 構築用 Dockerfile docker build Tomcat Dockerイメージ hoge/tomcat:1.0 ログファイル Tomat 実行コンテナ
  84. 84. APサーバ構築  APサーバのDockerfile FROM centos:latest MAINTAINER hoge # Tomcat セットアップ RUN yum -y install tomcat RUN echo 'export CATALINA_BASE="/usr/share/tomcat"' >> /root/.bashrc # Tomcat 起動スクリプトをコピー ADD tomcat_start.sh /usr/bin/ RUN chmod a+x /usr/bin/tomcat_start.sh # 書籍管理アプリをデプロイ ADD bookmgr.war /usr/share/tomcat/webapps/ # PORT 開放 EXPOSE 8080 # コンテナ実行コマンド ENTRYPOINT ["/usr/bin/tomcat_start.sh"]
  85. 85. APサーバ構築 (参考)tomcat_start.sh #! /bin/bash export CATALINA_BASE="/usr/share/tomcat" /usr/sbin/tomcat start trap '/usr/sbin/tomcat stop; sleep 2; exit 0' TERM while : do sleep 1 done
  86. 86. APサーバ構築  APサーバイメージ(hoge/tomcat)ビルド  Data Volume を格納するディレクトリをホストに作成 $ sudo docker build -t hoge/tomcat:1.0 [dockerfile格納DIR] $ sudo mkdir -p /docker_mnt/tomcat/logs $ sudo chmod a+w /docker_mnt/tomcat/logs
  87. 87. APサーバ構築  APサーバコンテナを生成、Tomcat を起動 $ sudo docker run -d ¥ -v /docker_mnt/tomcat/logs:/usr/share/tomcat/logs ¥ -p 8080:8080 --link db01:db ¥ --name ap01 hoge/tomcat:1.0 Dockerfile の ENTRYPOINTで定義した 起動コマンドは docker run で別のコマン ドに変更することができない。
  88. 88. 活用のススメ
  89. 89. Docker の利点  コンテナなのでオーバヘッドが少なく、動作が軽い  コンテナイメージを手軽にやり取りできる  コンテナは様々な環境で等しく動く  各コンテナは、いろいろなディストリビューションや バージョンで構成できる  コンテナ(インフラ)をコードで表現できる
  90. 90. 利点を生かすためには  コンテナ内で動くアプリケーションは、できる だけシンプルなものであること。  複数のコンテナで動く、アプリケーションはで きるだけ疎結合に連携すること。  各アプリケーションは、ステートレスな作りで あること。  ユーザデータなどの保存先は分離できること。
  91. 91. マイクロ・サービス ひとつのアプリケーションを、大きな一枚岩の塊ではなく、 複数の軽量なサービスを連携させたアーキテクチャで実現 する。 各サービスはそれぞれのプロセスで動き、サービス間の メッセージは、HTTP経由でAPI呼び出しされるか、 RabbitMQやZeroMQといった軽量メッセージングシステ ムによる通信で交換される。 サービスごとに言語やデータベースなどは統一されず、個 別に適切なものが選択される。また、サービスごとにデー タを持ち、統合されていない。
  92. 92. どんなシステムに使えるか  すでにWeb関連サービス では主流になりつつある。 2014年5月の段階で『自社のサービスは全てDocker のようなコンテナで動い ており、旧来の仮想マシンは使用していない』と発表。  近い将来、科学技術計算、情報通信、製造、流通など 様々な分野での活用が予想されるが、うまく活用するた めには、シンプルで小さなアプリケーションであること が重要。 複雑で大きなモジュールの塊から、疎結合で自律的な小 さなアプリケーション群を連携させるマイクロサービス へ転換できるかどうかが鍵!!
  93. 93. 商用として利用できますか?  Yes! 既にWeb系のサービスはコンテナの活用 が進んでいる。  しかし、他のオープンソース同様、何か問題が あった場合は、自分たちで解決する必要がある。  製品に詳しい技術者の育成が重要。
  94. 94. なにから始めるか
  95. 95. 社内 Docker リポジトリ 結合試験環境1系 結合試験環境2系 Docker活用のススメ 開発環境 (開発PC) アプリケーション コンテナイメージ ステージング環境 アプリケーション コンテナイメージ アプリケーション コンテナイメージ アプリケーション コンテナイメージ アプリケーション コンテナイメージ
  96. 96. 社内 git/svn リポジトリ 結合試験環境1系 Docker活用のススメ 開発環境 (開発PC) アプリケーション コンテナイメージ Dockerfile Dockerfile 結合試験環境N系 アプリケーション コンテナイメージ
  97. 97. 自動テスト環境 社内 git/svn リポジトリ 結合試験環境1系 Docker活用のススメ 開発環境 (開発PC) アプリケーション コンテナイメージ アプリケーション コンテナイメージ Dockerfile Dockerfile CIサーバ Jenkins 社内 Docker リポジトリ アプリケーション コンテナイメージ 結合試験環境N系 アプリケーション コンテナイメージ
  98. 98. コンテナとは、 CPUやメモリ、プロセス空 間、ディスク、ネットワークなどを隠蔽す るOS(Linuxカーネル)が持つ機能を使っ て実現している。 コンテナを簡単に使えるようにしたツール のひとつにLXCがある。
  99. 99. Docker は、LXCを拡張してコンテナを更に 簡単に扱えるようにしたツール。 Docker Hubというリポジトリを経由すると、 インターネットを介して、コンテナをポー タブルにできる。 Dockerfile という形式で、サーバインフラ をコード化することができる。
  100. 100. Docker をうまく活用するには、それなりの アーキテクチャを検討する必要がある。 つまり、疎結合で自律的な小さなアプリ ケーション群を連携させるマイクロサービ ス型アーキテクチャであることが重要。
  101. 101. Docker は、主要なベンダを巻き込みながら、 非常に影響力の大きなエコシステムを構築 しており、今後ますます発展することが見 込まれる。 まずは、開発業務や検証業務での活用をお 勧め。
  102. 102. ぜひ自分でも Docker を インストールしてさわっ て見て下さい!!
  103. 103. これを機会に、複数 の Docker使い が誕 生することを期待し ています
  104. 104. 期待しています
  105. 105. おしまい ご静聴ありがとう ございました

×