SlideShare uma empresa Scribd logo
1 de 45
Baixar para ler offline
開発環境のDocker化
http://www.lancers.jp/
「時間と場所にとらわれない、新しい働き方を創る」
[2016/03/30 dots. IT勉強会]
ランサーズ株式会社
インフラエンジニア
金澤 裕毅 [Kanazawa Yuki]
© 2016 for LANCERS, inc All Rights Reserved
自己紹介
• 氏名
• 金澤 裕毅
• 入社時期
• 2013年11月
• 業務内容
• ランサーズの運用監視
• AWS全般
• 開発支援
• 開発環境構築
• インフラ関連の支援
• 情報システム業務
• 社内LAN構築
• 社内サーバー運用
• PC関連
• その他
• 趣味
• 将棋とか(一応初段)
© 2016 for LANCERS, inc All Rights Reserved
本日お話しさせていただく内容
ランサーズ開発環境の歴史
Docker導入の経緯
Docker導入の基本方針
直面した問題とその解決方法
Docker移行結果
今後の展望
© 2016 for LANCERS, inc All Rights Reserved
ランサーズ開発環境の歴史
Docker導入の基本方針
直面した問題とその解決方法
Docker移行結果
今後の展望
Docker導入の経緯
© 2016 for LANCERS, inc All Rights Reserved
ランサーズ開発環境の歴史(2008 ~ 2010)
• 開発人数:2人
• PC環境
• Windowsデスクトップ
• 開発環境
• Linuxサーバーに直接ログイン
• CentOS
• 開発ツール
• ソース管理:SVN
• 直接ログインしてVimで開発
© 2016 for LANCERS, inc All Rights Reserved
ランサーズ開発環境の歴史(2011 ~ 2013)
• 開発人数:4人~10人
• PC環境
• Windowsデスクトップ
• デザイナーはMac
• 開発環境
• 社内開発サーバー(VMWare ESXi)
• 開発ツール
• ソース管理:SVN
• 直接ログインしてVimで開発
• ssh経由でIDEを使う人も
© 2016 for LANCERS, inc All Rights Reserved
ランサーズ開発環境の歴史(2014 ~ 2015)
• 開発人数:10人~20人
• PC環境
• Windowsデスクトップ
• エンジニアもMacに移行し始める
• 開発環境
• VirtualBox + Vagrant
• Ansibleで個人PC内に開発環境を構築
• 開発ツール
• ソース管理:SVN→Githubに移行
• PC上のエディタで開発
• VirtualBox共有フォルダ
• PHP Stormでデバッグする人も
© 2016 for LANCERS, inc All Rights Reserved
ランサーズ開発環境の歴史(2016 ~ )
• 開発人数:20人以上
• PC環境
• ほとんどMac
• Windowsは数人
• 開発環境
• VirtualBox + Docker Toolbox
• Dockerfile + Ansibleでコンテナ構築
• 開発ツール
• ソース管理:Github
• PC上のエディタで開発
• VirtualBox共有フォルダ + Dockerマウント
• PHP Stormのデバッグも可能
© 2016 for LANCERS, inc All Rights Reserved
Docker導入の経緯
Docker導入の基本方針
直面した問題とその解決方法
Docker移行結果
今後の展望
ランサーズ開発環境の歴史
© 2016 for LANCERS, inc All Rights Reserved
Vagrant + Ansible時代の開発環境構成
192.168.33.11
HDD 50GB
メモリ 2GB
App(ランサーズ本体)
Apache 2.2 (80)
PHP 5.3
MySQL 5.6 (3306)
Memcached(11211)
Virtual Box VM
CentOS 6
© 2016 for LANCERS, inc All Rights Reserved
Vagrant + Ansible時代の開発環境構成
192.168.33.11
HDD 50GB
メモリ 2GB
App(ランサーズ本体)
Apache 2.2 (80)
PHP 5.3
MySQL 5.6 (3306)
Memcached(11211)
192.168.33.12
HDD 50GB
メモリ 1GB
メッセージ(チャット)
Nginx(3443)
node.js(3001)
Redis(6379)
Virtual Box VM
CentOS 6
© 2016 for LANCERS, inc All Rights Reserved
Vagrant + Ansible時代の開発環境構成
192.168.33.11
HDD 50GB
メモリ 2GB
App(ランサーズ本体)
Apache 2.2 (80)
PHP 5.3
MySQL 5.6 (3306)
Memcached(11211)
192.168.33.13
HDD 50GB
メモリ 1GB
WordPress
(コーポレート、ブログ等)
Apache 2.4(80)
PHP 5.5
MySQL 5.6(3306)
192.168.33.12
HDD 50GB
メモリ 1GB
メッセージ(チャット)
Nginx(3443)
node.js(3001)
Redis(6379)
Virtual Box VM
CentOS 6
© 2016 for LANCERS, inc All Rights Reserved
Vagrant + Ansible時代の開発環境構成
192.168.33.11
HDD 50GB
メモリ 2GB
App(ランサーズ本体)
Apache 2.2 (80)
PHP 5.3
MySQL 5.6 (3306)
Memcached(11211)
192.168.33.13
HDD 50GB
メモリ 1GB
WordPress
(コーポレート、ブログ等)
Apache 2.4(80)
PHP 5.5
MySQL 5.6(3306)
192.168.33.12
HDD 50GB
メモリ 1GB
メッセージ(チャット)
Nginx(3443)
node.js(3001)
Redis(6379)
192.168.33.15
HDD 50GB
メモリ 1GB
認証システム
Virtual Box VM
CentOS 6
© 2016 for LANCERS, inc All Rights Reserved
VMを1つにまとめる
192.168.33.11
HDD 50GB
メモリ 2GB
App(ランサーズ本体)
Apache 2.2 (80)
PHP 5.3
MySQL 5.6 (3306)
Memcached(11211)
Virtual Box VM
CentOS 6
© 2016 for LANCERS, inc All Rights Reserved
VMを1つにまとめる
192.168.33.11
HDD 50GB
メモリ 2GB
App(ランサーズ本体)
Apache 2.2 (80)
PHP 5.3
MySQL 5.6 (3306)
Memcached(11211)
メッセージ(チャット)
Nginx(3443)
node.js(3001)
Redis(6379)
Virtual Box VM
CentOS 6
© 2016 for LANCERS, inc All Rights Reserved
VMを1つにまとめる
192.168.33.11
HDD 50GB
メモリ 2GB
App(ランサーズ本体)
Apache 2.2 (80)
PHP 5.3
MySQL 5.6 (3306)
Memcached(11211)
メッセージ(チャット)
Nginx(3443)
node.js(3001)
Redis(6379)
WordPress
Apache 2.4(80)
PHP 5.5
MySQL 5.6(3306)
Virtual Box VM
CentOS 6
© 2016 for LANCERS, inc All Rights Reserved
Vagrant + Ansible時代の問題点
• 構築に時間がかかる
• PHP、MySQLのビルド時間:1.5時間
• MySQLのインポート時間:2.5時間以上
• 構成更新時の問題
• Appサーバーに新しいミドルウェアを追加
• Ansible Playbookにプルリクを投げる
• 誰が検証するの?
• 検証中は開発できない
• 再構築も時間がかかる(元に戻らないリスクも)
• 誰もPlaybookを更新しなくなる
• 更新差分は手動でカバー
• 原因不明のエラーがさらに増える
• DB構成の変更
• 都度、手動でALTER TABLE、INSERT、UPDATEを実行
• 抜け漏れがあると復元困難に
• Windows環境での構築が不安定
• VitualBox、Vagrant、Ansibleのバージョン相性がシビア
• 成功率50%以下
© 2016 for LANCERS, inc All Rights Reserved
Docker導入の基本方針
Docker導入の経緯
直面した問題とその解決方法
Docker移行結果
今後の展望
ランサーズ開発環境の歴史
© 2016 for LANCERS, inc All Rights Reserved
Docker導入の基本指針
• 利用面
• Vagrant時代の利便性を維持
• PC上のエディタで開発可能
• SQLクライアントでDB参照可能
• PHPStorm(Xdebug)でステップ実行可能
• 個人で構築はしない
• コンテナをpullするだけ
• MySQLもDBインポート済のものをpull
• コンテナ構築は特定の人が行う
• 当日から開発可能にする
• 構築時間は30分以内に抑える
• 非エンジニアでも簡単に構築可能に
• 構成面
• HDD20GB、メモリ2GBのVMで動作可能
• 本番環境と極力同じ構成にする
• 本番サーバーと共通のAnsible Playbookを使う
© 2016 for LANCERS, inc All Rights Reserved
ランサーズの本番環境
EC2
App S3
ELB
EC2
instance
Wordpress
CloudFront
SQS
Cloud Search
Route53
EC2
instance
WebSocket
ランサーズ
コーポレート
ブログ
オウンドメディア
ErastiCache
Memcached
ErastiCache
Redis
Aurora
Reader
Aurora
Writer
メッセージ
• EC2は固定IPで運用
© 2016 for LANCERS, inc All Rights Reserved
Dockerを使った開発環境構成
192.168.99.100
HDD 50GB
メモリ 2GB
172.17.6.11
App(ランサーズ本体)
Apache 2.2 (80)
PHP 5.3
172.17.4.51
WordPress
(コーポレート、ブログ等)
Apache 2.4(80)
PHP 5.5
172.17.106.55
認証システム
Nginx (443)
Unicorn (3000)
172.17.4.152
メッセージ(チャット)
Nginx(3443)
node.js (3001)
172.17.50.11
ELBエミュレーション
Apache 2.2 (80)
172.17.51.11
RDSエミュレーション
MySQL 5.6(3306)
172.17.52.12
ErastiCache
エミュレーション
Redis(6379)
172.17.52.11
ErastiCache
エミュレーション
Memcached(11211)
マネージド系コンテナ
Dockerfileで構築
EC2系コンテナ
Dockerfile + Ansible
で構築
Docker
リポジトリ
ディレクトリ
共有
© 2016 for LANCERS, inc All Rights Reserved
Dockerを使った開発環境構成
Virtualbox VM
Docker Machine
172.17.6.11
App
ランサーズ本体
172.17.4.51
WordPress
コーポレート、ブログ
SSH
172.17.51.11
MySQL
3306 9000
172.17.4.152
WebSocket
メッセージサービス
ディレクトリ
共有
SQLクライアント 開発環境(エディタ)ターミナル
• Vagrant時代の利便性を維持
© 2016 for LANCERS, inc All Rights Reserved
コンテナ更新のフロー
EC2
MySQLデータ
開発用データ
App
Ansible
WordPress MySQL
WebSocket
WordPress
App WebSocket
MySQL
Registry
Registry
旧開発サーバーを
CoreOS化
Playbook
docker
push
docker
pull
docker
build
Docker Registry
コンテナ
© 2016 for LANCERS, inc All Rights Reserved
直面した問題とその解決方法
Docker導入の経緯
Docker導入の基本方針
Docker移行結果
今後の展望
ランサーズ開発環境の歴史
© 2016 for LANCERS, inc All Rights Reserved
Dockerの思想
• 1コンテナ1サービス
• フォアグラウンドでサービスを起動
• sshdは稼働しない
• コンテナは極力軽く
• 固定IPではない
• Dockerが動的にIPを割り当てる
© 2016 for LANCERS, inc All Rights Reserved
Dockerの思想を回避
• 1コンテナ1サービス
• →細工して複数サービスを起動
• フォアグラウンドでサービスを起動
• →細工してバックグラウンドで起動
• sshdは稼働しない
• → SSHでログイン
• AnsibleもSSH経由で実行
• コンテナは極力軽く
• → MySQLのデータをインポート
• 数GBのコンテナが誕生
• 固定IPではない
• Dockerが動的にIPを割り当てる
• →加えて固定IPを付与
© 2016 for LANCERS, inc All Rights Reserved
複数サービスをバックグラウンド起動
• docker run時に起動用シェルを常駐
• 起動用シェル内に複数サービスを記述
#!/bin/sh
/sbin/service sshd start
/sbin/service httpd start
while true
do
sleep 10
done
service.sh
# service.shをコンテナに配置
COPY ./service.sh /root/
RUN chmod 744 /root/service.sh
# 起動時にservice.shを実行
CMD ["/root/service.sh"]
Dockerfile
© 2016 for LANCERS, inc All Rights Reserved
固定IPの付与
• docker run、docker start後にdocker execコマンドで付与
• ip addr add で付与(CentOS6の場合)
172.17.0.2
ELB
DOCKER_ID=$(docker inspect --format="{{.Id}}" $DOCKER_NAME)
IP_STATIC=172.17.51.11
NIC=eth0
docker exec $DOCKER_ID ip addr add $IP_STATIC/16 dev $NIC
172.17.0.2
172.17.51.11
ELB
IMAGE_NAME=elb:latest
DOCKER_NAME=elb-50-11
docker run ¥
--name $DOCKER_NAME ¥
--hostname $DOCKER_NAME ¥
…
起動時に
Dockerが動的に
IPを付与
起動後に
ip addrで固定
IPを付与
© 2016 for LANCERS, inc All Rights Reserved
コンテナのビルド
• マネージド系のサービスはDockerfileのみで構築
• EC2で構築するサービスはDockerfile + Ansibleで構築
• 本番EC2と共通のPlaybookを利用
• Ansible用のコンテナを用意(コンテナ間でssh接続)
EC2
ELB
Ansible
MySQL
Registry
Playbook
docker
push
docker
tag
MySQLデータ開発用データ
Base
CentOS6
App
ansible
Docker
Shell
docker
build
DBインポートした
イメージを
commit
© 2016 for LANCERS, inc All Rights Reserved
Docker Registryコンテナ
Ansible
各種コンテナ 各種コンテナ
RegistryRegistry
docker
push
docker
pull
docker build
docker run -d ¥
--name registry ¥
-p 5000:5000 ¥
-e REGISTRY_STORAGE_S3_ACCESSKEY=XXXXXXXX ¥
-e REGISTRY_STORAGE_S3_SECRETKEY=xxxxxxxx ¥
-e REGISTRY_STORAGE_S3_BUCKET=docker-registory-lancers ¥
-e REGISTRY_STORAGE_S3_REGION=ap-northeast-1 ¥
-e REGISTRY_STORAGE_S3_ROOTDIRECTORY=/ ¥
-e REGISTRY_STORAGE=s3 ¥
registry:2.2
• Docker Hub等のリポジトリはほとんどが海外
• 巨大コンテナ(MySQLとか)の受け渡しに時間がかかる
• Docker Registoryコンテナを起動して東京RのS3に格納
Docker
Shell
ansible
Playbook
© 2016 for LANCERS, inc All Rights Reserved
ELBコンテナ
• SSL Terminateをエミュレートしたリバースプロキシ
• プロキシ時にX-Forwarded Protoヘッダを追加
• ログイン時のhttps強制リダイレクト判定で利用
EC2
App
ELB
EC2
instance
wordpress
Route53
App WordPress
ELB
SSL
Terminate
<VirtualHost *:80>
ServerName dev.lancers.jp
ServerAlias *.lancers.jp
RequestHeader set X-Forwarded-Proto "http"
RewriteEngine On
RewriteCond %{SERVER_NAME} ^(.*).lancers.jp$
RewriteRule ^/(.*) http://%1.lancers.jp/$1 [P,L,QSA]
</VirtualHost>
<VirtualHost *:443>
ServerName dev.lancers.jp
ServerAlias *.lancers.jp
…
SSLCertificateKeyFile /etc/pki/tls/private/lancers.jp.key
RequestHeader set X-Forwarded-Proto "https"
RewriteEngine On
RewriteCond %{SERVER_NAME} ^(.*).lancers.jp$
RewriteRule ^/(.*) http://%1.lancers.jp/$1 [P,L,QSA]
</VirtualHost>
<VirtualHost *:80>
ServerName dev.lancers.co.jp
ServerAlias *.lancers.co.jp
RequestHeader set X-Forwarded-Proto "http"
RewriteEngine On
RewriteCond %{SERVER_NAME} ^(.*).lancers.co.jp$
RewriteRule ^/(.*) http://%1.lancers.co.jp/$1 [P,L,QSA]
</VirtualHost>
hosts
https://www.lancers.jp/
http://www.lancers.co.jp
https://dev.lancers.jp
http://dev.lancers.co.jp
http://dev.lancers.co.jp
http://dev.lancers.jp
http://www.lancers.jp/
https→http変換
© 2016 for LANCERS, inc All Rights Reserved
共有フォルダ設定
• Vagrant時代の利便性を維持
• PC上のエディタで開発可能
• VirtualBoxの共有フォルダ設定
+
• docker run時のマウント設定
AppWordPress WebSocket
ディレクトリ
共有
開発環境(エディタ)
docker run ¥
--name $DOCKER_NAME ¥
-v /Users/www:/var/www ¥
--hostname $DOCKER_NAME ¥
--privileged ¥
-d $IMAGE_NAME
© 2016 for LANCERS, inc All Rights Reserved
ポートフォワーディング設定
• Vagrant時代の利便性を維持
• PC上のSQLクライアントから直接アクセス可能
172.17.6.11
App
172.17.4.51
WordPress
172.17.51.11
MySQL
3306
172.17.4.152
WebSocket
SQLクライアント
172.17.4.51
ELB
WWWブラウザ
443
80
3443
IMAGE_NAME=mysql:latest
DOCKER_NAME=mysql-51-11
IP_STATIC=172.17.51.11
PORT=3306
docker run ¥
--name $DOCKER_NAME ¥
--hostname $DOCKER_NAME ¥
-p $PORT:$PORT ¥
…
© 2016 for LANCERS, inc All Rights Reserved
コンテナ起動スクリプト
IMAGE_NAME=elb:latest
DOCKER_NAME=elb-50-11
IP_STATIC=172.17.50.11
PORT=80
PORT2=443
docker run ¥
--name $DOCKER_NAME ¥
--hostname $DOCKER_NAME ¥
-p $PORT:$PORT ¥
-p $PORT2:$PORT2 ¥
--add-host=dev.lancers.jp:172.17.6.11 ¥
…
--add-host=dev-img.lancers.jp:172.17.6.11 ¥
…
--add-host=dev-wst.lancers.jp:172.17.4.152 ¥
…
--add-host=dev.lancers.co.jp:172.17.4.51 ¥
--privileged ¥
-d $IMAGE_NAME
DOCKER_ID=$(docker inspect --format="{{.Id}}" $DOCKER_NAME)
DIR=$(cd $(dirname $0); pwd)
cd $DIR
. ../function.sh
set_timezone "Japan"
set_static_ip "$IP_STATIC"
set_timezone() {
docker exec $DOCKER_ID ¥cp -f /usr/share/zoneinfo/$1 /etc/localtime
}
set_static_ip() {
IP_STATIC=$1
NIC_CENTOS6=eth0
docker exec $DOCKER_ID ip addr add $IP_STATIC/16 dev $NIC_CENTOS6
}
ポートフォワーディング設定
hosts設定
(Dockerfileで設定不可)
run.sh
function.sh
固定IPの付与
TimeZone設定
(Dockerfileで設定不可)
• 非エンジニアでも操作できる仕組み
• dockerコマンドを使わず、シェル1発で起動
© 2016 for LANCERS, inc All Rights Reserved
コンテナ更新スクリプト
#!/bin/sh
REGISTORY=localhost:5000
REPOSITORY=websocket
TAG=latest
DOCKER_NAME=websocket-4-152
DIR=$(cd $(dirname $0); pwd)
cd $DIR
. ../function.sh
set -x
./stop.sh rm
update_image "$REGISTORY" "$REPOSITORY" "$TAG" " $DOCKER_NAME"
./run.sh
update_image() {
REGISTORY=$1
REPOSITORY=$2
TAG=$3
DOCKER_NAME=$4
IMAGE_ID=$(docker images | grep $REGISTORY | grep
$REPOSITORY | grep $TAG | awk '{print $3}')
docker rmi -f $IMAGE_ID
docker start registry
sleep 5
docker pull $REGISTORY/$REPOSITORY:$TAG
docker tag $REGISTORY/$REPOSITORY:$TAG $REPOSITORY:$TAG
}
#!/bin/sh
DOCKER_NAME=websocket-4-152
docker stop $DOCKER_NAME
if [ "${1}" = "rm" ]; then
docker rm $DOCKER_NAME
fi
update.sh
function.sh
stop.sh
コンテナプロセス
削除
レジストリコンテナ
起動
コンテナプロセス
停止
コンテナイメージ
削除
コンテナイメージ
ダウンロード
コンテナイメージ
タグ設定
• シェル1発で一連の更新処理を実行(もっと効率化できるかも)
コンテナプロセス
起動
コンテナプロセス
停止&削除
コンテナイメージ
更新
© 2016 for LANCERS, inc All Rights Reserved
Docker移行結果
Docker導入の経緯
Docker導入の基本方針
直面した問題とその解決方法
今後の展望
ランサーズ開発環境の歴史
© 2016 for LANCERS, inc All Rights Reserved
コンテナあたりのリソース消費量
コンテナ メモリ使用量 ストレージ使用量
MySQL 819.8MB 6351.0MB
App 657.0MB 812.7MB
ELB 20.09MB 426.6MB
WebSocket 18.46MB 886.1MB
Memcached 26.71MB 348.7MB
Redis 10.28MB 558.6MB
WordPress 161.3MB 832.1MB
KPI 21.59MB 576.3MB
Registry 16.42MB 223.4MB
合計 1751.65MB ≒ 1.75GB 11015.5MB ≒ 11GB
• VMサイズ
• HDD:20GB
• メモリ:2GB
ランサーズ稼働に
最低限必要なコンテナ
レジストリコンテナの
メモリ消費は20MB以下
© 2016 for LANCERS, inc All Rights Reserved
運用の効率化
Vagrant + Ansible時代 Docker時代
開発環境構築方法 個々でAnsibleで構築 特定の人が構築してpush
個々で構築済のコンテナをpull
構築時間 4時間以上or不可能 約30分
開発方法 PC上のエディタで開発
VirtualBox共有フォルダ
PC上のエディタで開発
VirtualBox共有フォルダ+Dockerマウント
XDebugステップ実行 可能 可能
DBのデータ構造変更 手動でSQL実行 MySQLコンテナを破棄&pull
※データを元に戻すのにも重宝
ミドルウェア追加 手動でインストール Appコンテナを破棄&pull
• 構築時間の大幅短縮
• コンテナの破棄&pullは予想以上に便利な機能
© 2016 for LANCERS, inc All Rights Reserved
Windows環境
• 確実に構築できるようになった
• ランサーへの開発依頼もスムーズに
• 構成
• Docker ToolBox
• Cygwin
• unzip
• zip
• git
• openssh
• curl
• TeraTerm(Cygterm)
© 2016 for LANCERS, inc All Rights Reserved
構築手順書
• GitHub Wikiに手順を集約
• リモートでも構築しやすい環境に
© 2016 for LANCERS, inc All Rights Reserved
今後の展望
Docker導入の経緯
Docker導入の基本方針
直面した問題とその解決方法
Docker移行結果
ランサーズ開発環境の歴史
© 2016 for LANCERS, inc All Rights Reserved
新技術の追従
• ※メリットを吟味しながら採用を検討したい
• Docker Compose
• シェルの処理を全部置き換えられれば
• 固定IPの付与とか
• Ansible Docker Connection Plugin
• SSHを使わずに構築可能
• Docker for Mac/Windows
• VirtualBoxが不要に
© 2016 for LANCERS, inc All Rights Reserved
コンテナの軽量化
• ※本番環境との互換性を考慮しながら進めたい
• データボリュームコンテナへ分離
• MySQLコンテナ(約1GB)
• MySQLデータコンテナ(約5GB)
• 軽量OSの利用
• サービスの削除
• sshdとか
© 2016 for LANCERS, inc All Rights Reserved
本番環境への対応
• ※メリットが明確になれば検討するかも
• 前準備
• 固定IPをやめる
• 内部DNSの導入
• Immutable化
• sshdが不要に
• オートスケーリングの後処理が不要に
• コンテナを直接デプロイする仕組み
• コンテナの軽量化は必須
• AWSのDocker対応サービスの採用も視野
• Elastic BeansTalk
• ECS(EC2 Container Service)
ご清聴ありがとうございました!
ランサーズ株式会社
インフラエンジニア
金澤 裕毅 [Kanazawa Yuki]
「時間と場所にとらわれない、新しい働き方を創る」
[2016/03/30 dots. IT勉強会]
http://www.lancers.jp/

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

