SlideShare ist ein Scribd-Unternehmen logo
1 von 66
Downloaden Sie, um offline zu lesen
Docker
ハンズオンCan you escape vendor lock-in with the cloud?
image by: https://blog.linode.com/2014/01/03/docker-on-linode/
written by @mainyaa
image by: https://blog.linode.com/2014/01/03/docker-on-linode/
Docker
Linuxのaufsやlxcやcgroupやnamespacingなど
の仮想化技術を使いやすくしたツール
●Docker IndexでみんながDocker imageを公開してい
るのですぐに使い始められる
●https://index.docker.io/
Docker
Dockerで作成したコンテナをDockerレポジトリ(not Github)
に持っておける
●コンテナの差分を積み上げるようにキャッシュしているの
で、インフラレイヤーをいじらない限りデプロイが速い
●Dockerレポジトリもオープンソースで公開されているので、
自分でDockerレポジトリ作成も可能
Docker
●問題が発生したら、すぐにロールバックが出来る
●良さそうなサーバー関連ソフトウェアを見つけたら、す
ぐに環境を作って試してみることができる
●OSイメージのスクラッチから環境構築からサーバー立
ち上げまでを自動化できるため、
○→vender lock-inされない環境を作れる
普通の仮想技術との違い
● Dockerfileを記述することでスクラッチから環境構築し
てウェブアプリを動かすまで全てを完結
● gitのようにコマンドごとに差分を保存している
● イメージ差分をpullするので、デプロイも速い
● ソフトウェアのインストールをDockerだけで完結させる
CoreOSが出てくるなど、OS自体の仮想化の影響を与
えている
image by: http://docs.docker.io/
-> Install Docker
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.9.2
BuildVersion: 13C1021
$ brew -v
Homebrew 0.9.5
$ vagrant -v
Vagrant 1.4.3
Version Check
$ cat << 'EOF' >> ~/.bashrc
export PS1="[e[1;32m][u@h:w]#[e
[00m] "
EOF
$ source ~/.bashrc
tips1:色を付けよう
$ cat << 'EOF' >> ~/.bashrc
$ alias dl=’docker ps -l -q’
EOF
$ source ~/.bashrc
aliasでcontainer idのコピペを無くす
tips2: aliasを設定
$ brew tap phinze/homebrew-cask
$ brew install brew-cask
$ brew cask install virtualbox
$ brew cask install vagrant
Install Vagrant
$ brew install boot2docker
$ brew install docker
Install Docker
tips: boot2docker
boot2dockerというDockerのみが入っている軽量ゲスト
OSをVirtualBox上に走らせてくれる。
boot2dockerは、vagrantに依存しない軽量ゲストOS操
作ツール。
boot2dockerをインストールしておけば、vagrant sshで
はなく、Mac上のターミナルからdockerコマンドを立たけ
るようになる
# Install boot2docker
$ brew install boot2docker
Install boot2docker
$ boot2docker init
$ boot2docker up
$ echo << 'EOF' >> ~/.bashrc
export DOCKER_HOST=tcp://localhost:4243
EOF
boot2docker起動
Docker on VirtualBox on Mac
$ docker version
Client version: 0.11.0
Go version (client): go1.2.1
Git commit (client): fb99f99
Server version: 0.11.0
Git commit (server): fb99f99
Go version (server): go1.2.1
Last stable version: 0.11.1, please update docker
version check
$ boot2docker stop
$ boot2docker delete
$ boot2docker download
$ boot2docker init
$ boot2docker up
もしboot2dockerが古いなら
busybox on Docker on
VirtualBox on Mac
$ docker run busybox echo 'docker on Mac o/'
Unable to find image 'busybox' (tag: latest) locally
Pulling repository busybox
3dd072f45bf6: Download complete
511136ea3c5a: Download complete
24abbd812704: Download complete
a943c4969b70: Download complete
docker on Mac o/
$ docker run busybox echo 'docker on Mac o/'
docker on Mac o/
busyboxでhelloworld
$ docker ps -a
CONTAINER ID IMAGE COMMAND
CREATED STATUS PORTS
NAMES
33273963cab6 busybox:latest echo docker on
Mac  3 days ago Exit 0
sick_bardeen
docker ps -a
-a オプションは終了したコンテナも全て表示してくれる。
33273963cab6 Exit 0 <- これは先ほどのhelloworld。正常
終了していることがわかる。
docker ps -a
$ docker images --tree
├─511136ea3c5a Virtual Size: 0 B
│ └─24abbd812704 Virtual Size: 0 B
│ └─a943c4969b70 Virtual Size: 2.489 MB
│ └─3dd072f45bf6 Virtual Size: 2.489 MB
Tags: busybox:latest
docker images --tree
images --treeはdockerのコンテナidのヒエラルキーと、
tagが見れる
docker images --tree
docker run コンテナを作成する.
docker stop コンテナを停止する.
docker start コンテナを起動する.
docker restart コンテナを再起動する.
docker attach 起動中のコンテナに接続する.
docker rm コンテナを破棄する(コンテナを停止する必要がある)
docker wait コンテナが停止するまでブロックする.
コマンド一覧
Docker on AWS
$ ssh docker-aws.ap-northeast-1b
$ cat << 'EOF' >> ~/.bashrc
export PS1="[e[1;31m][u@h:w]#[e[00m] "
EOF
$ source ~/.bashrc
promptに色を付けよう
$ yum install -y docker
$ sudo service docker start
$ groupadd docker
$ gpasswd -a #{USER} docker # sudo が要らなくなる魔法
$ sudo service docker restart
$ exit
$ exit # 一旦ログアウト
docker install
$ ssh docker-aws.ap-northeast-1b
$ docker run busybox echo 'docker on AWS o/'
docker on AWS o/
hello world!
$ docker version
Client version: 0.9.0
Go version (client): go1.2
Git commit (client): 2b3fdf2/0.9.0
Server version: 0.9.0
Git commit (server): 2b3fdf2/0.9.0
Go version (server): go1.2
Last stable version: 0.11.1, please update docker
hello world!
Ubuntu on Docker on AWS
$ docker run -t -i ubuntu /bin/bash
# uname -a
# exit
$ docker commit -m “hello ubuntu” `dl`
Hello Ubuntu!
Dockerfileを作ろう
-t -i は使わない
$ docker run -t -i の使い方は覚えましたか?
でも、この方法はデバッグ時以外は基本的に使
いません。
$ docker run -t -i + $ docker commitでやるスタイルも
ありますが、
Dockerfileを作るのがオススメ
Dockerfile
Dockerfileを作って、
$ docker build .を実行しましょう。
$ mkdir docker-redis
$ cd docker-redis
$ vim Dockerfile
from ubuntu
run apt-get update
$ docker build .
Dockerfileを作成
Dockerfile
from ubuntuでベースとなるコンテナをfromで指
定します。
run apt-get updateでrun の後に実行したいコ
マンドを書いていきましょう。
runを実行したら、その結果がどんどんキャッシュさ
れて積み上がっていきます。
http://docs.docker.io/en/latest/use/builder/
Tips: fswatch
Dockerfileを更新するたびに
$ docker build .を実行するのが面倒くさい人はfswatchを
使いましょう。
$ brew install fswatch
$ fswatch . “docker build .”
https://github.com/mainyaa/docker-redis
redis-serverをインストール
from ubuntu:12.04
maintainer KazuyukiMori <mainya@gmail.com>
run locale-gen en_US.UTF-8
run update-locale LANG=en_US.UTF-8
env DEBIAN_FRONTEND noninteractive
env LC_ALL C
env LC_ALL en_US.UTF-8
run echo "deb http://us.archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
run apt-get update
run apt-get install -y redis-server
expose 6379
entrypoint ["/usr/bin/redis-server"]
redis-serverをインストール
Dockerfile
expose 6379で公開するポート番号を指定しま
す。
entrypoint [“/usr/bin/redis-server”]でサーバーを
立ち上げるコマンドを書きます。
run echo "deb http://us.archive.ubuntu.
com/ubuntu precise main universe" >
/etc/apt/sources.list
Dockerfileに必ずこの文章を書きましょう
キャッシュを使うと断然速い
Tips: キャッシュ
run locale-gen en_US.UTF-8
run update-locale LANG=en_US.UTF-8
env DEBIAN_FRONTEND noninteractive
env LC_ALL C
env LC_ALL en_US.UTF-8
英語の人はこの設定は要りません。
Dockerfileに必ずこの文章を書きましょう。シェルを前提にしているプログラ
ムが多いため、変なエラーを回避できます
Tips: locale + env
$ docker build -t <your name>/redis .
ビルド
↑タグ名 ↑ビルドターゲット
$ docker run -d -p 6379:6379 <yourname>/redis
デーモン実行
↑ポート設定
実行するコンテナID or タグ名
$ brew install redis
Warning: redis-2.8.4 already installed
$ redis-cli -h 108.59.85.37
108.59.85.37:6379> set docker awesome
OK
108.59.85.37:6379> get docker
"awesome"
Try it!
↑
$ docker ps
CONTAINER ID IMAGE
COMMAND CREATED STATUS
PORTS NAMES
b5a165a64956 mainyaa/redis:latest
/usr/bin/redis-serve 2 hours ago Up 2
hours 6379/tcp backstabbing_bell
try it! (AWS)
$ docker inspect b5a165a64956
"NetworkSettings": {
"IPAddress": "172.17.0.2",
$ redis-cli -h 172.17.0.2
try it! (AWS)
$ docker login
$ docker push <yourname>/redis
レポジトリにpush
Docker Indexに無事にpushが出来て
いるか見てみよう
https://index.docker.io/
$ docker pull <yourname>/redis
$ docker run -d -p 6379:6379
<yourname>/redis
pullしてきたものはdocker buildしなくてよい。
そのままdocker runできる。
レポジトリからpull
$ Docker の問題点
Dockerの問題点
● とにかくストレージを食う。すべての差分イメージを保存し
ているため、ストレージをかなり圧迫する
● Docker runは基本的にshellを持たない
○ cronでapt-get updateしていた人は分かるかもしれな
いけど、ユーザーインタラクションが必要になるとそこで
処理が止まってしまう
Dockerの問題点
● ネットワーク設定に癖がある
● サーバーのリソース管理に物理ホストの上に、仮想ホスト、
Dockerのコンテナidというレイヤーが出来てしまうので混
乱しやすい
● Dockerがまだまだ安定していない。Docker公式にも本番
で運用するのはまだ速すぎると明言されている。
$ Docker Tips
$ docker build -t mainyaa/redis .
タグをかならずつけましょう
tips: build -t
$ docker ps -a | grep 'weeks ago' | awk '{print
$1}' | xargs docker rm
Dockerfileがあれば何時でもコンテナは作れるので、古い
ものはどんどん削除
tips: 古いコンテナ削除
tips: imageのツリーをpngに
$ docker images -viz | dot -Tpng -o docker.png
$ Advanced
Immutable Inftractureの制約
● デファクトスタンダードはない
● ログの集約はクラウド時代に合ったものでなければならな
い
● サーバーのリソース管理や監視が難しいし、プロビジョニ
ングツールもデプロイツールも出来る事が多く、レイヤー
が複雑だし、データベースは使い捨てに出来ないし、スト
レージは使い捨てに出来ないし・・・
● /^o^\フッジッサーン
Log
● ElesticSearch + kibanaでログの集約と可視化をしよう
● collectd + graphite でログの集約と可視化をしよう
● fluentd + Google BigQueryでログを解析しよう
ノードの管理、自動化
● skydock+skydnsで、dockerのstart/stopだけでDNSを更
新しよう
○ https://github.com/crosbymichael/skydock
● Serf+HAProxyでAutomatic Load Balancerをつくろう
○ http://blog.glidenote.
com/blog/2013/10/30/serf-haproxy/
CoreOS
全てのソフトをDockerで動かす野心的なOS。
パッケージマネージャーのたぐいは入っておらず、
クラスタでの動作に重きを置かれ、etcdによって
ノード間の設定情報を共有できる。
ウェブアプリのホストに最適。
Jenkins and more!
● Jenkinsでdockerイメージをビルドしてレポジトリにアップ
ロードしよう
● Sensuで監視をしよう
● busyboxで組み込み並みの超軽量サーバーをつくろう
まとめ
● DockerはDockerfileをかけばいつでも環境ごと戻せるよ
● Dockerfileがあれば、開発環境の構築がdocker runのみ
でよくなり、プロダクション環境と開発環境を限りなく近づ
けられる
● 開発環境の変更はDockerfileを書く→docker
build→Jenkinsでビルド+serverspecのテスト実行→

