SlideShare a Scribd company logo
2015/5/27
kawasaki.rb
Docker
基本のおさらい
自己紹介
 長住 直樹(ながずみ なおき)/ Twitter @nk_ngzm
 会社内で技術者育成活動(通称:CORETECH)を推進しています。
はじめに
このスライドは、先日社内の講習会で発表した資
料の抜粋版です!!
そろそろ知っておきたい!!コンテナ技術
と Dockerのキホン
http://www.slideshare.net/ngzm/lxc-and-dockerbasic
Docker とか コンテナ技術について、もうすこし
詳しい情報を知りたい場合は、上記資料も併せて
御覧ください。
Docker 基本のおさらい
Docker 基本のおさらい
Docker
「Docker」は、米国 Docker社(旧dotCloud)が開
発するオープンソースのコンテナ管理ソフトウェ
アのひとつ。Go言語で実装されている。
アプリケーション実行環境をそのままを、コンテ
ナに格納して実行するツール。
仮想サーバではなくアプリケーションに最適化さ
れているため、原則的に、ひとつのコンテナに、
ひとつのアプリケーションが実行する構成となる。
Docker の利点
コンテナなのでオーバヘッドが少なく、
動作が軽い
コンテナイメージを手軽にやり取りでき
る
コンテナは様々な環境で等しく動く
Docker の利点
各コンテナは、いろいろなディストリ
ビューションやバージョンで構成できる
コンテナ(インフラ)をコードで表現で
きる
コンテナ(環境)を壊して作りなおす運
用が可能となる
DockerイメージとDockerコンテナ
Dockerイメージとは、Docker コ
ンテナ生成のベースとなるひな形。
代表的な例として ubuntu や
centos 等のディストリビュー
ションがイメージ化されている。
Dockerコンテナとは、ある
Dockerイメージをベースにして
個別アプリケーションの環境を
セットアップして作成するコンテ
ナ実行環境。
Docker
コンテナ
Docker
イメージ
Docker
イメージ
docker run
docker commit
Docker Hub
Docker社は、Docker Hub というクラウド上のリポジトリ
を提供しており、様々な団体や個人が作成した Dockerイ
メージを利用したり、自分で作成したイメージを共有する
ことが可能。
https://hub.docker.com/
Docker
コンテナ
Docker
イメージ
Docker
イメージ
docker run
docker commit
docker pull
docker push
カスタム Docker イメージ作成
Docker
コンテナ
Docker
イメージ
Docker
イメージ
docker run docker commit
Docker
コンテナ
docker run
httpd install
httpd 起動
with httpd
AUFS
親コンテナか
らの差分管理
ができるため、
コンテナイ
メージの容量
を軽量化でき
る。
引用 : http://gesellix.github.io/gradle-summit-2014/
Dockerfile
Dockerには、Dockerコンテナ
の構成情報をテキスト形式で記
述できる「Dockerfile」という
仕様がある。
そして、Dockerfile を解釈し
Dockerイメージを作成する
「docker build」コマンドが用
意されている。
Dockerfile
docker
build
Docker
イメージ
Dockerfile
FROM ubuntu
MAINTAINER hoge<hoge@sample.net>
RUN apt-get install -y httpd
EXPOSE 80
CMD ["httpd", "-D" "FOREGROUND"]
① ubuntu(latest)をベースとする
② 管理者はhoge <hoge@sample.net>
③ httpdをインストール
④ ポート80番をオープン
⑤ httpdサーバをフォアグランドに起動(上書き可能)
以上の手順が実行された Docker イメージを作成
Dockerfile
コマンド 意味
FROM 元となるDockerイメージの指定
MAINTAINER 作成者の情報
RUN コマンドの実行
ADD ファイル/ディレクトリの追加
CMD コンテナーの実行コマンド 1
ENTRYPOINT コンテナーの実行コマンド 2
WORKDIR 作業ディレクトリの指定
ENV 環境変数の指定
USER 実行ユーザーの指定
EXPOSE ポートのエクスポート
VOLUME ボリュームのマウント
Dockerイメージのビルド
 Dockerfile をビルドし hoge/ubu:1.0 という
Dockerイメージを生成
$ cd [Dockerfileがあるディレクトリ]
$ sudo docker build –t hoge/app:1.0 ./
Dockerfile
docker
build
Docker
イメージ
hoge/app:1.0
引用 : http://www.slideshare.net/durdn/be-a-better-developer-with-docker
Dockerイメージのビルド
Data Volume
複数のコンテナ間で永続的なデータや共有データ
を扱うための特別なヴォリューム
(ディレクトリ)。
Data Volume に対する変更は直接反映され、イ
メージの変更に含まれない。
Data Volume は参照するコンテナがなくなって
も存続する。
Data Volume
ホストとのヴォリューム共有
引用 : http://www.slideshare.net/durdn/be-a-better-developer-with-docker
Data Volume
 ホストの /opt/test-app/ をコンテナの /app と
してマウントさせる
$ sudo docker run -it -v /opt/test-app:/app ubuntu /bin/bash
ホスト側
マウントされるディレクトリ
コンテナ側
マウントディレクトリ
Data Volume Container
コンテナ間のヴォリューム共有
引用 : http://www.slideshare.net/durdn/be-a-better-developer-with-docker
-v /var/volume1
-v /var/volume2
Data Volume
Container
Data Volume Container
 /var/volume を共有するデータボリュームコン
