O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

Docker入門: コンテナ型仮想化技術の仕組みと使い方

59.700 visualizações

Publicada em

Docker の特徴と使い方、簡単なネットワークの仕組みとコンテナ間の連携方法、及び3階層モデルの構築例などを記載しています。

Publicada em: Engenharia

Docker入門: コンテナ型仮想化技術の仕組みと使い方

  1. 1. Docker 入門 コンテナ型仮想化技術の仕組みと使い方 Cisco Systems, Japan TAC 伊藤 裕一 (twitter: @yuichi110) 第二回 ネットワークプログラマビリティ勉強会, Dec 16 2014
  2. 2. 自己紹介 • 伊藤裕一 (twitter: @yuichi110 ) • Docker : 仕事ではなく個人での利用 (VPSの数を減らすため) @interop2014 • 仕事: Cisco Japan TAC でデータセンタスイッチ Nexus と SDN 関連技 術の障害対応業務に従事。時々、趣味で得た知識で開発系やインフラ系 の社内トレーニングを実施したり、データセンタやSDN関連のSEさん の外部講演の手伝いをしています。 • 略歴: 学生時代はオーバーレイネットワークの研究に従事(特殊なマルチ パス通信を行うルータの開発など)。Cisco に入社後は昼はカスタマー サポート、夜は個人プログラマという生活。障害調査ツール等を作って 一部公開してます。(https://supportforums.cisco.com/ja/document/ 12270086)。2009年度のIPA未踏OB, Cisco CCIE, RedHat RHCE, Oracle Java Gold. • 趣味: プログラミング及び開発全般、登山と温泉。 Docker 入門 2
  3. 3. 最近作ったサービス「ゆくも」の宣伝 • 人口音声合成のサービスを2014年10月に開始。http://www.yukumo.net • 内部アーキテクチャの解説。激安のHA構築法をテーマにインフラを設計 Docker 入門 3 https://supportforums.cisco.com/ja/blog/12344671 WEBで人口音声の合成「ゆくも」アーキテクチャ全体図
  4. 4. 今日のお題 Docker 入門 • 話すこと - そもそもDocker って何 ? - なぜ Network Engineer が Docker をやるか - 基本的な使い方や応用例 (ややネットワーク重視) ! • 話さないこと (次があれば是非) - Docker とその足回りの仕組み - 実環境でのDocker の運用法 4
  5. 5. Agenda Docker 入門 • Docker の概要 • 簡単な Docker の使い方 (デモ) • Docker のネットワークについて • 3階層のサービスの展開例 • まとめ • 補足資料 5
  6. 6. Docker ってそもそも何 ? • Linux で利用される仮想化技術の一つ • コンテナと呼ばれる仮想化技術を使う Docker 入門 6
  7. 7. コンテナ型の仮想化 • 完全仮想化(VMWareなど)とは異なり、OS の一部のみを仮想化 • Linuxのkernelの機能でリソースを分離し、Docker はそれを管理 • Kernel (with Docker) とコンテナの関係は JVM と Jar の関係に近い Docker 入門 7
  8. 8. Infrastructure as a Code • サーバーに変更を加え続けると複雑になり壊れても戻しにくい • Docker はゲストへの変更を「イメージ」としてバージョン管理 • イメージから作ったコンテナは複製や復旧を容易にできる Docker 入門 8 イメージ V1! (Code) イメージ V2! (Code) コンテナ化 変更成功 (保存したい) 変更失敗 (V2コンテナを作りなおせばOK) イメージ化 イメージV1の! コンテナ1 イメージV2の! コンテナ2
  9. 9. Docker の強み • 仮想化のオーバーヘッドが少ない Docker 入門 - CPU - Memory - ストレージ • 「コード」でインフラの構成を管理 - 状態の復元が簡単にできる - 他の環境にも簡単にデプロイできる - 同じ構成を自動で大量に作成できる Linpack(数値計算ライブラリ)を 使った演算(CPU)性能測定結果 An Updated Performance Comparison of Virtual Machines and Linux Containers より • 適度に環境を分離し、サーバーの複雑性を減らす 9 IBM Research Report
  10. 10. Network Engineer がなぜ Docker をやるか • コンテナが一般化したらネットワーク機器への接続を意識するこ とが必要になる(VM の vSwitchがそうであったように) • コンテナのオーケストレーションにはネットワークも必ず関わって くる。また、コンテナ型の仮想ネットワーク機器を触ることになる 可能性がある (Ambassador パターンなど) • コンテナがネットワーク機器の内部で使われる可能性がある(最近 の機器は Linux Kernel を使っていることが多い) • コンテナをツールとして利用することになる可能性がある Docker 入門 10
  11. 11. Agenda Docker 入門 • Docker の概要 • 簡単な Docker の使い方 (デモ) • Docker のネットワークについて • 3階層のサービスの展開例 • まとめ • 補足資料 11
  12. 12. Docker を構成するコンポーネント • Docker Client : Server に対して命令を与える • Docker Daemon (Server) : コンテナを実際に動かす Worker • Docker Repository : イメージを保存、管理 push image image Docker 入門 12 Client Daemon(本体) Repository container container image image CLIで命令 pull githubに似ているLinux
  13. 13. Docker コンテナの操作と状態の遷移 stopped shutdown 状態 タスク終了 (or stop) start Docker 入門 13 image running removed paused run rm pause unpause コンテナを破棄 suspend 状態 イメージ(雛形)から コンテナ(実体)を作成 commit new! image コンテナをイメージ化
  14. 14. Docker のイメージの取り扱いまとめ docker commit docker push Docker Repository! (イメージ保管場所) Image! (雛形) Docker 入門14 container! (実体) Docker file! (設計図) docker run docker pull docker build edit import 破棄 docker rmi
  15. 15. テスト環境 • OS: CentOS 6.5 (Mac上の仮想マシン) • Docker: 1.1.2 (Client も CentOS) Docker 入門 • レポジトリ: DockerHub 15 CentOSへのインストール手順 ! (1)EPELを登録しDockerをインストール # yum install -y epel-release # yum install -y docker-io ! (2) Dockerの起動と登録 # service docker start # chkconfig docker on 補足)Ubuntuへのインストール手順 ! # apt-get update # apt-get -y install docker.io
  16. 16. # OK, Let’s start demo !! Docker 入門 16 (いくつかのページを飛ばしますが、資料の順に進めます)
  17. 17. docker コマンドの利用 • Dockerコマンドの基本 : docker [オプション] コマンド [引数] Docker 入門 17 [root@localhost ~]# docker version Client version: 1.1.2 Client API version: 1.13 Go version (client): go1.2.2 Git commit (client): d84a070/1.1.2 Server version: 1.1.2 Server API version: 1.13 Go version (server): go1.2.2 Git commit (server): d84a070/1.1.2 • コマンドの詳細は本家の CLI リファレンスを参照してください https://docs.docker.com/reference/commandline/cli/
  18. 18. リポジトリ(DockerHub)へのログイン(省略) • パプリックリポジトリであるDockerHub への登録が必要 • プライベートなリポジトリの作成も可能 (割愛) Docker 入門 18 [root@localhost ~]# docker login Username: ######## Password: Email: ########@######## Login Succeeded !! [root@localhost ~]# docker info Containers: 19 .. Kernel Version: 2.6.32-431.el6.x86_64 Username: XXXXXXXX Registry: [https://index.docker.io/v1/]
  19. 19. イメージの検索 • ベースとなるイメージは DockerHub から取得することが多い • イメージの検索 : docker search [オプション] キーワード [root@localhost ~]# docker search ubuntu NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Official Ubuntu base image 994 [OK] dockerfile/ubuntu Trusted automated Ubuntu (http://www.ubunt... 34 [OK] ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 25 [OK] clue/ttrss The Tiny Tiny RSS feed reader allows you t... 21 [OK] crashsystems/gitlab-docker A trusted, regularly updated build of GitL... 21 [OK] .. Docker 入門 19 イメージの名前 公式: イメージ名のみ 非公式: ユーザー名/イメージ名 メジャー度合い 公式イメージか否か
  20. 20. イメージの取得 • リポジトリからの取得: docker pull [オプション] イメージ名 [:タグ] • pull しておかなくても run 時にダウンロードしてくる (ただし遅い) • ローカルレジストリのイメージの確認: docker images Docker 入門 20 [root@localhost ~]# docker pull ansible/ubuntu14.04-ansible Pulling repository ansible/ubuntu14.04-ansible 745e437a93a5: Pulling dependent layers 06b4dde722cc: Pulling dependent layers .. [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ansible/ubuntu14.04-ansible devel ce85429a2a86 Less than a second ago 445.1 MB ansible/ubuntu14.04-ansible 1.8 731ee0ca00c3 Less than a second ago 445.1 MB ansible/ubuntu14.04-ansible latest 34f599260e20 Less than a second ago 445.1 MB ..
  21. 21. イメージの実行 • docker run [オプション] イメージ名 実行するコマンド • 補足) CentOS上でUbuntuが動いているか念のために確認 Docker 入門 21 [root@localhost ~]# docker run ubuntu:14.04 echo "hello docker" hello docker ! [root@localhost ~]# docker run ubuntu:14.04 ping www.google.com PING www.google.com (74.125.235.243) 56(84) bytes of data. 64 bytes from kix01s02-in-f19.1e100.net (74.125.235.243): icmp_seq=1 ttl=127 time=65.3 ms 64 bytes from kix01s02-in-f19.1e100.net (74.125.235.243): icmp_seq=2 ttl=127 time=82.3 ms ^C --- www.google.com ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 65.388/73.876/82.365/8.492 ms [root@localhost ~]# cat /etc/issue CentOS release 6.5 (Final) Kernel r on an m ! [root@localhost ~]# docker run ubuntu:14.04 cat /etc/issue Ubuntu 14.04.1 LTS n l
  22. 22. コンテナのシェルに入って操作(省略) • コンテナをシェルで操作 : docker run -ti ubuntu:14.04 /bin/bash Docker 入門 22 (1) コンテナのシェルに入り hello.txt を作成し、コンテナを抜ける ! [root@localhost ~]# docker run -t -i ubuntu:14.04 /bin/bash root@604439e971e9:/# pwd / root@604439e971e9:/# echo hello > hello.txt root@604439e971e9:/# ls bin boot dev etc hello.txt home lib lib64 .. root@604439e971e9:/# exit exit !! (2) 新しいコンテナを立ち上げて、hello.txt の存在を確認する -> 存在しない ! [root@localhost ~]# docker run -ti ubuntu:14.04 /bin/bash root@cfa3e2757167:/# ls bin boot dev etc home lib lib64 .. root@cfa3e2757167:/# ※ 同一イメージでもコンテナが違えば別物
  23. 23. コマンドの help の確認方法(省略) • 引数が必要なコマンドを引数なしで呼ぶと help が出る • オプション -h を付けても確認ができる Docker 入門 23 [root@localhost ~]# docker search Usage: docker search TERM Search the Docker Hub for images ! --automated=false Only show automated builds --no-trunc=false Don't truncate output -s, --stars=0 Only displays with at least x stars !!! [root@localhost ~]# docker run -h Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container ! -a, --attach=[] Attach to stdin, stdout or stderr. -c, --cpu-shares=0 CPU shares (relative weight) --cidfile="" Write the container ID to the file --cpuset="" CPUs in which to allow execution (0-3, 0,1) -d, --detach=false Detached mode: Run container in the background, print new container id --dns=[] Set custom dns servers --dns-search=[] Set custom dns search domains -e, --env=[] Set environment variables ..
  24. 24. コンテナの状態確認 • コンテナの状態確認 : docker ps [オプション] • 状態確認だけでなくコンテナID を特定するのによく使う • デフォルトは停止中のコンテナは表示しない。-a オプションで表示 • -q オプションを使うと ID のみを出力。スクリプトで便利 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b9ecf98b6fcc ubuntu:14.04 /bin/bash 10 hours ago Up 10 hours db Docker 入門 24 !! [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3b129749222b centos:centos6 /bin/bash 35 seconds ago Exited (0) 10 seconds ago test b9ecf98b6fcc ubuntu:14.04 /bin/bash 10 hours ago Up 10 hours db !! [root@localhost ~]# docker ps -q b9ecf98b6fcc
  25. 25. コンテナをデーモン化(省略) • コンテナをデーモン化: docker run -d イメージ コマンド • デーモン化されたコンテナの標準出力は抑制される Docker 入門 25 [root@localhost ~]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 7cc259672c00f773939695ec849e2316c7e562ff40784082f30a49e1acf286d9 • 標準出力を確認 : docker logs コンテナID [root@localhost ~]# docker logs 7cc259672c hello world hello world .. • デーモンを前に持ってくる [root@localhost ~]# docker attach 7cc259672c hello world hello world .. コンテナIDが返される ※ ポートが開く場合はコマンドを 指定しなくてもデーモン化可能
  26. 26. コンテナのsuspendと再開(省略) • pause はコンテナを一時停止する。いわゆる suspend 状態 • unpause で一時停止解除。コンテナ自体はpauseを認知しない Docker 入門 26 [root@localhost ~]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 7cc259672c00f773939695ec849e2316c7e562ff40784082f30a49e1acf286d9 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 12 minutes ago Up 12 minutes insane_bartik !! [root@localhost ~]# docker pause 7cc259672c00 7cc259672c00 [root@localhost ~]# docker ps CONTAINER ID  IMAGE COMMAND CREATED STATUS PORTS NAMES 7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 12 minutes ago Up 12 minutes (Paused) insane_bartik !! [root@localhost ~]# docker unpause 7cc259672c00 7cc259672c00 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 13 minutes ago Up 13 minutes insane_bartik
  27. 27. コンテナの停止と再開 • stop はコンテナを shutdown する。kill も同じだが少し乱暴 • start すると再び同じコンテナを立ち上げる。状態は継続している Docker 入門 27 [root@localhost ~]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 7cc259672c00f773939695ec849e2316c7e562ff40784082f30a49e1acf286d9 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 12 minutes ago Up 12 minutes insane_bartik !! [root@localhost ~]# docker stop 7cc259672c00 7cc259672c00 [root@localhost ~]# docker ps -a | grep 7cc259672c00 7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 27 minutes ago Exited (-1) About a minute ago insane_bartik !! [root@localhost ~]# docker start 7cc259672c00 7cc259672c00 [root@localhost ~]# docker ps CONTAINER ID MAGE COMMAND CREATED STATUS PORTS NAMES 7cc259672c00 ubuntu:14.04 /bin/sh -c 'while tr 27 minutes ago Up 4 seconds insane_bartik • 補足) 全てのコンテナを停止。(pauseも同じ要領でできる) [root@localhost ~]# docker stop `docker ps --no-trunc -q`
  28. 28. コンテナの設定(json)を確認(省略) • docker inspect コンテナID • docker inspect -f “フォーマット条件” コンテナID Docker 入門 28 [root@localhost ~]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" e5b758beabad9d1a98f3fd21c6384df223d1abb44502e7cb4e698b52fe4a6a0a ! [root@localhost ~]# docker inspect e5b758beabad [{ "Args": [ "-c", "while true; do echo hello world; sleep 1; done" .. "Pid": 18349, "Running": true, "StartedAt": "2014-11-23T23:50:39.732187978Z" }, "Volumes": {}, "VolumesRW": {} } ] !! [root@localhost ~]# docker inspect -f '{{ .NetworkSettings.IPAddress }}' e5b758beabad 172.17.0.28 !! [root@localhost ~]# docker inspect -f '{{ .NetworkSettings }}' e5b758beabad map[Bridge:docker0 Gateway:172.17.42.1 IPAddress:172.17.0.28 IPPrefixLen:16 PortMapping:<nil> Ports:map[]]
  29. 29. コンテナから新イメージの作成 • コンテナへの変更を永続化するためにはイメージ化が必要 • イメージ化: docker commit コンテナID イメージ名 • イメージ名は自分のユーザ名を付けないと push できなくなる [root@localhost ~]# docker run ubuntu:14.04 wget www.google.com 2014/11/24 07:17:47 Error response from daemon: Cannot start container 05c8eca1bc3d395162d028ad7c26c4b73875028d8891c43c1cca0a655e41ecfe: exec: "wget": executable file not found in $PATH ! [root@localhost ~]# docker run -t -i ubuntu:14.04 /bin/bash root@6b8305bdeb74:/# apt-get -y update root@6b8305bdeb74:/# apt-get install -y wget root@6b8305bdeb74:/# exit exit ! [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6b8305bdeb74 ubuntu:14.04 /bin/bash 4 minutes ago Exited (0) 17 seconds ago furious_archimedes [root@localhost ~]# docker commit 6b8305bdeb74 yuichi110/ubuntu_wget b89d196b00504777278e83c0c44374f1243d59c16494f2112eb94054373b3e58 Docker 入門 29 !! [root@localhost ~]# docker run yuichi110/ubuntu_wget wget www.google.com .. 0K .......... ....... 181K=0.1s 2014-11-23 22:13:40 (181 KB/s) - 'index.html' saved [17721]
  30. 30. コンテナの削除 • 停止中のコンテナの削除: docker rm コンテナID(もしくは名前) • コンテナの強制削除: docker rm -f コンテナID • 削除されたコンテナは復元できない [root@localhost ~]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 7cc259672c00f773939695ec849e2316c7e562ff40784082f30a49e1acf286d9 Docker 入門 30 !! [root@localhost ~]# docker rm 7cc259672c00 Error response from daemon: Impossible to remove a running container, please stop it first or use -f 2014/11/24 06:35:24 Error: failed to remove one or more containers !! [root@localhost ~]# docker rm -f 7cc259672c00 7cc259672c00 [root@localhost ~]# docker ps -a | grep 7cc259672c00 [root@localhost ~]# • 補足) 全てのコンテナを削除。必要に応じて -f を追加 [root@localhost ~]# docker rm `docker ps --no-trunc -aq`
  31. 31. 新イメージをリポジトリに push(省略) • 作成したイメージをリポジトリに登録 • 他ユーザや自分の別のホストでも新イメージが利用可能になる Docker 入門 31 [root@localhost ~]# docker commit 6b8305bdeb74 yuichi110/ubuntu_wget b89d196b00504777278e83c0c44374f1243d59c16494f2112eb94054373b3e58 [root@localhost ~]# docker images | grep yuichi yuichi110/ubuntu_wget latest b89d196b0050 10 minutes ago 219.5 MB !! [root@localhost ~]# docker push yuichi110/ubuntu_wget The push refers to a repository [yuichi110/ubuntu_wget] (len: 1) Sending image list Pushing repository yuichi110/ubuntu_wget (1 tags) 511136ea3c5a: Image already pushed, skipping 1de2bd7201a2: Image already pushed, skipping b70ad18cfc2a: Image already pushed, skipping 3b39241dab7c: Image already pushed, skipping 23f1840ed5a5: Image already pushed, skipping dfa12c637781: Image already pushed, skipping 1357f421be38: Image already pushed, skipping b89d196b0050: Image successfully pushed Pushing tag for rev [b89d196b0050] on {https://cdn-registry-1.docker.io/v1/repositories/yuichi110/ubuntu_wget/ tags/latest} ! [root@localhost ~]# docker search ubuntu | grep yuichi yuichi110/ubuntu_wget 0
  32. 32. Docker file から新イメージの作成 • Docker file (ファイル名はDockerfile) にイメージ作成手順を書く • Docker file をビルドして実際にイメージを作成する • Dockerfile を使うことでコンテナのポータビリティが得られる Docker 入門 32 [root@localhost ~]# cat Dockerfile FROM ubuntu:14.04 RUN apt-get update RUN apt-get install -y wget ! [root@localhost ~]# docker build -t yuichi110/ubuntu_wget2 ./ Sending build context to Docker daemon 36.35 kB Sending build context to Docker daemon Step 0 : FROM ubuntu:14.04 ---> 1357f421be38 Step 1 : RUN apt-get update ---> Using cache .. Successfully built c28f0e25c627 !! [root@localhost ~]# docker run yuichi110/ubuntu_wget2 wget www.google.com .. 0K .......... ....... 135K=0.1s 2014-11-23 23:08:36 (135 KB/s) - 'index.html' saved [17682]
  33. 33. イメージの削除(省略) • ローカルイメージの削除: docker rmi イメージ名 • イメージに依存しているコンテナが存在していたら実施できない Docker 入門 33 [root@localhost ~]# docker images | grep ansible ansible/ubuntu14.04-ansible devel ce85429a2a86 Less than a second ago 445.1 MB ansible/ubuntu14.04-ansible 1.8 731ee0ca00c3 Less than a second ago 445.1 MB ansible/ubuntu14.04-ansible stable 745e437a93a5 Less than a second ago 287.7 MB ansible/ubuntu14.04-ansible 1.7 06b4dde722cc Less than a second ago 287.7 MB !! [root@localhost ~]# docker rmi ansible/ubuntu14.04-ansible:1.8 Untagged: ansible/ubuntu14.04-ansible:1.8 Deleted: 731ee0ca00c31909b0c9f13b641e904038eb16496702ab296c3fcddecd304422 Deleted: 755662277f77a375dd85d4bdad1205a5a6e6310a839c478bc7e87cff809af3a9 .. Deleted: 9d62b40139980fa70e88e34522459b5dd4d81b6806e32ced36440068edfea98a Deleted: b43510963a3adc28e20bebba4f7629ced7ff36efa97a0ce2dfb66d44492c3301 !! [root@localhost ~]# docker images | grep ansible ansible/ubuntu14.04-ansible devel ce85429a2a86 Less than a second ago 445.1 MB ansible/ubuntu14.04-ansible stable 745e437a93a5 Less than a second ago 287.7 MB ansible/ubuntu14.04-ansible 1.7 06b4dde722cc Less than a second ago 287.7 MB
  34. 34. ホストのデータを参照(省略) • コンテナ内のデータはコンテナを消したら消滅 • コンテナがホストのデータを参照すればデータは永続化される • オプション: docker run -v ホストのパス:コンテナのパス 参照 ホスト Docker 入門 34 実データ [root@localhost ~]# ls /root/ | grep datastore datastore [root@localhost ~]# ls /root/datastore/ directory hello.txt hello2.txt !! コンテナ [root@localhost ~]# docker run -ti -v /root/datastore/:/ds ubuntu:14.04 /bin/bash root@177cae414b7d:/# ls / | grep ds ds root@177cae414b7d:/# ls /ds directory hello.txt hello2.txt
  35. 35. demo completed!! ! Docker 入門 35 ## . ## ## ## == ## ## ## ## === /""""""""""""""""___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ ______ o __/ __/ __________/
  36. 36. Agenda Docker 入門 • Docker の概要 • 簡単な Docker の使い方 (デモ) • Docker のネットワークについて • 3階層のサービスの展開例 • まとめ • 補足資料 36
  37. 37. Docker のネットワーク • IPマスカレード(IP,Port変換)を利用している。 • docker 0 という bridge に veth 経由でコンテナの eth0 が接続 • コンテナは利用されていない IP を与えられる (不定) [root@localhost ~]# ifconfig docker0 | head -2 docker0 Link encap:Ethernet HWaddr 2E:69:D1:FB:67:91 inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0 ! [root@localhost ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.726a62967372 no vethe9f0 Docker 入門 ホスト 37 NIC コンテナ eth0 veth コンテナ eth0 veth docker0 (DGW) vethf267 root@bea59cfb76ea:/# ifconfig eth0 | head -2 eth0 Link encap:Ethernet HWaddr 06:eb:00:45:f7:43 inet addr:172.17.0.40 Bcast:0.0.0.0 Mask:255.255.0.0 root@bea59cfb76ea:/# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.17.0.0 * 255.255.0.0 U 0 0 0 eth0 default 172.17.42.1 0.0.0.0 UG 0 0 0 eth0 172.17.0.0/16 NAPT コンテナ
  38. 38. Port Forwarding • NAT超え(外から中へのアクセス)にはポートフォワーディングを行う • ホストのポートXに来た通信はコンテナのポートYに転送(同一でもOK) • docker run -p PORT_X:PORT_Y イメージ名 (大文字 -P は自動割り当て) Docker 入門 38 コンテナ Host NIC eth0 docker0 Dest IP : NIC Dest Port : X Dest IP : eth0 Dest Port : Y [root@localhost ~]# docker run -ti -p 10080:80 ubuntu:14.04 /bin/bash root@102a39277af9:/# service nginx start root@102a39277af9:/# nmap localhost ... PORT STATE SERVICE 80/tcp open http ... コンテナは port 80 を使用 外からは port 10080 でアクセス
  39. 39. Link によるコンテナ間の連携 • 割り振られるIPは自動で決まるので、それを使ったコンテナ間の連携は難しい • コンテナ間を「 Link 」で接続することでアドレスを隠蔽できる • Link 元は Link 先のIP等を etc/hosts や環境変数(env)で参照可能。 • 設定ファイル等でIPを書き込むのではなく、環境変数で相手を特定する コンテナの立ち上げと Link オプション Docker 入門 39 コンテナ! web コンテナ! db link root@cf283587658f:/# cat /etc/hosts 172.17.0.63 cf283587658f 127.0.0.1 localhost .. 172.17.0.61 db root@cf283587658f:/opt/webapp# env HOSTNAME=cf283587658f DB_NAME=/web2/db TERM=xterm DB_PORT_5432_TCP_ADDR=172.17.0.61 DB_PORT=tcp://172.17.0.61:5432 DB_PORT_5432_TCP=tcp://172.17.0.61:5432 .. Host /etc/hosts # env #docker run -d --name db2 training/postgres #docker run -ti -P --name web2 --link db2:db training/webapp /bin/bash --link name:alias コンテナ内でコンテナ”name”を! ”alias”という名前で参照可能になる
  40. 40. Agenda Docker 入門 • Docker の概要 • 簡単な Docker の使い方 (デモ) • Docker のネットワークについて • 3階層のサービスの展開例 • まとめ • 補足資料 40
  41. 41. フルスクラッチで3階層モデルを構成 • Linkでコンテナ間の連携をさせる • コンテナ1 (WEB) : nginx をロードバランサにする • コンテナ2 (APP) : Python をアプリケーションサーバとして動かす • コンテナ3 (DB) : データベースとしてMySQLを動かす Link Link Docker 入門 41 ロードバランサ NAPT 10080 : 80 App Server DB Server
  42. 42. 作業手順の例 1. DBコンテナの立ち上げと設定(MySQL) 2. APP コンテナを DB コンテナにリンクして立ち上げて設定(Python) 3. WEB コンテナを APP コンテナにリンクして立ち上げて設定(NGINX) 4. ブラウザからホストにアクセスし、コンテナのレスポンスを確認 5. コンテナを停止しイメージ化を行う 6. イメージからコンテナをたちあげて動くか確認 Docker 入門 42
  43. 43. DB コンテナ (MySQL) [root@localhost ~]# docker run -ti --name db ubuntu:14.04 /bin/bash • MySQL の設定 (途中で設定するパスワードが聞かれ、password とした) • MySQL のデータベースとテーブルを作成 Docker 入門 外からアクセス可能に 43 • コンテナの立ち上げ root@b9ecf98b6fcc:/# apt-get update root@b9ecf98b6fcc:/# apt-get install mysql-server-5.6 root@b9ecf98b6fcc:/# sed -i -e "s/bind-address/# bind-address/g" /etc/mysql/my.cnf root@b9ecf98b6fcc:/# service mysql start root@b9ecf98b6fcc:/# mysql -u root -p Enter password: mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES; mysql> create database test_db; mysql> use test_db; mysql> create table test_table (id int, value varchar(100)); mysql> insert into test_table values (1, "mysql on db container"); mysql> quit root ユーザへの権限の設定 事前にテーブルとエントリを作成
  44. 44. APP コンテナ (Python) [root@localhost ~]# docker run -ti --name app --link db:db ubuntu:14.04 /bin/bash Docker 入門 フレームワークではなく http処理用のライブラリを利用 44 • コンテナの立ち上げ • Python の設定と起動 root@0b6dc84addf4:/# apt-get update root@0b6dc84addf4:/# apt-get install python-mysqldb root@0b6dc84addf4:/# python2 app.py • Application Server のプログラムの作成 : app.py 接続先DBをIPではなく ドメイン名”db”で指定 (etc/hostsで解決される) http get がきたら DB から エントリを取得して、 textデータを返すだけ
  45. 45. WEB コンテナ (NGINX) Docker 入門 45 root@522fbc2bba47:/# apt-get update root@522fbc2bba47:/# apt-get install nginx root@522fbc2bba47:/# rm /etc/nginx/sites-enabled/default root@522fbc2bba47:/# vi /etc/nginx/sites-enabled/default root@522fbc2bba47:/# service nginx restart server { listen 80 default_server; location / { proxy_pass http://app:80; } } • コンテナの立ち上げ [root@localhost ~]# docker run -ti -p 10080:80 --name web --link app:app ubuntu:14.04 /bin/bash • NGINX の設定 • NGINX の編集したファイル内容: /etc/nginx/sites-enabled/default link機能で解決できるドメイン名 app を設定ファイルに書き込み webサーバーではなくロードバランサーとして使う設定(クラスタは組んでいない)
  46. 46. イメージ化と動作確認 • イメージ化 + 今までのコンテナの削除 [root@localhost ~]# docker commit db 3tier/db [root@localhost ~]# docker commit app 3tier/app [root@localhost ~]# docker commit web 3tier/web [root@localhost ~]# docker rm `docker ps -aq` • コンテナの立ち上げ (サービス自動立ち上げにしてデーモン化でもOK) Docker 入門 46 [root@localhost ~]# docker run -ti --name db 3tier/db /bin/bash root@71cfbce43a8d:/# service mysql start [root@localhost ~]# docker run -ti --name app --link db:db 3tier/app /bin/bash root@06ef42352907:/# python2 app.py [root@localhost ~]# docker run -p 10080:80 -ti --name web --link app:app 3tier/web /bin/bash root@f1048cc4d64a:/# service nginx start • ブラウザでホストにアクセスして確認。成功 DBコンテナに保存されているデータ (補足) linkのエイリアスを使えば 同一構成の複数展開も可能 --link app:app --link app2:app --link app3:app
  47. 47. 補足) コンテナをサービス分離にのみ使用する例 • プレゼンターの使い方 (図には若干の変更や実装中の部分が含まれます) • 各コンテナに1つのサービスを全ていれ、NGINXでドメインで振り分け Primary Host1 (固定IP) DNS Secondary Docker 入門 47 localhost (docker) 10080:80 11080:80 80 VirtualHost Cluster Cache, Security localhost (docker) 10080:80 80 11080:80 RR with HA Host2 (固定IP) VirtualHost Cluster Cache, Security .. ..
  48. 48. Agenda Docker 入門 • Docker の概要 • 簡単な Docker の使い方 (デモ) • Docker のネットワークについて • 3階層のサービスの展開例 • まとめ • 補足資料 48
  49. 49. まとめ • Dockerのようなコンテナ型仮想化はリソース効率的に利用 • 環境を適度に分離する目的に利用できる • 不変なイメージをコンテナ化して使う • イメージが不変であるため複製や移行、復旧が簡単 • イメージから環境依存をどのようにして減らすかが重要 Docker 入門 49
  50. 50. Docker の将来 • コンテナの業界標準になる可能性があるだけでなく、 VMWare などの完全仮想化を食ってしまう可能性がある • 大規模環境ではKubernetes のようなオーケストレーショ ンツールで管理する必要性が高まる • クラウドのVM上で Docker を動かすとベンダへの依存性 が減るかもしれない。(InterCloudの実現に便利) Docker 入門 50
  51. 51. Thanks !! 要望があれば実環境向けの Docker with Ansible(管理ツール) とかやりたいです。 Docker 入門51
  52. 52. Agenda Docker 入門 • Docker の概要 • 簡単な Docker の使い方 (デモ) • Docker のネットワークについて • 3階層のサービスの展開例 • まとめ • 補足資料 52
  53. 53. Docker ベストプラクティス • コンテナはStateless な運用を目指す (ログ等も) • IPなどの環境に依存する設定をイメージから排する • 1機能(もしくは1サービス)1コンテナを意識する • Docker だけで全てを完結させず、CheffやAnsibleも利用 • /bin/bash ではなく Docker file でイメージを作る Docker 入門 53
  54. 54. Docker の弱み • Docker はホストとゲストが kernel を共有している - 異なる kernel を使うOSは仮想化できない - kernel レベルの機能は仮想化できない • 完全仮想化に比べて歴史が浅い - 提供される機能が多くない - オーケストレーションなどが難しい • ネットワーク、ストレージなどに融通を効かせにくい Docker 入門 54
  55. 55. Docker に対する業界動向 (2014年12月現在) • Docker社: ホストまたぎのオーケストレーションに注力, API など • VMWare: 競合しつつも協業の未知を探している。幹部がDocker 社に移る。 • Red Hat: RHEL などで Docker を提供。 • Microsoft: 次期の Windows Server を Docker 対応させる • Amazon: Docker のコンテナ実行環境と管理サービスを提供 • Google: コンテナ実行環境の提供。kubernetes の開発 • IBM: bluemix 上でコンテナが使えるようになった • GUI: いくつかのプロジェクトが走っている • 個人コミッタ: マルチホストでDockerを使うためのツール開発がブーム Docker 入門 55
  56. 56. 補足) レイヤー化されたDocker のイメージファイル • イメージに差分を「積み重ねる」ことで新しいイメージを作る • Gitなどのように樹形図的に子イメージが増えていく • 子のイメージやコンテナは親のイメージのデータをReadOnlyで共有 docker run apt-get install apache2 apt-get install emacs 公式 debian image コンテナを! たちあげ 変更! イメージ化 変更! イメージ化 Docker 入門56
  57. 57. 補足) /bin/bash を上手に使う • docker run,start で bin bash に入るのは便利 (良し悪しは別として) • bin/bash でコンテナとイメージに改変を加えていく作業を繰り返す • 複雑になってきたら Dockerfile でイメージを作り直す(リファクタリング) 作業の区切りでイメージ化 作業 docker commit コンテナID Docker 入門 57 作業終了 image running stopped /bin/bash に戻る /bin/bash に入る docker run -t -i イメージ名 /bin/bash docker start コンテナID! docker attach コンテナID Dockerfileで書き直す (リファクタリング)
  58. 58. 補足) DNS によるコンテナ間の連携手法 • 複雑な構成でコンテナ間接続を Link だけで実現するのは難しい • リンクでホスト跨ぎもできない (通常はオーケストレーションで) • 個人レベルなら簡易 DNS (dnsmasqなど) を使って管理できる? (1) DNS参照とコンテナ名の設定をして立ち上げ (2) コンテナ名から inspect して IP を取得 address=/test.docker/172.17.0.53 service dnsmasq restart Docker 入門 58 App! Server DB1! Primary DB2! Secondary DNS docker run -d -dns 172.17.42.1 -name web WEB_IMAGE docker run -d -dns 172.17.42.1 -name app APP_IMAGE docker run -d -dns 172.17.42.1 -name db DB_IMAGE docker0 (172.17.42.1) docker inspect -f '{{ .NetworkSettings.IPAddress }}' NAME IP_ADDRESS (3) コンテナ名と IP の組み合わせをDNS登録 (4) コンテナ間の通信はドメイン・ネームで行う (動的に割り当てられるIPに非依存) App! Server リンク可 双方向は リンク不可
  59. 59. 補足) 簡易DNSであるDnsmasqの使い方 • Dnsmasq は BIND より簡単に運用可能。スクリプトで制御しやすい • 登録するドメイン名は「コンテナ名.docker」としている (自由) /etc/dnsmasq.d/test /etc/dnsmasq.d/test2 Docker 入門 59 listen-address=172.17.42.1 interface=docker0 conf-dir=/etc/dnsmasq.d address=/test.docker/172.17.0.53 /etc/dnsmasq.conf /etc/dnsmasq.d address=/test2.docker/172.17.0.54 # yum install dnsmasq # chkconfig dnsmasq on # service dnsmasq restart
  60. 60. 補足) DNS方式の制御用スクリプト Docker 入門 60 web, app, db という標準的な3階層構成 Web Server APP! Server DB! Server name: web! IP: X name: app! IP: Y name: db! IP: Z DNS to! app to! db docker0 (172.17.42.1)
  61. 61. 補足) コンテナにNICを追加する • Docker 単独の機能では実現できないので Linux コマンドを使う • コンテナの環境依存性が高まるので利用には注意が必要 • 私なら OVS を使った Ambassador パターンや Trunk を検討するかも コンテナ eth1 veth veth veth NICとのマッピング Docker 入門 61 eth0 docker0 (DGW) Linux bridge NIC1 eth2 OVS NIC2 NIC_N 「Docker を支える技術」 RedHat 中井さんによる日本語資料 Slide Share にあります
  62. 62. 補足) オーケストレーションによるネットワーク管理 Docker 入門 • fig • Ambassador パターン • etcd (zookeeper) • pipework 62 個人的な考え • コンテナ間の接続はイメージ内に直接書くべきではない • Docker file を使う • .bash_profile などを外出しして、それを編集とかどう ? • プログラミングの Actor モデルのパターンなどが流用可能 ?
  63. 63. Docker 入門63 bye !!

×