Weitere ähnliche Inhalte

Was ist angesagt?

Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Masahiro Nagano
 
【社内勉強会】Docker入門
【社内勉強会】Docker入門【社内勉強会】Docker入門
【社内勉強会】Docker入門
Kazuki Murahama
 
Docker基礎+docker0.9, 0.10概要
Docker基礎+docker0.9, 0.10概要Docker基礎+docker0.9, 0.10概要
Docker基礎+docker0.9, 0.10概要
Kazuyuki Mori
 

Was ist angesagt? (20)

JAWS-UG コンテナ支部 Docker入門 10分ハンズオン
JAWS-UG コンテナ支部 Docker入門 10分ハンズオンJAWS-UG コンテナ支部 Docker入門 10分ハンズオン
JAWS-UG コンテナ支部 Docker入門 10分ハンズオン
 
Dockerと継続的インテグレーション
Dockerと継続的インテグレーションDockerと継続的インテグレーション
Dockerと継続的インテグレーション
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
 
清貧Docker ~個人がDockerを使う理由~
清貧Docker ~個人がDockerを使う理由~清貧Docker ~個人がDockerを使う理由~
清貧Docker ~個人がDockerを使う理由~
 
JAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオンJAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオン
 
貧乏人でも出来るお手軽docker
貧乏人でも出来るお手軽docker貧乏人でも出来るお手軽docker
貧乏人でも出来るお手軽docker
 