Dockerと継続的インテグレーション
Dockerと継続的インテグレーションDockerと継続的インテグレーション
Dockerと継続的インテグレーション
 
Using LXC on Production
Using LXC on ProductionUsing LXC on Production
Using LXC on Production
 
Dockerで開発環境をデリバる
Dockerで開発環境をデリバるDockerで開発環境をデリバる
Dockerで開発環境をデリバる
 
ECS-CLI in Action
ECS-CLI in ActionECS-CLI in Action
ECS-CLI in Action
 
Docker向け軽量os 3製品比較
Docker向け軽量os 3製品比較Docker向け軽量os 3製品比較
Docker向け軽量os 3製品比較
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
 
Ansibleを使ってdockerコンテナをプロビジョニングする
Ansibleを使ってdockerコンテナをプロビジョニングするAnsibleを使ってdockerコンテナをプロビジョニングする
Ansibleを使ってdockerコンテナをプロビジョニングする
 
Docker & Kubernetes基礎
Docker & Kubernetes基礎Docker & Kubernetes基礎
Docker & Kubernetes基礎
 
Dockerを社内で使うために
Dockerを社内で使うためにDockerを社内で使うために
Dockerを社内で使うために
 
VagrantユーザのためのDocker入門
VagrantユーザのためのDocker入門VagrantユーザのためのDocker入門
VagrantユーザのためのDocker入門
 
