ドカドカDocker on AWS
黒田 裕己
Remixing with All About, Inc.
黒田 裕己
Server-side Engineer @ Richmedia
Outline
• Dockerとは?
• AWS EC2 Container Serviceについて
手作業で環境構築
なにを入れてどんな設定をしたか分からない!
Nginx Varnish
Apache
MySQL
Elasticsearch
Rails
PHP Node.js
インフラは状態管理がしづらい
開発環境と本番環境が異なるものになりがち
環境の配布はどうするか…
Production
Staging
Local A
Local B Local C
インフラは状態管理がしづらい
インフラは状態管理がしづらい
Chef・Ansibleで環境構築
99%同じだが、レポジトリが更新されたら…
yum install
varnish
yum install
varnish
Staging Production
Provisioning
_人人人人人人人人_
> ボクの出番? <
 ̄Y^Y^Y^Y^Y^Y^Y ̄
Dockerとは?
• Docker社のオープンソースプロダクト
• コンテナ技術により軽量で高速な仮想環境を作れる
InfrastructureInfrastructure
Host OSHost OS
Docker EngineHypervisor
Guest OS Guest OS
Bins / Libs Bins / Libs
App1 App2
Bins / Libs Bins / Libs
App1 App2
コンテナとは?
Docker ContainerVirtual Machine
ゲストOS内で稼働 プロセスとして稼働
どれくらい軽量で高速か?
Dockerのメリット
手作業で環境構築
なにを入れたか分からない
Nginx Varnish
Apache
MySQL
Elasticsearch
Rails
PHP
Node.js
Varnish
Apache
MySQL
Dockerfile
ソースコードで管理する
Dockerfile
FROM centos:centos6
RUN yum install httpd -y
RUN echo “Hello Docker” > /var/www/index.html
EXPOSE 80
CMD ["httpd", "-D", "FOREGROUND"]
docker build -t apache .
docker run -p 8080:80 apache
コンテナImage作成
コンテナ起動
問題:開発環境と本番環境が異なるものになりがち
コンテナのImageを配布することで完全に同一
Production
Staging
Local A
Local B Local C
Dockerのメリット
Container Image
インフラが特定のベンダーにとらわれない:可搬性
Dockerのメリット
etc…
アプリケーションを
小さなコンポーネントの集合にする
Web Mail Batch
Microservices
API v1 API v2 Push通知
HTTP API Message cue
Web Mail
Batch
Immutable Infrastructure
API
旧
PHP
Push通知
不変のインフラ
インフラを破棄・置き換えできるものと捉える
新
Golang
Push通知
_人人人人人人人人
> 100万Userに <
> Push通知辛い <
 ̄Y^Y^Y^Y^Y^Y
Web Mail
Batch
Immutable Infrastructure
API
旧
PHP
Push通知
不変のインフラ
インフラを破棄・置き換えできるものと捉える
新
Golang
Push通知
_人人人人人人_
> イケる! <
 ̄Y^Y^Y^Y^Y ̄
Docker Ecosystem
Docker Hub Registry - https://registry.hub.docker.com/
centos
(Base Image)
Apache
(name: httpd)
PHP
(name: httpd-php)
FROM httpd-php
ADD your-application
Your Application
Dockerfile
FROM httpd
RUN yum install php
FROM centos
RUN yum install httpd
Docker Ecosystem
centos
(Base Image)
Apache
(name: httpd)
PHP
(name: httpd-php)
FROM httpd-php
ADD your-application
Your Application
Dockerfile
FROM httpd-php
RUN yum install php
FROM httpd-php
RUN yum install httpd
GitHubで世界中のDeveloperが
OSSを開発したように
Docker Hub Registryで世界中のDeveloperが
インフラを開発して共有している
Docker Ecosystem
Open Container Project
https://www.opencontainers.org/
opencontainers / runc
https://github.com/opencontainers/runc
Docker で遊ぶ
Jenkins Repository : https://registry.hub.docker.com/_/jenkins/
Jenkins Repository : https://registry.hub.docker.com/_/jenkins/
docker run -p 8080:8080 -v /your/home:/var/jenkins_home jenkins
Docker で遊ぶ
AWS EC2 Container Service
• 4月にリリースとなったAWSの新しいサービス
• あらゆる規模においても、EC2クラスタ上で
Dockerを動作させることができる
AWS EC2 Container Service
• EC2がベースであるためElastic Load Balancing、Virtual Private
Cloud、IAM、および CloudTrail などと簡単に連携ができる
• Amazonで培った技術によりコンテナ数が数十だろうと数万で
あっても簡単に起動できる
Run Container on Cluster
Cluster : Web
Web1 Web2 Web3
_人人人人人人_> 発見! <
 ̄Y^Y^Y^Y^Y ̄
_人人人人人人_> 発見! <
 ̄Y^Y^Y^Y^Y ̄
_人人人人人人_> 発見! <
 ̄Y^Y^Y^Y^Y ̄
Blue Green Deployment
新機能 新機能
新機能 新機能
ELB
Blue Green Deployment
ELB
新機能 新機能
新機能 新機能
AWS EC2 と ECS の違い
• ECS Container AgentというEC2インスタンスの中で動く
エージェントが動作している
• このエージェントを通してContainerインスタンス内で稼働
するコンテナの開始や停止などの管理を行う
ECS のデメリット
• まだまだ発展途上のサービス
• マルチホスト時のログはどうするの?

 - Fluentdコンテナでログ送信
• マルチホスト時の Dynamic port mapping はどうするの?

 - 1 Server 1 Port 制約 → Consul + Registrator で管理
• コンテナの監視・死活管理はどうするの?
• Docker Registryは自前で立てるか、Quai.ioなど有料サービスか
HAIR Deployment
WebhookContainer Image
Container Deploy
Docker Registry
Build Dockerfile
Docker Registry
https://docs.docker.com/registry
まとめ
• Dockerとは

 - インフラをソースコードで管理でき、

- 同一性、可搬性があり、軽量で高速。
• AWS EC2 Container Serviceについて

- AWSサービスと連携して簡単にDockerを

実行できる
Let’s ドカドカ Docker !

ドカドカDocker on aws