あの日実行したコンテナの名前を僕達はまだ知らない。
あの日実行したコンテナの名前を僕達はまだ知らない。あの日実行したコンテナの名前を僕達はまだ知らない。
あの日実行したコンテナの名前を僕達はまだ知らない。
 
アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門
 
【社内勉強会】Docker入門
【社内勉強会】Docker入門【社内勉強会】Docker入門
【社内勉強会】Docker入門
 
Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴
 
Re: 運用に自動化を求めるのは間違っているだろうか
Re: 運用に自動化を求めるのは間違っているだろうかRe: 運用に自動化を求めるのは間違っているだろうか
Re: 運用に自動化を求めるのは間違っているだろうか
 
Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話
 
Docker Swarm モード にゅうもん
Docker Swarm モード にゅうもんDocker Swarm モード にゅうもん
Docker Swarm モード にゅうもん
 
Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで
 Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで
Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
 
捕鯨!詳解docker
捕鯨!詳解docker捕鯨!詳解docker
捕鯨!詳解docker
 
Jenkins with Docker
Jenkins with DockerJenkins with Docker
Jenkins with Docker
 
Dockerについて
DockerについてDockerについて
Dockerについて
 
Docker基礎+docker0.9, 0.10概要
Docker基礎+docker0.9, 0.10概要Docker基礎+docker0.9, 0.10概要
Docker基礎+docker0.9, 0.10概要
 
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門
 

