Dockerでデプロイ
大城 聖也
自己紹介
株式会社シーエ・アドバンス
大城 聖也@おでん
2
業務内容
アメーバサービスの
監視システム
3
業務内容
オペレーターの分析レポート
4
普段は
JavaScript書いてます
5
たまに
Ruby(rails)とPHP
書いてます
6
今日話すこと
Docker Swarm mode
docker stack deploy
上記を使ったデプロイ方法
7
前提
Dockerってなに?とか
docker swarmってなに?とか
docker composeってなに?とか
8
知らない人
発表聞いて興味持ったら
懇親会で聞く or 調べて見てください
9
Docker Swarm modeについて
docker 1.12から入った機能
クラスタがかんたんに作れる
10
Docker Swarmとの比較
Swarm mode Docker Swarm
クラスタの管理 docker node コマンド Swarmマネージャーがノードを管理
クラスタ上のコンテナ操作 docker service コマンド SwarmマネージャーのAPIにアクセス
Swarmマネージャーの追加 不要 必要
KVSのセットアップ 不要 必要
クラスタ間の通信の暗号化 デフォルト有効 別途設定が必要
11
リソースプール
Docker
デーモン
ワーカー
Swarm
ノード
Docker
デーモン
ワーカー
Swarm
ノード
Docker
デーモン
ワーカー
Swarm
ノード
Docker Swarm概略図
Swarm
マネージャー KVS
ノード管理
12
リソースプール
Docker
デーモン
ワーカー
Swarm
ノード
Docker
デーモン
ワーカー
Swarm
ノード
Docker
デーモン
ワーカー
Swarm
ノード
Docker Swarm概略図
監視
Swarm
マネージャー KVS
ノード管理
13
リソースプール
Docker
デーモン
ワーカー
Swarm
ノード
Docker
デーモン
ワーカー
Swarm
ノード
Docker
デーモン
ワーカー
Swarm
ノード
Docker Swarm概略図
監視
Swarm
マネージャー KVS
ノード管理
情報参照
14
リソースプール
Docker
デーモン
ワーカー
Swarm
ノード
Docker
デーモン
ワーカー
Swarm
ノード
Docker
デーモン
ワーカー
Swarm
ノード
Docker Swarm概略図
監視
Swarm
マネージャー KVS
命令
ノード管理
情報参照
15
リソースプール
Docker Swarm mode概略図
Docker
デーモン
マネージャー
リーダー
KVS
Docker
デーモン
ワーカー
Docker
デーモン
ワーカー
Docker
デーモン
ワーカー
命令・監視
16
リソースプール
Docker Swarm mode概略図
Docker
デーモン
マネージャー
リーダー
KVS
Docker
デーモン
ワーカー
Docker
デーモン
ワーカー
Docker
デーモン
ワーカー
Docker
デーモン
マネージャー
KVS
Docker
デーモン
マネージャー
KVS
複製 複製
命令・監視
17
Docker Swarmとの比較
Swarm mode Docker Swarm
クラスタの管理 docker node コマンド Swarmマネージャーがノードを管理
クラスタ上のコンテナ操作 docker service コマンド SwarmマネージャーのAPIにアクセス
Swarmマネージャーの追加 不要 必要
KVSのセットアップ 不要 必要
クラスタ間の通信の暗号化 デフォルト有効 別途設定が必要
18
コンテナを実行する方法
変わりました
19
コンテナを実行するには
Serviceを定義する
20
使い方
例えば
nginxコンテナを2つ実行
ポートは80番を公開する
場合
21
Nginx(Port:80)
コンテナ
ホスト
192.168.99.100
Nginx(Port:80)
コンテナ
Serviceについて
http://192.168.99.100
22
Serviceについて
今まで同じポートに
複数コンテナ紐付けられなかったはず!
あとから起動するコンテナ
立ち上がらないはず!!
23
Nginx(Port:80)
コンテナ
ホスト
192.168.99.100
Nginx(Port:80)
コンテナ
Serviceについて
http://192.168.99.100
24
$ docker service create 
--replicas 2 
-p 80:80 
nginx:latest
Serviceコマンド
25
Nginx(Port:80)
コンテナ
ホスト
192.168.99.100
Nginx(Port:80)
コンテナ
Serviceについて
http://192.168.99.100
26
Ingressについて
Serviceでなんで同じポートに
複数コンテナを紐付けられるか?
27
Ingressについて
Ingress
(オーバーレイネットワーク )
http://192.168.99.100
ホスト
192.168.99.100
Nginx
(Port:80)
コンテナ
Nginx
(Port:80)
コンテナ
Serviceのネットワーク(Port: 80)
28
Ingressについて
Ingress(オーバーレイネットワーク )
ホスト
192.168.99.102
http://192.168.99.100 http://192.168.99.101 http://192.168.99.102
Nginx
コンテナ
Nginx
コンテナ
ホスト
192.168.99.101
Nginx
コンテナ
ホスト
192.168.99.100
Nginx
コンテナ
ServiceNetwork (Port: 80)
29
Ingressについて
Ingress(オーバーレイネットワーク )
ホスト
192.168.99.102
http://192.168.99.100 http://192.168.99.101 http://192.168.99.102
Nginx
コンテナ
Nginx
コンテナ
ホスト
192.168.99.101
Nginx
コンテナ
ホスト
192.168.99.100
ServiceNetwork (Port: 80)
30
1台でもSwarmモード使う?
ロードバランサー使用可能
ローリングアップデート可能
31
Docker Swarm modeについて
下記で色々お試してます
Docker swarmモードを試してみた
32
docker stack deployについて
docker 1.13から入った機能
docker-compose.ymlに
デプロイ設定が記述できる
33
追加された設定
デプロイするコンテナ数
同時に更新かけるコンテナの数
次の更新を行うまでの待ち時間
リスタートのポリシー: 失敗した時
34
検討中の構成
Swarm modeでクラスタ化
stackでservice定義管理
常時2つのappコンテナ立てておいて
ローリングアップデートする
35
検討中の構成図
ホスト 192.168.99.100
App Service (Port:80)
App コンテナApp コンテナ
Ingress(オーバーレイネットワーク )
ブラウザ
App Service Network
36
Swarmモード初期化
$ docker swarm init 
--advertise-addr 
192.168.99.100
37
構成図
ホスト 192.168.99.100
Ingress(オーバーレイネットワーク )
ブラウザ
38
設定ファイル
version: '3' # フォーマットのバージョン
services: # サービス定義
app: # appサービス
image: my-registry/app:latest # 使用するイメージ名
ports: # 外とつなぐポート設定
- '80:80' # 外部に晒すポート:コンテナのポート
deploy: # stack deployの設定
replicas: 2 # コンテナ数
update_config: # アップデートの設定
parallelism: 1 # 同時に更新かけるコンテナの数
delay: 10s # 次の更新を行うまでの待ち時間
restart_policy: # リスタートのポリシー
condition: on-failure # 失敗した時
docker-compose.yml
39
デプロイコマンド
$ docker stack deploy 
--compose-file docker-compose.yml 
app
40
こうなる
ホスト 192.168.99.100
App Service (Port:80)
App コンテナApp コンテナ
Ingress(オーバーレイネットワーク )
ブラウザ
App Service Network
41
修正加えてビルド&プッシュ
$ docker build -t my-registry/app:v1.1 .
$ docker push my-registry/app:v1.1
42
設定ファイル
version: '3' # フォーマットのバージョン
services: # サービス定義
app: # appサービス
image: my-registry/app:v1.1 # 使用するイメージ名
ports: # 外とつなぐポート設定
- '80:80' # 外部に晒すポート:コンテナのポート
deploy: # stack deployの設定
replicas: 2 # コンテナ数
update_config: # アップデートの設定
parallelism: 1 # 同時に更新かけるコンテナの数
delay: 10s # 次の更新を行うまでの待ち時間
restart_policy: # リスタートのポリシー
condition: on-failure # 失敗した時
docker-compose.yml
43
デプロイ
$ docker stack deploy 
--compose-file docker-compose.yml 
app
使用するイメージのタグを変えてから
44
ローリングアップデート開始
ホスト 192.168.99.100
App Service (Port:80)
App コンテナApp コンテナ
Ingress(オーバーレイネットワーク )
ブラウザ
App Service Network
45
1つ目のコンテナの更新
ホスト 192.168.99.100
App Service (Port:80)
App コンテナ
Ingress(オーバーレイネットワーク )
ブラウザ
App Service Network
46
1つ目のコンテナ交換完了
ホスト 192.168.99.100
App Service (Port:80)
App コンテナApp コンテナv1.1
Ingress(オーバーレイネットワーク )
ブラウザ
App Service Network
47
ホスト 192.168.99.100
10秒待ち
ブラウザ
App Service (Port:80)
App コンテナ
Ingress(オーバーレイネットワーク )
新App コンテナ
ホスト 192.168.99.100
App Service (Port:80)
App コンテナApp コンテナv1.1
Ingress(オーバーレイネットワーク )
ブラウザ
App Service Network
48
次のコンテナ更新
ホスト 192.168.99.100
App Service (Port:80)
App コンテナv1.1
Ingress(オーバーレイネットワーク )
ブラウザ
App Service Network
49
デプロイの完了
ホスト 192.168.99.100
App Service (Port:80)
App コンテナv1.1App コンテナv1.1
Ingress(オーバーレイネットワーク )
ブラウザ
App Service Network
50
サンプル紹介
https://github.com/togana/sam
ple-docker-deploy
51
Docker Swarm mode まとめ
Docker Swarmより構築に必要なもの減少!
LoadBalancerが内包された!
ローリングアップデートが可能に!
Serviceというコンテナ実行の定義ができた!
52
docker stack deploy まとめ
Stackにデプロイ定義が書ける!
docker-compose.ymlがほぼそのまま使える!
buildが使えなくなりimageのみになった!
(↑docker stack deployをするときのみ)
53
まとめ
Dockerの進化がすごい!
ecsとかkubernetesとかが使えない場合でも
デプロイやりやすくなっている!
54

Dockerでデプロイ