テナを生成+起動する
 上記コンテナの /var/volume を共有するコン
テナを生成+起動する
$ sudo docker run -it -v /var/volume --name vol1 ubuntu /bin/bash
$ sudo docker run -it --volumes-from vol1 ubuntu /bin/bash
FROM ubuntu
...
...
VOLUME ["/var/volume"]
CMD ["/bin/bash"]
Data Volume Container
ユーザデータなど、壊せない情報の格納場所とし
て Data Volume Container を利用する。
Webサーバ
コンテナ
APサーバ
コンテナ
DBサーバ
コンテナ
Data Volume コンテナ
ログ保存先 Volume
DB データ格納
Volume
ネットワークポートマッピング
コンテナを起動するときに、コンテナ内部で使用
するポートを、任意のホスト側ポート番号
(49152以降推奨)に割り当てることができる。
ホスト側のポート番号は、49000 ~ 49900 の
範囲で自動的にランダムな番号を割り当てたり、
ユーザが任意の番号を指定したりすることが可能。
ホスト
コンテナ
IP :X
PORT:X
IP :Y
PORT:Y
ポート
マッピング
ネットワークポートマッピング
 コンテナ内でオープンしているポートをホスト
側ランダムなポート番号にマッピング
 コンテナのポート22がホストのどのポートに
マッピングされたか知る方法
$ sudo docker run -d -P ubuntu:latest /usr/sbin/sshd -D
$ sudo docker port [コンテナID] 22
$ sudo docker run -d -p 22 ubuntu:latest /usr/sbin/sshd -D
ネットワークポートマッピング
 コンテナのポート22をユーザが指定するホスト
側ポート番号2222にマッピング
$ sudo docker run -d -p 2222:22 ubuntu:latest /usr/sbin/sshd -D
ホスト
コンテナ
IP :X
PORT:2222
IP :Y
PORT:22
ポート
マッピング
ホスト側ポート コンテナ側ポート
コンテナ・リンク
複数のコンテナ間で、専用のネットワークを構築
することができる。
コンテナA
(コンテナBに接続)
コンテナB
(リンク元)
コンテナ・リンク
 リンク元のコンテナA
 コンテナAに接続するコンテナB
$ sudo docker run –d --name pg ubuntu:latest postmaster -D /usr/local/pgsql/data
$ sudo docker run -d --link pg:db ubuntu:latest /someService
コンテナB
環境変数
DB_PORT_5432_TCP_ADDR=172.17.0.2
DB_PORT=tcp://172.17.0.2:5432
DB_5432_TCP=tcp://172.17.0.2:5432
DB_PORT_5432_TCP_PORT=5432
/etc/hosts
172.17.0.2 db
ホストサーバ
(storage)
Data Volume
コンテナ
WordPressシステム構築
(wpap)
WordPress
コンテナ
(wpdb)
MySQL
コンテナ
データベース
ファイル
/var/lib/mysql
ポート
フォワード
8080:80
コンテナ
リンク
DB接続
利用者
WordPressシステム構築
 Data Volume コンテナ
$ cd [Dockerfileのディレクトリ]
$ vi Dockerfile # Dockerfile作成
$ sudo docker build -t storage .
$ sudo docker run -it --name storage storage
ROM ubuntu:latest
MAINTAINER ngzm <nk.ngzm@gmail.com>
VOLUME /var/lib/mysql
CMD /bin/bash
WordPressシステム構築
 MySQLコンテナ
 WordPressコンテナ
$ sudo docker run --name wpdb ¥
--volumes-from storage ¥
-e MYSQL_ROOT_PASSWORD=password ¥
-d mysql:5.7
$ sudo docker run --name wpap ¥
--link wpdb:mysql ¥
-p 8080:80 ¥
-d wordpress:latest
Docker Compose
コンテナ間のシステム構成を docker
run コマンドのオプションで指定する
のが微妙だ!
Docker Compose を使ってみる。
Docker Compose
 docker-compose.yml
storage:
build: ./storage
wpdb:
image: mysql:5.7
volumes_from:
- storage
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
wpap:
image: wordpress:latest
links:
- wpdb:mysql
ports:
- "8080:80"
コンテナ間のシステム
構成を YAMLファイル
で定義できる!!!
定義内容は、docker
runのオプションとほぼ
対応しておりうれしい
~
Data
Volume
コンテナ
MySQL
コンテナ
WordPress
コンテナ
Docker Compose
 WordPressシステムを構成するコンテナを一気
にビルド
 WordPressシステムを構成するコンテナを一気
に起動
$ sudo docker-compose build
$ sudo docker-compose up -d
Docker 基本のおさらい
Docker は、コンテナを簡単に、便利に扱え
るようにしたツール。
Docker Hubというリポジトリを経由すると、
インターネットを介して、コンテナをポー
タブルにできる。
Dockerfile という形式で、サーバインフラ
をコード化することができる。
複数のコンテナ間で永続的なデータや共有
データを扱うためのData Volumeも作成で
きる。
ネットワークポートマッピングやコンテナ
リンクを組み合わせると、いろいろ柔軟な
システム構成が検討できる。
Docker Compose を使えば、複数コンテナ
の構成をまとめてコード化し管理できる!
皆さんも ぜひ Docker を
さわってみて下さい!!
デベロッパとは、けっこう相性が
いいと思います。
おしまい
ご静聴ありがとう
ございました

More Related Content

Docker 基本のおさらい