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 Compose入門~今日から始めるComposeの初歩からswarm mode対応まで

9,902 views

Published on

Master Cloud #mastercloud 発表資料です
2017年6月14日(水)
https://mastercloud.connpass.com/event/57936/

Published in: Software
  • Be the first to comment

Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで

  1. 1. Docker Compose入門 今日から始めるComposeの初歩からswarm mode対応まで Engineer / Technology Evangelist, SAKURA Internet, Inc. @zembutsu 前佛 雅人 ZEMBUTSU Masahito 2017年6月14日(水) #mastercloud
  2. 2. 今日お伝えすること Docker Compose 基本概念 Compose を YAML で動かす docker stack と swarm mode
  3. 3. 3 Compose とは? 基本概念と役割 Docker Compose
  4. 4. 4 Introducing Moby Project: a new open-source project to advance the software containerization movement - Docker Blog https://blog.docker.com/2017/04/introducing-the-moby-project/ A new upstream project to break up Docker into independent components by shykes · Pull Request #32691 · moby/moby https://github.com/moby/moby/pull/32691 Docker と周辺ツールやプロジェクトとの関係性まとめ references 2013 Docker LXC + 2014 libcontainer ver0.9 デーモン Linux向けコンテナ用 ライブラリ(当時開発中) 独自にライブラリを実装 2015 Docker Engine デーモンの呼称を変更 補助ツール群の登場 Docker Swarm Docker Compose Docker Machine 2016 2017 runC v1.11 OCI基準のランタイムの1つ “docker”バイナリから dockerd デーモンに代わり Linux capabilityの管理 Engine (dockerd) containerD OCI準拠のランタイムを 動かすスーパーバイザ v1.11 Docker独自規格 業界規格・共通技術 CNCF (Cloud Native Computing Foundation) の規格の1つに採用 v1.12 infrakit v1.12 SwarmKit platform agnostic インフラの差違を埋めるためのツール カーネルとユーザスペースを提供 イミュータブルなインフラのため 派生 swarm モード 派生 hyperkit vpnkit datakit コンテナシステムの組立に 特化したフレームワークを 開発するプロジェクト https://github.com/mobyhttps://github.com/docker
  5. 5. 5 “Compose is a tool for defining and running multi-container Docker applications.” 複数コンテナのDockerアプリケーションを 定義し、実行するツールがCompose
  6. 6. 6 “Compose is a tool for defining and running multi-container Docker applications.” 複数コンテナのDockerアプリケーションを 定義し、実行するツールがCompose docker-compose.yml YAMLファイル docker-compose CLI
  7. 7. 7 Why?
  8. 8. Docker Engine 8 エ ン ジ ン $ docker run … $ docker run … $ docker run … $ docker run …
  9. 9. Docker Swarm 9 ス ウ ォ ー ム $ docker run … $ docker run … $ docker run … $ docker run …
  10. 10. 10 • 複数のコンテナを一斉に 操作できない • 複数台のサーバ上で一斉に 操作できない 管理が 面倒
  11. 11. “Docker allows you to package an application with all of its dependencies into a standardized unit for software development.” www.docker.com 11 全ての依存関係をパッケージ化して、コンテナとして動かす
  12. 12. 12 “Fast, isolated development environments using Docker” www.fig.sh
  13. 13. 13 “Fast, isolated development environments using Docker” www.fig.sh
  14. 14. Docker Compose 14 コ ン ポ ー ズ “Compose is a tool for defining and running multi-container Docker applications.”
  15. 15. 15
  16. 16. 16
  17. 17. 17 Mastodon
  18. 18. 18 Mastodon
  19. 19. 19 version: "3" services: db: restart: always image: postgres:alpine networks: mastodon: volumes: - mastodon_postgres:/var/lib/postgresql/data redis: restart: always image: redis:alpine networks: mastodon: volumes: - mastodon_redis:/data frontend: build: context: ./frontend dockerfile: Dockerfile.nginx image: mastodon_frontend:alpine ports: - "80:80" - "443:443" depends_on: - web - streaming networks: mastodon: volumes: - /etc/localtime:/etc/localtime:ro - certbot:/etc/letsencrypt sidekiq: restart: always build: . image: gargron/mastodon env_file: .env.production command: bundle exec sidekiq -q default -q mailers -q pull -q push depends_on: - db - redis networks: mastodon: volumes: - system:/mastodon/public/system mta: restart: always image: namshi/smtp env_file: .env.smtp networks: mastodon: volumes: - /etc/localtime:/etc/localtime:ro networks: mastodon: external: true volumes: certbot: external: true mastodon_postgres: mastodon_redis: assets: packs: system: web: restart: always build: . image: gargron/mastodon env_file: .env.production command: bundle exec rails s -p 3000 -b '0.0.0.0' #ports: # - "3000:3000" depends_on: - db - redis networks: mastodon: aliases: - mastodon_web volumes: - assets:/mastodon/public/assets - packs:/mastodon/public/packs - system:/mastodon/public/system streaming: restart: always build: . image: gargron/mastodon env_file: .env.production command: npm run start ports: - "4000:4000" networks: mastodon: aliases: - mastodon_streaming depends_on: - db - redis docker-compose.yml
  20. 20. 20 version: "3" services: db: restart: always image: postgres:alpine networks: mastodon: volumes: - mastodon_postgres:/var/lib/postgresql/data redis: restart: always image: redis:alpine networks: mastodon: volumes: - mastodon_redis:/data frontend: build: context: ./frontend dockerfile: Dockerfile.nginx image: mastodon_frontend:alpine ports: - "80:80" - "443:443" depends_on: - web - streaming networks: mastodon: volumes: - /etc/localtime:/etc/localtime:ro - certbot:/etc/letsencrypt sidekiq: restart: always build: . image: gargron/mastodon env_file: .env.production command: bundle exec sidekiq -q default -q mailers -q pull -q push depends_on: - db - redis networks: mastodon: volumes: - system:/mastodon/public/system mta: restart: always image: namshi/smtp env_file: .env.smtp networks: mastodon: volumes: - /etc/localtime:/etc/localtime:ro networks: mastodon: external: true volumes: certbot: external: true mastodon_postgres: mastodon_redis: assets: packs: system: web: restart: always build: . image: gargron/mastodon env_file: .env.production command: bundle exec rails s -p 3000 -b '0.0.0.0' #ports: # - "3000:3000" depends_on: - db - redis networks: mastodon: aliases: - mastodon_web volumes: - assets:/mastodon/public/assets - packs:/mastodon/public/packs - system:/mastodon/public/system streaming: restart: always build: . image: gargron/mastodon env_file: .env.production command: npm run start ports: - "4000:4000" networks: mastodon: aliases: - mastodon_streaming depends_on: - db - redis docker-compose.yml
  21. 21. 21
  22. 22. 22 コンテナ単位 Engine (プロジェクト内の) サービス単位 Compose
  23. 23. 23 開発、テスト、ステージング CI ワークフローに適している • 単一ホスト上でも環境を分けたい場合に • コンテナが作成したボリューム(データ領域)を 残したり、共有できる • Compose ファイルを再利用できる
  24. 24. 24 セットアップ方法 docker-compose CLI Compose形式v1~v3 Composeを使う フォーマット
  25. 25. 25 セットアップ https://github.com/docker/compose/releases から、各OSに対応したバイナリのセットアップが簡単 curl -L https://github.com/docker/compose/releases/download/1.13.0/docker-compose-`uname -s`-`uname -m`¥ > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
  26. 26. 26 docker CLI風のコマンド群
  27. 27. 27 docker-compose up docker-compose ps docker-compose stop docker-compose logs docker-compose rm
  28. 28. 28 docker-compose.yml version: '3.1' services: wordpress: image: wordpress ports: - 80:80 environment: WORDPRESS_DB_PASSWORD: example mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example • プロジェクトを定義・操作 • サービス、ネットワーク、 ボリュームを定義など、 アプリケーションに依存する すべての情報を定義 • 必要なイメージ名やタグの情報 • 環境変数 • 外部(external)ネットワーク • 外部(external)ボリューム • などなど
  29. 29. 29 より有効活用 するには…?
  30. 30. 30 Orchestration ( ( ) Scheduling Cluster Management 複数のホスト・システム上を横 断するアプリケーションをス ケール(拡大・縮小)できる機能 ※コンテナに依存しない • Marathon, chronos • Docker swarm • Deis • fleet • Apache Mesos • DCOS (Mesosphere) • Kubernetes • Docker Engine (swarm mode) + Docker Compose • Rancher • Nomad 設定ファイルをベースに サービスを定義・維持 計算資源の抽象化
  31. 31. 内部分散ステート・ストア Internal Distrubuted State Store マネージャ Manager マネージャ Manager マネージャ Manager ワーカ Worker ワーカ Worker ワーカ Worker ワーカ Worker ワーカ Worker ワーカ Worker
  32. 32. internet 仮想マシン 仮想マシン 仮想マシン ingress Virtual Router (IPVS) タスク タスク タスク Routing mesh network サービス作成 $ docker service create 「--constraint」でノードの指定 「--mode=global」で全ノードに展開
  33. 33. 33 docker stack
  34. 34. 34 docker stack deploy -c docker-compose.yml [NAME] docker service は「サービス」単位 docker stack は「アプリケーション全体」かつ swarm mode で Docker Compose 互換機能を提供 ポイント
  35. 35. 35 docker stack deploy -c docker-compose.yml [NAME]
  36. 36. 36 $ docker stack deploy -c docker-compose.yml web Creating service web_web $ docker stack ps web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS uhm1xxq1u70w web_web.1 zembutsu/docker-sample-nginx:latest frontend-01 Running Running 45 seconds ago ccmokdadpjqx web_web.2 zembutsu/docker-sample-nginx:latest frontend-02 Running Running 28 seconds ago cflckriidpt0 web_web.3 zembutsu/docker-sample-nginx:latest frontend-03 Running Running 33 seconds ago $ docker stack services web ID NAME MODE REPLICAS IMAGE PORTS yunncblhngu6 web_web replicated 3/3 zembutsu/docker-sample-nginx:latest *:80->80/tcp = docker service ps web = docker service ls
  37. 37. 37 version: '3' services: web: image: zembutsu/docker-sample-nginx deploy: replicas: 3 resources: limits: cpus: "0.1" restart_policy: condition: on-failure ports: - "80:80" networks: internal: aliases: - web volumes: - /etc/localtime:/etc/localtime:ro networks: internal:
  38. 38. docker-compose.yml Compose format は 3種類
  39. 39. v1 v2 v3 ・ネットワーク非対応 ・ボリューム非対応 ・ネットワーク対応 ・ボリューム対応 ・スケール(swarm) ・リソース制限
  40. 40. Docker Swarm Docker Compose Docker Engine swarm mode docker stack
  41. 41. Docker Swarm Docker Compose Docker Engine swarm mode docker stack Compose format v3
  42. 42. swarm mode 基本コマンド $ docker swarm init --listen-addr <host>:2377 $ docker swarm join <host>:<port> $ docker service create ¥ --replicas N –p <公開port>:<内部> --name <名前> <イメージ> $ docker service ls $ docker service tasks <サービス名> $ docker service update --replicas N <サービス名> $ docker service update --image <イメージ> <サービス名> $ docker service rm クラスタ初期化 クラスタ参加 サービス作成 サービス一覧 タスク一覧 サービス更新 ローリング・アップデート サービス削除
  43. 43. ① Docker Engine “swarm モード” の初期化 マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2 Docker Engine (dockerd) Manager node Worker node Worker node Docker Engine のクラスタを「swarm」(”群れ”の意味)と呼ぶ 「docker swarm」コマンドはクラスタ上のサービスやタスクを管理する はじめに「docker swarm init」コマンドでクラスタを初期する 192.168.39.1 (node-01) 192.168.39.2 (node-02) 192.168.39.3 (node-03) docker swarm init –listen-addr 192.168.39.1:2377 クラスタの初期化 docker@node-01:~$ docker node ls ID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS dhrbvl6o9xqvprsq2uzq8o9ev * node-01 Accepted Ready Active Leader 各ホスト上では Docker Engine (dockerd)が 稼働している。通常の docker コマンド利用と swarm モードは併用可能 Docker Engine (dockerd) Docker Engine (dockerd) ノードは swarm クラスタ内の Docker エンジンのこと 「docker node」はクラスタのノード管理するコマンド群で、マネージャ・ノードのみ実行可能 「docker node ls」は、マネージャ用のノード一覧を表示 swarm クラスタ
  44. 44. ② swarm node join でクラスタに追加 マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2 Manager node Worker node Worker node swarm クラスタ 192.168.39.1 (node-01) 192.168.39.2 (node-02) 192.168.39.3 (node-03) docker swarm join 192.168.39.1:2377 クラスタに worker (ワーカ)として参加 docker@node-01:~$ docker node ls ID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS 6puvbl7tgxislfha5iaha40jm node-03 Accepted Ready Active 9zj16or3durdh5i7c6khlench node-02 Accepted Ready Active dhrbvl6o9xqvprsq2uzq8o9ev * node-01 Accepted Ready Active Leader 「MANAGER STATUS」が無ければ、ワーカ・ノードとして動作 ただし、この例のマネージャはワーカも兼ねている TCP Port 2377 は、クラスタ管理の通信用 TCP/UDP Port 7946 はノード間通信用 TCP/UDP Port 4789 はオーバレイ・ネットワーク用 ワーカはマネージャから タスクを受け取る マネージャでサービスを定義 タスクをワーカに割り振る
  45. 45. ③ swarm service create でサービス作成 マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2 Manager node Worker node Worker node swarm クラスタ 192.168.39.1 (node-01) 192.168.39.2 (node-02) 192.168.39.3 (node-03) $ docker service create --replicas 1 –name web -p 80:80 nginx f218o6xshkyt7zzxujhnz1a2h nginx イメージを使う web という名前のサービスを作成 docker@node-01:~$ docker service ls ID NAME REPLICAS IMAGE COMMAND 13765buws9fr web 0/1 nginx サービスはレプリカの期待数を定義 「0/1」は期待数は 1 だが現状は 0 レプリカ数:1 swarmのポート80をコンテナ内の80に割り当て マネージャでサービスを定義 タスクをワーカに割り振る ID NAME REPLICAS IMAGE COMMAND 13765buws9fr web 1/1 nginx マネージャはノードにタスクを割り当て(スケジュールし)、 タスク(としてのコンテナ)が起動すると「1/1」になる サービス タスク (コンテナ) nginxweb スケジュール コンテナ起動
  46. 46. ④ ポートの公開と Ingress オーバレイ・ネットワーク マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2 Manager node Worker node Worker node swarm クラスタ 192.168.39.1 (node-01) 192.168.39.2 (node-02) 192.168.39.3 (node-03) サービス タスク (コンテナ) nginxweb Port 80(tcp) オーバレイ・ネットワーク Port 80(tcp) Ingress Port 80(tcp)Port 80(tcp) $ docker network ls NETWORK ID NAME DRIVER SCOPE bbb5e37b01e8 bridge bridge local 6550c72b075f docker_gwbridge bridge local 84baeb90cbb2 host host local 9i5hmgqr20jh ingress overlay swarm 7ab4c321bbe5 none null local
  47. 47. ⑤ Ingress Load Balancing マネージャ・ノード1 ワーカ・ノード1 ワーカ・ノード2 Manager node Worker node Worker node swarm クラスタ 192.168.39.1 (node-01) 192.168.39.2 (node-02) 192.168.39.3 (node-03) タスク (コンテナ) nginx Port 80(tcp) オーバレイ・ネットワーク Port 80(tcp) Ingress タスク (コンテナ) nginx Port 80(tcp) タスク (コンテナ) nginx Port 80(tcp)
  48. 48. 48
  49. 49. 49
  50. 50. 50
  51. 51. 51 https://alpinelinux.org/
  52. 52. 52 超小容量Linuxディストリビューション Alpine Linux $ docker images ls REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest a41a7446062d 11 days ago 3.96MB
  53. 53. 53
  54. 54. 54 FROM alpine:latest RUN apk update && apk add openssl Dockerfile
  55. 55. 55
  56. 56. 56
  57. 57. 57
  58. 58. 58 コンテナの サービス群を Composeで 梱包 する話でした。
  59. 59. サービスを梱包する話 Docker Compose 基本概念 Compose を YAML で動かす docker stack と swarm mode Compose
  60. 60. Compose v3 や swarm モードを始めるなら 今が旬ではないでしょうか
  61. 61. 私からは以上です ありがとうございました
  62. 62. 何か気になる所がありますか? ご参考:Docker 日本語ドキュメント http://docs.docker.jp/ http://slideshare.net/zembutsu twitter: @zembutsu

×