Andere mochten auch

Andere mochten auch (13)

GoPiGo2で遊んでみた
GoPiGo2で遊んでみたGoPiGo2で遊んでみた
GoPiGo2で遊んでみた
 
小さく始める Docker container の deploy
小さく始める Docker container の deploy小さく始める Docker container の deploy
小さく始める Docker container の deploy
 
2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて
 
元運用担当者が,現役時代に本当に欲しかったもの. Osc2014 kansai@kyoto terraform introduction
元運用担当者が,現役時代に本当に欲しかったもの. Osc2014 kansai@kyoto terraform introduction元運用担当者が,現役時代に本当に欲しかったもの. Osc2014 kansai@kyoto terraform introduction
元運用担当者が,現役時代に本当に欲しかったもの. Osc2014 kansai@kyoto terraform introduction
 
マイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpマイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorp
 
Electron(旧atom shell)基礎+入門
Electron(旧atom shell)基礎+入門Electron(旧atom shell)基礎+入門
Electron(旧atom shell)基礎+入門
 
バズワード大戦2015~この先生きのこる~
バズワード大戦2015~この先生きのこる~バズワード大戦2015~この先生きのこる~
バズワード大戦2015~この先生きのこる~
 
Dockerを活用したリクルートグループ開発基盤の構築
Dockerを活用したリクルートグループ開発基盤の構築Dockerを活用したリクルートグループ開発基盤の構築
Dockerを活用したリクルートグループ開発基盤の構築
 
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
 
