Docker 基本のおさらい

Post on 08-Aug-2015

53.628 views 4 download

Transcript of Docker 基本のおさらい

2015/5/27

kawasaki.rb

Docker 基本のおさらい

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

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

はじめに

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

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

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 Hubというリポジトリを経由すると、インターネットを介して、コンテナをポータブルにできる。

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

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

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

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

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

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

おしまい

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