今日から始めるDigitalOcean
今日から始めるDigitalOcean今日から始めるDigitalOcean
今日から始めるDigitalOcean
 
Docker, Kubernetes and OpenShift v3
Docker, Kubernetes and OpenShift v3Docker, Kubernetes and OpenShift v3
Docker, Kubernetes and OpenShift v3
 
Rancher command line interface
Rancher command line interfaceRancher command line interface
Rancher command line interface
 
普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見
 
Rancher/Kubernetes入門ハンズオン資料~第2回さくらとコンテナの夕べ #さくらの夕べ 番外編
 Rancher/Kubernetes入門ハンズオン資料~第2回さくらとコンテナの夕べ #さくらの夕べ 番外編 Rancher/Kubernetes入門ハンズオン資料~第2回さくらとコンテナの夕べ #さくらの夕べ 番外編
Rancher/Kubernetes入門ハンズオン資料~第2回さくらとコンテナの夕べ #さくらの夕べ 番外編
 
IBM Log Analysis with LogDNAを評価した話
 IBM Log Analysis with LogDNAを評価した話 IBM Log Analysis with LogDNAを評価した話
IBM Log Analysis with LogDNAを評価した話
 
DockerからKubernetesへのシフト
DockerからKubernetesへのシフトDockerからKubernetesへのシフト
DockerからKubernetesへのシフト
 