Docker Swarm入門
Docker Swarm入門Docker Swarm入門
Docker Swarm入門
 
Docker 基本のおさらい
Docker 基本のおさらいDocker 基本のおさらい
Docker 基本のおさらい
 
Design in Tech Report 2017
Design in Tech Report 2017Design in Tech Report 2017
Design in Tech Report 2017
 

Ähnlich wie Dockerハンズオン

Ähnlich wie Dockerハンズオン (20)

Docker handson
Docker handsonDocker handson
Docker handson
 
Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Dockerのキホンその2 Docker Compose Swarm Machine 利用編Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Dockerのキホンその2 Docker Compose Swarm Machine 利用編
 
Dockerの導入
Dockerの導入Dockerの導入
Dockerの導入
 
Docker & Kubernetes基礎
Docker & Kubernetes基礎Docker & Kubernetes基礎
Docker & Kubernetes基礎
 
そろそろ知っておきたい!!コンテナ技術と Dockerのキホン
そろそろ知っておきたい!!コンテナ技術とDockerのキホンそろそろ知っておきたい!!コンテナ技術とDockerのキホン
そろそろ知っておきたい!!コンテナ技術と Dockerのキホン
 
Webアプリケーション開発者のためのDockerハンズオン
Webアプリケーション開発者のためのDockerハンズオンWebアプリケーション開発者のためのDockerハンズオン
Webアプリケーション開発者のためのDockerハンズオン
 
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
 
DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
Dockerハンズオン
 
Webアプリケーション開発者のためのDockerハンズオン20210519
Webアプリケーション開発者のためのDockerハンズオン20210519Webアプリケーション開発者のためのDockerハンズオン20210519
Webアプリケーション開発者のためのDockerハンズオン20210519
 
Docker講習会資料
Docker講習会資料Docker講習会資料
Docker講習会資料
 
コマンドラインツールとしてのDocker
コマンドラインツールとしてのDockerコマンドラインツールとしてのDocker
コマンドラインツールとしてのDocker
 
第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
 
ゆるふわなDockerの使い方
ゆるふわなDockerの使い方ゆるふわなDockerの使い方
ゆるふわなDockerの使い方
 
Dockerでlamp環境を作って見る
Dockerでlamp環境を作って見るDockerでlamp環境を作って見る
Dockerでlamp環境を作って見る
 
Railsの開発環境作るぞ
Railsの開発環境作るぞRailsの開発環境作るぞ
Railsの開発環境作るぞ
 
Circle ci and docker+serverspec
Circle ci and docker+serverspecCircle ci and docker+serverspec
Circle ci and docker+serverspec
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
Dockerハンズオン
 
Docker入門
Docker入門Docker入門
Docker入門
 

Dockerハンズオン