Upload
naoki-nagazumi
View
53.627
Download
4
Embed Size (px)
Citation preview
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<[email protected]> RUN apt-get install -y httpd EXPOSE 80 CMD ["httpd", "-D" "FOREGROUND"]
① ubuntu(latest)をベースとする
② 管理者はhoge <[email protected]>
③ 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 <[email protected]>
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 をさわってみて下さい!!
デベロッパとは、けっこう相性がいいと思います。
おしまい
ご静聴ありがとうございました