コンテナ時代だからこそ要注目! Cloud Foundry
コンテナ時代だからこそ要注目! Cloud Foundryコンテナ時代だからこそ要注目! Cloud Foundry
コンテナ時代だからこそ要注目! Cloud Foundry
 
Wocker 秒速で WordPress 開発環境を構築する
Wocker 秒速で WordPress 開発環境を構築するWocker 秒速で WordPress 開発環境を構築する
Wocker 秒速で WordPress 開発環境を構築する
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!
 

Destaque

OSC 2014 Tokyo/Spring さくらの社長が語る!「さくらのクラウド」でのウェブサービスかんたん運用術~Dockerをつかってみた~
OSC 2014 Tokyo/Spring さくらの社長が語る!「さくらのクラウド」でのウェブサービスかんたん運用術~Dockerをつかってみた~OSC 2014 Tokyo/Spring さくらの社長が語る!「さくらのクラウド」でのウェブサービスかんたん運用術~Dockerをつかってみた~
OSC 2014 Tokyo/Spring さくらの社長が語る!「さくらのクラウド」でのウェブサービスかんたん運用術~Dockerをつかってみた~
Kunihiro TANAKA
 

Destaque (20)

RubyでRoombaをハックする
RubyでRoombaをハックするRubyでRoombaをハックする
RubyでRoombaをハックする
 
Docker composeで開発環境をメンバに配布せよ
Docker composeで開発環境をメンバに配布せよDocker composeで開発環境をメンバに配布せよ
Docker composeで開発環境をメンバに配布せよ
 
Dockerの基本と応用~快適コンテナライフを実現するArukas~
Dockerの基本と応用~快適コンテナライフを実現するArukas~Dockerの基本と応用~快適コンテナライフを実現するArukas~
Dockerの基本と応用~快適コンテナライフを実現するArukas~
 
捕鯨!詳解docker
捕鯨!詳解docker捕鯨!詳解docker
捕鯨!詳解docker
 
Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会Docker with RHEL7 技術勉強会
Docker with RHEL7 技術勉強会
 
Docker Community Edition & Enterprise Edition
Docker Community Edition & Enterprise EditionDocker Community Edition & Enterprise Edition
Docker Community Edition & Enterprise Edition
 
What's New in Docker Enterprise Edition (in Japanese)
What's New in Docker Enterprise Edition (in Japanese)What's New in Docker Enterprise Edition (in Japanese)
What's New in Docker Enterprise Edition (in Japanese)
 
