40
2015/5/27 kawasaki.rb Docker 基本のおさらい

Docker 基本のおさらい

Embed Size (px)

Citation preview

Page 1: Docker 基本のおさらい

2015/5/27

kawasaki.rb

Docker 基本のおさらい

Page 2: Docker 基本のおさらい

自己紹介 長住 直樹(ながずみ なおき)/ Twitter @nk_ngzm

会社内で技術者育成活動(通称:CORETECH)を推進しています。

Page 3: Docker 基本のおさらい

はじめに

このスライドは、先日社内の講習会で発表した資料の抜粋版です!!

そろそろ知っておきたい!!コンテナ技術と Dockerのキホン http://www.slideshare.net/ngzm/lxc-and-dockerbasic

Docker とか コンテナ技術について、もうすこし詳しい情報を知りたい場合は、上記資料も併せて御覧ください。

Page 4: Docker 基本のおさらい
Page 5: Docker 基本のおさらい
Page 6: Docker 基本のおさらい

Docker

「Docker」は、米国 Docker社(旧dotCloud)が開発するオープンソースのコンテナ管理ソフトウェアのひとつ。Go言語で実装されている。

アプリケーション実行環境をそのままを、コンテナに格納して実行するツール。

仮想サーバではなくアプリケーションに最適化されているため、原則的に、ひとつのコンテナに、ひとつのアプリケーションが実行する構成となる。

Page 7: Docker 基本のおさらい

Docker の利点

コンテナなのでオーバヘッドが少なく、動作が軽い

コンテナイメージを手軽にやり取りできる

コンテナは様々な環境で等しく動く

Page 8: Docker 基本のおさらい

Docker の利点

各コンテナは、いろいろなディストリビューションやバージョンで構成できる

コンテナ(インフラ)をコードで表現できる

コンテナ(環境)を壊して作りなおす運用が可能となる

Page 9: Docker 基本のおさらい

DockerイメージとDockerコンテナ

Dockerイメージとは、Docker コンテナ生成のベースとなるひな形。代表的な例として ubuntu や centos 等のディストリビューションがイメージ化されている。

Dockerコンテナとは、あるDockerイメージをベースにして個別アプリケーションの環境をセットアップして作成するコンテナ実行環境。

Docker コンテナ

Docker イメージ

Docker イメージ

docker run

docker commit

Page 10: Docker 基本のおさらい

Docker Hub

Docker社は、Docker Hub というクラウド上のリポジトリを提供しており、様々な団体や個人が作成した Dockerイメージを利用したり、自分で作成したイメージを共有することが可能。

https://hub.docker.com/

Docker コンテナ

Docker イメージ

Docker イメージ

docker run

docker commit

docker pull

docker push

Page 11: Docker 基本のおさらい

カスタム Docker イメージ作成

Docker コンテナ

Docker イメージ

Docker イメージ

docker run docker commit

Docker コンテナ

docker run

httpd install

httpd 起動

with httpd

Page 12: Docker 基本のおさらい

AUFS

親コンテナからの差分管理ができるため、コンテナイメージの容量を軽量化できる。

引用 : http://gesellix.github.io/gradle-summit-2014/

Page 13: Docker 基本のおさらい

Dockerfile

Dockerには、Dockerコンテナの構成情報をテキスト形式で記述できる「Dockerfile」という仕様がある。

そして、Dockerfile を解釈し Dockerイメージを作成する「docker build」コマンドが用意されている。

Dockerfile

docker build

Docker イメージ

Page 14: Docker 基本のおさらい

Dockerfile

FROM ubuntu MAINTAINER hoge<[email protected]> RUN apt-get install -y httpd EXPOSE 80 CMD ["httpd", "-D" "FOREGROUND"]

① ubuntu(latest)をベースとする

② 管理者はhoge <[email protected]>

③ httpdをインストール

④ ポート80番をオープン

⑤ httpdサーバをフォアグランドに起動(上書き可能)

以上の手順が実行された Docker イメージを作成

Page 15: Docker 基本のおさらい

Dockerfile

コマンド 意味

FROM 元となるDockerイメージの指定

MAINTAINER 作成者の情報

RUN コマンドの実行

ADD ファイル/ディレクトリの追加

CMD コンテナーの実行コマンド 1

ENTRYPOINT コンテナーの実行コマンド 2

WORKDIR 作業ディレクトリの指定

ENV 環境変数の指定

USER 実行ユーザーの指定

EXPOSE ポートのエクスポート

VOLUME ボリュームのマウント

Page 16: Docker 基本のおさらい

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

Page 17: Docker 基本のおさらい

引用 : http://www.slideshare.net/durdn/be-a-better-developer-with-docker

Dockerイメージのビルド

Page 18: Docker 基本のおさらい

