Docker HandsOn
@konpyu
Agenda
• dockerとは何でしょう & インストール

• コンテナを立ち上げる

• コンテナをDockerfileでbuildする

• 複数のコンテナをリンクさせる

• docker-composeで管理する
What’s Docker?
• コンテナ型仮想化技術の一つです

• ホストOSの中にゲストOSを起動するのではなく、ホストOSのリ
ソースにnamespeceを切って分離した空間内でゲストを起動します
(メモリ、プロセス、ディスクなどにnamespeceを設ける技術は昔か
らあります。Dockerはそれらを統合したものです)

• パフォーマンスの劣化が殆ど無く、ゲストの起動が数秒で可能

• GoogleやRed Hat、AWS、Microsoftなどの大手ベンダーが採用
Docker Registory
• ビルドしたイメージをホストする場所

• Docker社公式のDockerHubにはCentOSやUbuntuといったベースと
なるイメージや、MySQLやnginxといったミドルウェア、Rubyやjsな
どの実行環境コミのイメージがなどが用意されている

• 本番用のコンテナをホストするには、当然Privateなレポジトリが必
要。SaaSとして提供しているサービスもある(ex: Quay.io)し、自 に
立てるタイプ(ex: Docker Registry)もある
• CentOS7(ami-89634988)

• EC2 with PublicIP

• Security Group allowing 22 80 8080 8081

• fyi: CoreOS コンテナのホスティングに特化した軽
量OS. ( http://deeeet.com/writing/
2014/11/17/coreos/ )
Host
Install & boot
# yum -y install docker

# docker -v

Docker version 1.6.2, build ba1f6c3/1.6.2

# systemctl start docker
download image
# docker pull ubuntu:latest

# docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE

docker.io/ubuntu latest d2a0ecffe6fa 36 hours ago 188.3 MB
docker.ioからDownloadされる
docker run
# docker run -it d2a0ecffe6fa /bin/bash

=> イメージから起動

=> -i : 標準出力 -t : 仮想端末

=> フォアグラウンドで起動
Docker Image
Docker
Container
docker run
Docker
Container
docker run
Exit from container
[root@f321de9c1e76 /]# exit

=> コンテナからログアウトする

# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

f321de9c1e76 7322fbe74aa5:latest "/bin/bash" About a minute ago Exited (0) 1 seconds ago romantic_lalande

=> ログアウトしてもコンテナのプロセスは生きてる

# docker rm f321de9c1e76

=> docker rmで完全に削除する
Install nginx
# docker pull nginx

# docker run --name mynginx -d -p 8080:80 nginx

=> -d : バックグラウンドで起動(デーモン)

=> -name : コンテナに名前をつける

=> -p : ホストのポートアクセスをコンテナにフォワード
ホストへの8080番へのアクセスが
コンテナの80番にフォワードされる
Dockerfile
- dockerイメージの自動作成

- シンプルなテキストファイル

- docker build command do this
Docker Image
Dockerfile
+
docker build
New
Docker Image
sample redis container
# mkdir -p ~/redis && cd ~/redis

# vi Dockerfile

FROM ubuntu:14.04
RUN apt-get update && apt-get install -y redis-server
EXPOSE 6379
ENTRYPOINT ["/usr/bin/redis-server"]
# docker build -t konpyu/redis .

# docker run -d [image_id]
 redisが起動するイ
メージが完成
FROM ubuntu:14.04
#=> コンテナのベースとなるイメージを指定する。必ず1行目に書く。
RUN apt-get update && apt-get install -y redis-server
#=> コンテナでコマンドを実行
EXPOSE 6379
#=> そのコンテナが開放するポート。主にデーモンとして動かすとき利用。
ENTRYPOINT [“/usr/bin/redis-server"]
#=> 起動時に自動的に実行するコマンド。主にデーモンとして動かすときに指定
ENTRYPOINTはコンテナ
内でPID 1として実行される
# docker build -t konpyu/redis .
Talk with other container
Redis
Container
Client
Container
Host
docker0
TCP: 6379
PrivateIP: 172.17.XX.XX
Docker用のネットワーク
ブリッジが自動作成される
Linking container
#docker run --link [container_id]:db -it ubuntu:14.04 /bin/bash
- 先ほど作ったRedisコンテナに接続するためのコン
テナを別に立ててみましょう

- linkオプションで、通信をしたいイメージを指定する

- エイリアスを指定する
Connect from Client
Container
#root@container_id:/ # env | grep DB_

DB_NAME=/tender_curie/db

DB_PORT_6379_TCP_PORT=6379

DB_PORT=tcp://172.17.0.7:6379

DB_PORT_6379_TCP=tcp://172.17.0.7:6379

DB_PORT_6379_TCP_ADDR=172.17.0.7

DB_PORT_6379_TCP_PROTO=tcp
エイリアス名を元に環境変
数が自動作成される
#root@container_id:/# apt-get update

#root@container_id:/# apt-get install redis-server

#root@container_id:/# redis-cli -h $DB_PORT_6379_TCP_ADDR

$ redis 172.17.0.33:6379>

$ redis 172.17.0.33:6379>set hoge ikemen
Connect from Client
Container
Redisにつないでみましょう
docker-compose
- linkは複数あると管理や実行が面倒

- 何回もdocker runを打つのはたるい

- docker-composeはコンテナの起動を宣言的に書ける公式ライ
ブラリ

https://github.com/docker/compose
install docker-compose
@host 

#curl -L https://github.com/docker/compose/releases/
download/1.3.1/docker-compose-`uname -s`-`uname -m` > /usr/
local/bin/docker-compose

#chmod +x /usr/local/bin/docker-compose
docker-compose
- linkは正直複数あると面倒

- 何回もdocker runを打つのは面倒

- docker-composeはコンテナの起動を宣言的に書ける公式ライ
ブラリ

- docker-compose upだけで複数のコンテナを起動できる
sample: wordpress
- docker-composeでwordpressの環境を作ってみましょう
sample: wordpress
- mkdir ~/wp && cd ~/wp

# cat docker-compose.yml

web:

image: wordpress

links:

- db:mysql

environment:

- WORDPRESS_DB_PASSWORD=ageman

ports:

- 8081:80

db:

image: mysql:5.7

environment:

- MYSQL_ROOT_PASSWORD=ageman

- MYSQL_DATABASE=wordpress
設定しないといけない環境
変数はdockerhubのrepoに記述
されています
sample: wordpress
# docker-compose build => びるどする

# docker-compose up

=> http://xx.xx.xx.xx:8081
docker-compose ps で、コンテナの状況を確認できる
docker-compose stop で、コンテナの停止
Productionで使える?
- シングルホストだと簡単だが、マルチホストで本番運用しよう
とすると難易度がUP

- コンテナの監視は?ホストの監視は?Deployは? 冗長化は? ログ
管理は? セキュリティは? パフォーマンスは?

- Registry選定問題。Dockerhub? Quay.io? CoreOS Registory?
docker-registry? cf: ( http://qiita.com/Vexus2/items/
e84f5869c01e08438538 )
参考資料
Docker+CoreOSを本番環境に乗せるためにやったこと
http://blog.nanapi.co.jp/tech/2015/04/10/nanapi_on_docker/
=> nanapiの事例
Dockerを支える技術
http://www.slideshare.net/enakai/docker-34668707
=> 技術面の詳細な説明
本番運用を見据えたDocker Registry選定
http://qiita.com/Vexus2/items/e84f5869c01e08438538
Dive into dockerネットワーク
http://www.slideshare.net/mainya/dive-into-docker-36622210?related=1

Dockerハンズオン