Docker技術情報アップデート 2015年7月号
Docker技術情報アップデート 2015年7月号Docker技術情報アップデート 2015年7月号
Docker技術情報アップデート 2015年7月号
 
paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺
 
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
 
2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜
2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜
2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜
 
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
 
Dockerのネットワークについて
DockerのネットワークについてDockerのネットワークについて
Dockerのネットワークについて
 
Docker hands on nifty sakura jul19
Docker hands on nifty sakura jul19Docker hands on nifty sakura jul19
Docker hands on nifty sakura jul19
 
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
 
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
 
Docker事始めと最新動向 2015年6月
Docker事始めと最新動向 2015年6月Docker事始めと最新動向 2015年6月
Docker事始めと最新動向 2015年6月
 
Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と swarm モードの紹介
Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と swarm モードの紹介Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と swarm モードの紹介
Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と swarm モードの紹介
 
OSC 2014 Tokyo/Spring さくらの社長が語る!「さくらのクラウド」でのウェブサービスかんたん運用術~Dockerをつかってみた~
OSC 2014 Tokyo/Spring さくらの社長が語る!「さくらのクラウド」でのウェブサービスかんたん運用術~Dockerをつかってみた~OSC 2014 Tokyo/Spring さくらの社長が語る!「さくらのクラウド」でのウェブサービスかんたん運用術~Dockerをつかってみた~
OSC 2014 Tokyo/Spring さくらの社長が語る!「さくらのクラウド」でのウェブサービスかんたん運用術~Dockerをつかってみた~
 
8a1#19[はじめてのdocker] 公開版
8a1#19[はじめてのdocker] 公開版8a1#19[はじめてのdocker] 公開版
8a1#19[はじめてのdocker] 公開版
 

Semelhante a 【dots. IT勉強会】開発環境のDocker化

WordBench Nagoya 12月勉強会
WordBench Nagoya 12月勉強会WordBench Nagoya 12月勉強会
WordBench Nagoya 12月勉強会
Masaki Takeda
 
AWS re:Invent 2013 参加報告(新サービスとセッション)
AWS re:Invent 2013 参加報告(新サービスとセッション)AWS re:Invent 2013 参加報告(新サービスとセッション)
AWS re:Invent 2013 参加報告(新サービスとセッション)
Akio Katayama
 
第29回長岡開発者勉強会
第29回長岡開発者勉強会第29回長岡開発者勉強会
第29回長岡開発者勉強会
Masaki Takeda
 
Apache cloudstack4.0インストール
Apache cloudstack4.0インストールApache cloudstack4.0インストール
Apache cloudstack4.0インストール
Yasuhiro Arai
 

Semelhante a 【dots. IT勉強会】開発環境のDocker化 (20)

WordBench Nagoya 12月勉強会
WordBench Nagoya 12月勉強会WordBench Nagoya 12月勉強会
WordBench Nagoya 12月勉強会
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
 
Windows Server 2016でコンテナを動かしてみた
Windows Server 2016でコンテナを動かしてみたWindows Server 2016でコンテナを動かしてみた
Windows Server 2016でコンテナを動かしてみた
 
Web サービス インフラの近未来
Web サービス インフラの近未来Web サービス インフラの近未来
Web サービス インフラの近未来
 
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
 
Dockerでらくらく開発・運用を体感しよう
Dockerでらくらく開発・運用を体感しようDockerでらくらく開発・運用を体感しよう
Dockerでらくらく開発・運用を体感しよう
 
AWS re:Invent 2013 参加報告(新サービスとセッション)
AWS re:Invent 2013 参加報告(新サービスとセッション)AWS re:Invent 2013 参加報告(新サービスとセッション)
AWS re:Invent 2013 参加報告(新サービスとセッション)
 