Data Volume

複数のコンテナ間で永続的なデータや共有データを扱うための特別なヴォリューム (ディレクトリ)。

Data Volume に対する変更は直接反映され、イメージの変更に含まれない。

Data Volume は参照するコンテナがなくなっても存続する。

Page 19: Docker 基本のおさらい

Data Volume

ホストとのヴォリューム共有

引用 : http://www.slideshare.net/durdn/be-a-better-developer-with-docker

Page 20: Docker 基本のおさらい

Data Volume

ホストの /opt/test-app/ をコンテナの /app としてマウントさせる

$ sudo docker run -it -v /opt/test-app:/app ubuntu /bin/bash

ホスト側 マウントされるディレクトリ

コンテナ側 マウントディレクトリ

Page 21: Docker 基本のおさらい

Data Volume Container

コンテナ間のヴォリューム共有

引用 : http://www.slideshare.net/durdn/be-a-better-developer-with-docker

-v /var/volume1

-v /var/volume2

Data Volume Container

Page 22: Docker 基本のおさらい

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"]

Page 23: Docker 基本のおさらい

Data Volume Container

ユーザデータなど、壊せない情報の格納場所として Data Volume Container を利用する。

Webサーバ コンテナ

APサーバ コンテナ

DBサーバ コンテナ

Data Volume コンテナ

ログ保存先 Volume

DB データ格納 Volume

Page 24: Docker 基本のおさらい

ネットワークポートマッピング

コンテナを起動するときに、コンテナ内部で使用するポートを、任意のホスト側ポート番号 (49152以降推奨)に割り当てることができる。

ホスト側のポート番号は、49000 ~ 49900 の範囲で自動的にランダムな番号を割り当てたり、ユーザが任意の番号を指定したりすることが可能。

ホスト コンテナ

IP :X PORT:X

IP :Y PORT:Y

ポート マッピング

Page 25: Docker 基本のおさらい

ネットワークポートマッピング

コンテナ内でオープンしているポートをホスト側ランダムなポート番号にマッピング

コンテナのポート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

Page 26: Docker 基本のおさらい

ネットワークポートマッピング

コンテナのポート22をユーザが指定するホスト側ポート番号2222にマッピング

$ sudo docker run -d -p 2222:22 ubuntu:latest /usr/sbin/sshd -D

ホスト

コンテナ

IP :X

PORT:2222 IP :Y

PORT:22 ポート

マッピング

ホスト側ポート コンテナ側ポート

Page 27: Docker 基本のおさらい

コンテナ・リンク

複数のコンテナ間で、専用のネットワークを構築することができる。

コンテナA (コンテナBに接続)

コンテナB (リンク元)

Page 28: Docker 基本のおさらい

コンテナ・リンク

リンク元のコンテナ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

Page 29: Docker 基本のおさらい

ホストサーバ

(storage) Data Volume コンテナ

WordPressシステム構築

(wpap)

WordPress コンテナ

(wpdb)

MySQL コンテナ

データベース ファイル

/var/lib/mysql

ポート フォワード

8080:80

コンテナ リンク

DB接続

利用者

Page 30: Docker 基本のおさらい

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 <[email protected]>

VOLUME /var/lib/mysql CMD /bin/bash

Page 31: Docker 基本のおさらい

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

Page 32: Docker 基本のおさらい

Docker Compose

コンテナ間のシステム構成を docker run コマンドのオプションで指定するのが微妙だ!

Docker Compose を使ってみる。

Page 33: Docker 基本のおさらい

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 コンテナ

Page 34: Docker 基本のおさらい

Docker Compose

WordPressシステムを構成するコンテナを一気にビルド

WordPressシステムを構成するコンテナを一気に起動

$ sudo docker-compose build

$ sudo docker-compose up -d

Page 35: Docker 基本のおさらい
Page 36: Docker 基本のおさらい

Docker は、コンテナを簡単に、便利に扱えるようにしたツール。

Docker Hubというリポジトリを経由すると、インターネットを介して、コンテナをポータブルにできる。

Dockerfile という形式で、サーバインフラをコード化することができる。

Page 37: Docker 基本のおさらい

複数のコンテナ間で永続的なデータや共有データを扱うためのData Volumeも作成できる。

ネットワークポートマッピングやコンテナリンクを組み合わせると、いろいろ柔軟なシステム構成が検討できる。

Docker Compose を使えば、複数コンテナの構成をまとめてコード化し管理できる!

Page 38: Docker 基本のおさらい

皆さんも ぜひ Docker をさわってみて下さい!!

Page 39: Docker 基本のおさらい

デベロッパとは、けっこう相性がいいと思います。

Page 40: Docker 基本のおさらい

おしまい

ご静聴ありがとうございました