[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介
[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介
[SAPPORO CEDEC] サービスの効果を高めるグリー内製ツールの技術と紹介
 
Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例
 
オトナのDocker入門
オトナのDocker入門オトナのDocker入門
オトナのDocker入門
 
ヤフーを支えるフラッシュストレージ
ヤフーを支えるフラッシュストレージヤフーを支えるフラッシュストレージ
ヤフーを支えるフラッシュストレージ
 
[db tech showcase Tokyo 2015] D13:PCIeフラッシュで、高可用性高性能データベースシステム?! by 株式会社HGSTジ...
[db tech showcase Tokyo 2015] D13:PCIeフラッシュで、高可用性高性能データベースシステム?! by 株式会社HGSTジ...[db tech showcase Tokyo 2015] D13:PCIeフラッシュで、高可用性高性能データベースシステム?! by 株式会社HGSTジ...
[db tech showcase Tokyo 2015] D13:PCIeフラッシュで、高可用性高性能データベースシステム?! by 株式会社HGSTジ...
 
第29回長岡開発者勉強会
第29回長岡開発者勉強会第29回長岡開発者勉強会
第29回長岡開発者勉強会
 
OSC 2012.Cloud
OSC 2012.CloudOSC 2012.Cloud
OSC 2012.Cloud
 
明日からはじめられる Docker + さくらvpsを使った開発環境構築
明日からはじめられる Docker + さくらvpsを使った開発環境構築明日からはじめられる Docker + さくらvpsを使った開発環境構築
明日からはじめられる Docker + さくらvpsを使った開発環境構築
 
Couch DB in 15minutes
Couch DB in 15minutesCouch DB in 15minutes
Couch DB in 15minutes
 
Docker 18.09 新機能
Docker 18.09 新機能Docker 18.09 新機能
Docker 18.09 新機能
 
【JAWS DAYS 2014】ランサーズを支えるRDS
【JAWS DAYS 2014】ランサーズを支えるRDS【JAWS DAYS 2014】ランサーズを支えるRDS
【JAWS DAYS 2014】ランサーズを支えるRDS
 
Apache cloudstack4.0インストール
Apache cloudstack4.0インストールApache cloudstack4.0インストール
Apache cloudstack4.0インストール
 
ヤギにサーバーを管理してもらう話
ヤギにサーバーを管理してもらう話ヤギにサーバーを管理してもらう話
ヤギにサーバーを管理してもらう話
 

【dots. IT勉強会】開発環境のDocker化

  • 2. © 2016 for LANCERS, inc All Rights Reserved 自己紹介 • 氏名 • 金澤 裕毅 • 入社時期 • 2013年11月 • 業務内容 • ランサーズの運用監視 • AWS全般 • 開発支援 • 開発環境構築 • インフラ関連の支援 • 情報システム業務 • 社内LAN構築 • 社内サーバー運用 • PC関連 • その他 • 趣味 • 将棋とか(一応初段)
  • 3. © 2016 for LANCERS, inc All Rights Reserved 本日お話しさせていただく内容 ランサーズ開発環境の歴史 Docker導入の経緯 Docker導入の基本方針 直面した問題とその解決方法 Docker移行結果 今後の展望
  • 4. © 2016 for LANCERS, inc All Rights Reserved ランサーズ開発環境の歴史 Docker導入の基本方針 直面した問題とその解決方法 Docker移行結果 今後の展望 Docker導入の経緯
  • 5. © 2016 for LANCERS, inc All Rights Reserved ランサーズ開発環境の歴史(2008 ~ 2010) • 開発人数:2人 • PC環境 • Windowsデスクトップ • 開発環境 • Linuxサーバーに直接ログイン • CentOS • 開発ツール • ソース管理:SVN • 直接ログインしてVimで開発
  • 6. © 2016 for LANCERS, inc All Rights Reserved ランサーズ開発環境の歴史(2011 ~ 2013) • 開発人数:4人~10人 • PC環境 • Windowsデスクトップ • デザイナーはMac • 開発環境 • 社内開発サーバー(VMWare ESXi) • 開発ツール • ソース管理:SVN • 直接ログインしてVimで開発 • ssh経由でIDEを使う人も
  • 7. © 2016 for LANCERS, inc All Rights Reserved ランサーズ開発環境の歴史(2014 ~ 2015) • 開発人数:10人~20人 • PC環境 • Windowsデスクトップ • エンジニアもMacに移行し始める • 開発環境 • VirtualBox + Vagrant • Ansibleで個人PC内に開発環境を構築 • 開発ツール • ソース管理:SVN→Githubに移行 • PC上のエディタで開発 • VirtualBox共有フォルダ • PHP Stormでデバッグする人も
  • 8. © 2016 for LANCERS, inc All Rights Reserved ランサーズ開発環境の歴史(2016 ~ ) • 開発人数:20人以上 • PC環境 • ほとんどMac • Windowsは数人 • 開発環境 • VirtualBox + Docker Toolbox • Dockerfile + Ansibleでコンテナ構築 • 開発ツール • ソース管理:Github • PC上のエディタで開発 • VirtualBox共有フォルダ + Dockerマウント • PHP Stormのデバッグも可能
  • 9. © 2016 for LANCERS, inc All Rights Reserved Docker導入の経緯 Docker導入の基本方針 直面した問題とその解決方法 Docker移行結果 今後の展望 ランサーズ開発環境の歴史
  • 10. © 2016 for LANCERS, inc All Rights Reserved Vagrant + Ansible時代の開発環境構成 192.168.33.11 HDD 50GB メモリ 2GB App(ランサーズ本体) Apache 2.2 (80) PHP 5.3 MySQL 5.6 (3306) Memcached(11211) Virtual Box VM CentOS 6
  • 11. © 2016 for LANCERS, inc All Rights Reserved Vagrant + Ansible時代の開発環境構成 192.168.33.11 HDD 50GB メモリ 2GB App(ランサーズ本体) Apache 2.2 (80) PHP 5.3 MySQL 5.6 (3306) Memcached(11211) 192.168.33.12 HDD 50GB メモリ 1GB メッセージ(チャット) Nginx(3443) node.js(3001) Redis(6379) Virtual Box VM CentOS 6
  • 12. © 2016 for LANCERS, inc All Rights Reserved Vagrant + Ansible時代の開発環境構成 192.168.33.11 HDD 50GB メモリ 2GB App(ランサーズ本体) Apache 2.2 (80) PHP 5.3 MySQL 5.6 (3306) Memcached(11211) 192.168.33.13 HDD 50GB メモリ 1GB WordPress (コーポレート、ブログ等) Apache 2.4(80) PHP 5.5 MySQL 5.6(3306) 192.168.33.12 HDD 50GB メモリ 1GB メッセージ(チャット) Nginx(3443) node.js(3001) Redis(6379) Virtual Box VM CentOS 6
  • 13. © 2016 for LANCERS, inc All Rights Reserved Vagrant + Ansible時代の開発環境構成 192.168.33.11 HDD 50GB メモリ 2GB App(ランサーズ本体) Apache 2.2 (80) PHP 5.3 MySQL 5.6 (3306) Memcached(11211) 192.168.33.13 HDD 50GB メモリ 1GB WordPress (コーポレート、ブログ等) Apache 2.4(80) PHP 5.5 MySQL 5.6(3306) 192.168.33.12 HDD 50GB メモリ 1GB メッセージ(チャット) Nginx(3443) node.js(3001) Redis(6379) 192.168.33.15 HDD 50GB メモリ 1GB 認証システム Virtual Box VM CentOS 6
  • 14. © 2016 for LANCERS, inc All Rights Reserved VMを1つにまとめる 192.168.33.11 HDD 50GB メモリ 2GB App(ランサーズ本体) Apache 2.2 (80) PHP 5.3 MySQL 5.6 (3306) Memcached(11211) Virtual Box VM CentOS 6
  • 15. © 2016 for LANCERS, inc All Rights Reserved VMを1つにまとめる 192.168.33.11 HDD 50GB メモリ 2GB App(ランサーズ本体) Apache 2.2 (80) PHP 5.3 MySQL 5.6 (3306) Memcached(11211) メッセージ(チャット) Nginx(3443) node.js(3001) Redis(6379) Virtual Box VM CentOS 6
  • 16. © 2016 for LANCERS, inc All Rights Reserved VMを1つにまとめる 192.168.33.11 HDD 50GB メモリ 2GB App(ランサーズ本体) Apache 2.2 (80) PHP 5.3 MySQL 5.6 (3306) Memcached(11211) メッセージ(チャット) Nginx(3443) node.js(3001) Redis(6379) WordPress Apache 2.4(80) PHP 5.5 MySQL 5.6(3306) Virtual Box VM CentOS 6
  • 17. © 2016 for LANCERS, inc All Rights Reserved Vagrant + Ansible時代の問題点 • 構築に時間がかかる • PHP、MySQLのビルド時間:1.5時間 • MySQLのインポート時間:2.5時間以上 • 構成更新時の問題 • Appサーバーに新しいミドルウェアを追加 • Ansible Playbookにプルリクを投げる • 誰が検証するの? • 検証中は開発できない • 再構築も時間がかかる(元に戻らないリスクも) • 誰もPlaybookを更新しなくなる • 更新差分は手動でカバー • 原因不明のエラーがさらに増える • DB構成の変更 • 都度、手動でALTER TABLE、INSERT、UPDATEを実行 • 抜け漏れがあると復元困難に • Windows環境での構築が不安定 • VitualBox、Vagrant、Ansibleのバージョン相性がシビア • 成功率50%以下
  • 18. © 2016 for LANCERS, inc All Rights Reserved Docker導入の基本方針 Docker導入の経緯 直面した問題とその解決方法 Docker移行結果 今後の展望 ランサーズ開発環境の歴史
  • 19. © 2016 for LANCERS, inc All Rights Reserved Docker導入の基本指針 • 利用面 • Vagrant時代の利便性を維持 • PC上のエディタで開発可能 • SQLクライアントでDB参照可能 • PHPStorm(Xdebug)でステップ実行可能 • 個人で構築はしない • コンテナをpullするだけ • MySQLもDBインポート済のものをpull • コンテナ構築は特定の人が行う • 当日から開発可能にする • 構築時間は30分以内に抑える • 非エンジニアでも簡単に構築可能に • 構成面 • HDD20GB、メモリ2GBのVMで動作可能 • 本番環境と極力同じ構成にする • 本番サーバーと共通のAnsible Playbookを使う
  • 20. © 2016 for LANCERS, inc All Rights Reserved ランサーズの本番環境 EC2 App S3 ELB EC2 instance Wordpress CloudFront SQS Cloud Search Route53 EC2 instance WebSocket ランサーズ コーポレート ブログ オウンドメディア ErastiCache Memcached ErastiCache Redis Aurora Reader Aurora Writer メッセージ • EC2は固定IPで運用
  • 21. © 2016 for LANCERS, inc All Rights Reserved Dockerを使った開発環境構成 192.168.99.100 HDD 50GB メモリ 2GB 172.17.6.11 App(ランサーズ本体) Apache 2.2 (80) PHP 5.3 172.17.4.51 WordPress (コーポレート、ブログ等) Apache 2.4(80) PHP 5.5 172.17.106.55 認証システム Nginx (443) Unicorn (3000) 172.17.4.152 メッセージ(チャット) Nginx(3443) node.js (3001) 172.17.50.11 ELBエミュレーション Apache 2.2 (80) 172.17.51.11 RDSエミュレーション MySQL 5.6(3306) 172.17.52.12 ErastiCache エミュレーション Redis(6379) 172.17.52.11 ErastiCache エミュレーション Memcached(11211) マネージド系コンテナ Dockerfileで構築 EC2系コンテナ Dockerfile + Ansible で構築 Docker リポジトリ ディレクトリ 共有
  • 22. © 2016 for LANCERS, inc All Rights Reserved Dockerを使った開発環境構成 Virtualbox VM Docker Machine 172.17.6.11 App ランサーズ本体 172.17.4.51 WordPress コーポレート、ブログ SSH 172.17.51.11 MySQL 3306 9000 172.17.4.152 WebSocket メッセージサービス ディレクトリ 共有 SQLクライアント 開発環境(エディタ)ターミナル • Vagrant時代の利便性を維持
  • 23. © 2016 for LANCERS, inc All Rights Reserved コンテナ更新のフロー EC2 MySQLデータ 開発用データ App Ansible WordPress MySQL WebSocket WordPress App WebSocket MySQL Registry Registry 旧開発サーバーを CoreOS化 Playbook docker push docker pull docker build Docker Registry コンテナ
  • 24. © 2016 for LANCERS, inc All Rights Reserved 直面した問題とその解決方法 Docker導入の経緯 Docker導入の基本方針 Docker移行結果 今後の展望 ランサーズ開発環境の歴史
  • 25. © 2016 for LANCERS, inc All Rights Reserved Dockerの思想 • 1コンテナ1サービス • フォアグラウンドでサービスを起動 • sshdは稼働しない • コンテナは極力軽く • 固定IPではない • Dockerが動的にIPを割り当てる
  • 26. © 2016 for LANCERS, inc All Rights Reserved Dockerの思想を回避 • 1コンテナ1サービス • →細工して複数サービスを起動 • フォアグラウンドでサービスを起動 • →細工してバックグラウンドで起動 • sshdは稼働しない • → SSHでログイン • AnsibleもSSH経由で実行 • コンテナは極力軽く • → MySQLのデータをインポート • 数GBのコンテナが誕生 • 固定IPではない • Dockerが動的にIPを割り当てる • →加えて固定IPを付与
  • 27. © 2016 for LANCERS, inc All Rights Reserved 複数サービスをバックグラウンド起動 • docker run時に起動用シェルを常駐 • 起動用シェル内に複数サービスを記述 #!/bin/sh /sbin/service sshd start /sbin/service httpd start while true do sleep 10 done service.sh # service.shをコンテナに配置 COPY ./service.sh /root/ RUN chmod 744 /root/service.sh # 起動時にservice.shを実行 CMD ["/root/service.sh"] Dockerfile
  • 28. © 2016 for LANCERS, inc All Rights Reserved 固定IPの付与 • docker run、docker start後にdocker execコマンドで付与 • ip addr add で付与(CentOS6の場合) 172.17.0.2 ELB DOCKER_ID=$(docker inspect --format="{{.Id}}" $DOCKER_NAME) IP_STATIC=172.17.51.11 NIC=eth0 docker exec $DOCKER_ID ip addr add $IP_STATIC/16 dev $NIC 172.17.0.2 172.17.51.11 ELB IMAGE_NAME=elb:latest DOCKER_NAME=elb-50-11 docker run ¥ --name $DOCKER_NAME ¥ --hostname $DOCKER_NAME ¥ … 起動時に Dockerが動的に IPを付与 起動後に ip addrで固定 IPを付与
  • 29. © 2016 for LANCERS, inc All Rights Reserved コンテナのビルド • マネージド系のサービスはDockerfileのみで構築 • EC2で構築するサービスはDockerfile + Ansibleで構築 • 本番EC2と共通のPlaybookを利用 • Ansible用のコンテナを用意(コンテナ間でssh接続) EC2 ELB Ansible MySQL Registry Playbook docker push docker tag MySQLデータ開発用データ Base CentOS6 App ansible Docker Shell docker build DBインポートした イメージを commit
  • 30. © 2016 for LANCERS, inc All Rights Reserved Docker Registryコンテナ Ansible 各種コンテナ 各種コンテナ RegistryRegistry docker push docker pull docker build docker run -d ¥ --name registry ¥ -p 5000:5000 ¥ -e REGISTRY_STORAGE_S3_ACCESSKEY=XXXXXXXX ¥ -e REGISTRY_STORAGE_S3_SECRETKEY=xxxxxxxx ¥ -e REGISTRY_STORAGE_S3_BUCKET=docker-registory-lancers ¥ -e REGISTRY_STORAGE_S3_REGION=ap-northeast-1 ¥ -e REGISTRY_STORAGE_S3_ROOTDIRECTORY=/ ¥ -e REGISTRY_STORAGE=s3 ¥ registry:2.2 • Docker Hub等のリポジトリはほとんどが海外 • 巨大コンテナ(MySQLとか)の受け渡しに時間がかかる • Docker Registoryコンテナを起動して東京RのS3に格納 Docker Shell ansible Playbook
  • 31. © 2016 for LANCERS, inc All Rights Reserved ELBコンテナ • SSL Terminateをエミュレートしたリバースプロキシ • プロキシ時にX-Forwarded Protoヘッダを追加 • ログイン時のhttps強制リダイレクト判定で利用 EC2 App ELB EC2 instance wordpress Route53 App WordPress ELB SSL Terminate <VirtualHost *:80> ServerName dev.lancers.jp ServerAlias *.lancers.jp RequestHeader set X-Forwarded-Proto "http" RewriteEngine On RewriteCond %{SERVER_NAME} ^(.*).lancers.jp$ RewriteRule ^/(.*) http://%1.lancers.jp/$1 [P,L,QSA] </VirtualHost> <VirtualHost *:443> ServerName dev.lancers.jp ServerAlias *.lancers.jp … SSLCertificateKeyFile /etc/pki/tls/private/lancers.jp.key RequestHeader set X-Forwarded-Proto "https" RewriteEngine On RewriteCond %{SERVER_NAME} ^(.*).lancers.jp$ RewriteRule ^/(.*) http://%1.lancers.jp/$1 [P,L,QSA] </VirtualHost> <VirtualHost *:80> ServerName dev.lancers.co.jp ServerAlias *.lancers.co.jp RequestHeader set X-Forwarded-Proto "http" RewriteEngine On RewriteCond %{SERVER_NAME} ^(.*).lancers.co.jp$ RewriteRule ^/(.*) http://%1.lancers.co.jp/$1 [P,L,QSA] </VirtualHost> hosts https://www.lancers.jp/ http://www.lancers.co.jp https://dev.lancers.jp http://dev.lancers.co.jp http://dev.lancers.co.jp http://dev.lancers.jp http://www.lancers.jp/ https→http変換
  • 32. © 2016 for LANCERS, inc All Rights Reserved 共有フォルダ設定 • Vagrant時代の利便性を維持 • PC上のエディタで開発可能 • VirtualBoxの共有フォルダ設定 + • docker run時のマウント設定 AppWordPress WebSocket ディレクトリ 共有 開発環境(エディタ) docker run ¥ --name $DOCKER_NAME ¥ -v /Users/www:/var/www ¥ --hostname $DOCKER_NAME ¥ --privileged ¥ -d $IMAGE_NAME
  • 33. © 2016 for LANCERS, inc All Rights Reserved ポートフォワーディング設定 • Vagrant時代の利便性を維持 • PC上のSQLクライアントから直接アクセス可能 172.17.6.11 App 172.17.4.51 WordPress 172.17.51.11 MySQL 3306 172.17.4.152 WebSocket SQLクライアント 172.17.4.51 ELB WWWブラウザ 443 80 3443 IMAGE_NAME=mysql:latest DOCKER_NAME=mysql-51-11 IP_STATIC=172.17.51.11 PORT=3306 docker run ¥ --name $DOCKER_NAME ¥ --hostname $DOCKER_NAME ¥ -p $PORT:$PORT ¥ …
  • 34. © 2016 for LANCERS, inc All Rights Reserved コンテナ起動スクリプト IMAGE_NAME=elb:latest DOCKER_NAME=elb-50-11 IP_STATIC=172.17.50.11 PORT=80 PORT2=443 docker run ¥ --name $DOCKER_NAME ¥ --hostname $DOCKER_NAME ¥ -p $PORT:$PORT ¥ -p $PORT2:$PORT2 ¥ --add-host=dev.lancers.jp:172.17.6.11 ¥ … --add-host=dev-img.lancers.jp:172.17.6.11 ¥ … --add-host=dev-wst.lancers.jp:172.17.4.152 ¥ … --add-host=dev.lancers.co.jp:172.17.4.51 ¥ --privileged ¥ -d $IMAGE_NAME DOCKER_ID=$(docker inspect --format="{{.Id}}" $DOCKER_NAME) DIR=$(cd $(dirname $0); pwd) cd $DIR . ../function.sh set_timezone "Japan" set_static_ip "$IP_STATIC" set_timezone() { docker exec $DOCKER_ID ¥cp -f /usr/share/zoneinfo/$1 /etc/localtime } set_static_ip() { IP_STATIC=$1 NIC_CENTOS6=eth0 docker exec $DOCKER_ID ip addr add $IP_STATIC/16 dev $NIC_CENTOS6 } ポートフォワーディング設定 hosts設定 (Dockerfileで設定不可) run.sh function.sh 固定IPの付与 TimeZone設定 (Dockerfileで設定不可) • 非エンジニアでも操作できる仕組み • dockerコマンドを使わず、シェル1発で起動
  • 35. © 2016 for LANCERS, inc All Rights Reserved コンテナ更新スクリプト #!/bin/sh REGISTORY=localhost:5000 REPOSITORY=websocket TAG=latest DOCKER_NAME=websocket-4-152 DIR=$(cd $(dirname $0); pwd) cd $DIR . ../function.sh set -x ./stop.sh rm update_image "$REGISTORY" "$REPOSITORY" "$TAG" " $DOCKER_NAME" ./run.sh update_image() { REGISTORY=$1 REPOSITORY=$2 TAG=$3 DOCKER_NAME=$4 IMAGE_ID=$(docker images | grep $REGISTORY | grep $REPOSITORY | grep $TAG | awk '{print $3}') docker rmi -f $IMAGE_ID docker start registry sleep 5 docker pull $REGISTORY/$REPOSITORY:$TAG docker tag $REGISTORY/$REPOSITORY:$TAG $REPOSITORY:$TAG } #!/bin/sh DOCKER_NAME=websocket-4-152 docker stop $DOCKER_NAME if [ "${1}" = "rm" ]; then docker rm $DOCKER_NAME fi update.sh function.sh stop.sh コンテナプロセス 削除 レジストリコンテナ 起動 コンテナプロセス 停止 コンテナイメージ 削除 コンテナイメージ ダウンロード コンテナイメージ タグ設定 • シェル1発で一連の更新処理を実行(もっと効率化できるかも) コンテナプロセス 起動 コンテナプロセス 停止&削除 コンテナイメージ 更新
  • 36. © 2016 for LANCERS, inc All Rights Reserved Docker移行結果 Docker導入の経緯 Docker導入の基本方針 直面した問題とその解決方法 今後の展望 ランサーズ開発環境の歴史
  • 37. © 2016 for LANCERS, inc All Rights Reserved コンテナあたりのリソース消費量 コンテナ メモリ使用量 ストレージ使用量 MySQL 819.8MB 6351.0MB App 657.0MB 812.7MB ELB 20.09MB 426.6MB WebSocket 18.46MB 886.1MB Memcached 26.71MB 348.7MB Redis 10.28MB 558.6MB WordPress 161.3MB 832.1MB KPI 21.59MB 576.3MB Registry 16.42MB 223.4MB 合計 1751.65MB ≒ 1.75GB 11015.5MB ≒ 11GB • VMサイズ • HDD:20GB • メモリ:2GB ランサーズ稼働に 最低限必要なコンテナ レジストリコンテナの メモリ消費は20MB以下
  • 38. © 2016 for LANCERS, inc All Rights Reserved 運用の効率化 Vagrant + Ansible時代 Docker時代 開発環境構築方法 個々でAnsibleで構築 特定の人が構築してpush 個々で構築済のコンテナをpull 構築時間 4時間以上or不可能 約30分 開発方法 PC上のエディタで開発 VirtualBox共有フォルダ PC上のエディタで開発 VirtualBox共有フォルダ+Dockerマウント XDebugステップ実行 可能 可能 DBのデータ構造変更 手動でSQL実行 MySQLコンテナを破棄&pull ※データを元に戻すのにも重宝 ミドルウェア追加 手動でインストール Appコンテナを破棄&pull • 構築時間の大幅短縮 • コンテナの破棄&pullは予想以上に便利な機能
  • 39. © 2016 for LANCERS, inc All Rights Reserved Windows環境 • 確実に構築できるようになった • ランサーへの開発依頼もスムーズに • 構成 • Docker ToolBox • Cygwin • unzip • zip • git • openssh • curl • TeraTerm(Cygterm)
  • 40. © 2016 for LANCERS, inc All Rights Reserved 構築手順書 • GitHub Wikiに手順を集約 • リモートでも構築しやすい環境に
  • 41. © 2016 for LANCERS, inc All Rights Reserved 今後の展望 Docker導入の経緯 Docker導入の基本方針 直面した問題とその解決方法 Docker移行結果 ランサーズ開発環境の歴史
  • 42. © 2016 for LANCERS, inc All Rights Reserved 新技術の追従 • ※メリットを吟味しながら採用を検討したい • Docker Compose • シェルの処理を全部置き換えられれば • 固定IPの付与とか • Ansible Docker Connection Plugin • SSHを使わずに構築可能 • Docker for Mac/Windows • VirtualBoxが不要に
  • 43. © 2016 for LANCERS, inc All Rights Reserved コンテナの軽量化 • ※本番環境との互換性を考慮しながら進めたい • データボリュームコンテナへ分離 • MySQLコンテナ(約1GB) • MySQLデータコンテナ(約5GB) • 軽量OSの利用 • サービスの削除 • sshdとか
  • 44. © 2016 for LANCERS, inc All Rights Reserved 本番環境への対応 • ※メリットが明確になれば検討するかも • 前準備 • 固定IPをやめる • 内部DNSの導入 • Immutable化 • sshdが不要に • オートスケーリングの後処理が不要に • コンテナを直接デプロイする仕組み • コンテナの軽量化は必須 • AWSのDocker対応サービスの採用も視野 • Elastic BeansTalk • ECS(EC2 Container Service)
  • 45. ご清聴ありがとうございました! ランサーズ株式会社 インフラエンジニア 金澤 裕毅 [Kanazawa Yuki] 「時間と場所にとらわれない、新しい働き方を創る」 [2016/03/30 dots. IT勉強会] http://www.lancers.jp/