そろそろ知っておきたい!!コンテナ技術とdockerのキホン
TRANSCRIPT
そろそろ知っておきたい!!
コンテナ技術と Dockerのキホン
NTTアドバンステクノロジ株式会社
アプリケーションソリューション事業本部
長住 直樹
自己紹介 長住 直樹(ながずみ なおき)/ Twitter @nk_ngzm
NTTアドバンステクノロジ株式会社 アプリケーションソリューション事業本部
社内で技術者育成活動(通称:CORETECH)を推進しています。
Linux Container
Linuxカーネルが持つ機能を使って実現するコンテナ。
略して、LXCと表記することもある。
ここで、VMのおさらい
VMは、コンピュータの上で動くOSやVMを実現するためのハイパーバイザの上で、実際のハードウェアをエミュレートするVMが動きます。つまり実際の物理的なコンピュータと同じようなものがソフトウェアによって実現されているので、このVMを使うにはOSが必要になります。つまり、物理的なコンピュータ上で動くOSの上でさらにOSが動きます。
引用: http://gihyo.jp/admin/serial/01/linux_containers/0002
対してコンテナの原理
起動する全てのプロセスはコンピュータ上にインストールされたOS(ホストOS)上で直接起動します。通常のプロセスの動作と異なるのは、そのプロセスの一部をグループ化し、他のグループやグループに属していないプロセスから隔離した空間で動作させる点です。貨物輸送のコンテナのように、隔離された空間にプロセスが入っているので、この空間を『コンテナ』と呼ぶわけです。実際のコンテナのように、あるコンテナの内部から他のコンテナの内部を見ることはできません。
引用: http://gihyo.jp/admin/serial/01/linux_containers/0002
コンテナを実現するカーネル機能
名前空間とも呼ばれ、マウント、ホスト・ドメイン名、プロセス空間、ソケットやメッセージキューの空間、ユーザ・グループ、ネットワークなどの名前空間ごとに識別・隠蔽できる機能。例えば、マウント名前空間を使うと、名前空間内で行ったマウント操作を他の名前空間には反映させないといったことができる。すなわち,コンテナ内でマウント操作を行った場合、そのマウントはホストOSや他のコンテナからは見ない。
名前空間の名前 隔離されるリソース 実装されたカーネルバージョン
マウント名前空間 マウントの集合,操作 2.4.19
UTS名前空間 ホスト名,ドメイン名 2.6.19
PID名前空間 プロセスID(PID) 2.6.24
IPC名前空間 SysV IPCオブジェクト,POSIXメッセージキュー 2.6.19
ユーザ名前空間 UID,GID 3.8
ネットワーク名前空間 ネットワークデバイス,アドレス,ポート,ルーティングテーブル,フィルタなど
2.6.26
コンテナを実現するカーネル機能
「Control Group」の略。プロセスをグループ化して,そのグループ内に存在するプロセスに対して、たとえば、CPUやメモリなどのリソースに制限を行うなど、グループ単位のリソース管理が行える機能。
サブシステム 機能
blkio ブロックデバイスの入出力アクセスを制御 (Read <= N bytes/sec)
cpu スケジューラにより CPU のアクセスを制御
cpuset マルチコアの場合に利用する CPU, メモリノードを制御
devices デバイスへのアクセス制御
freezer 処理の一時停止, 再開
memory メモリリソースの制御
hugetlb N byteまでとかの制限
net_cls Linux トラフィックコントローラ (tc) がパケットを識別できるよう, クラス識別子 (classid) によりネットワークパケットにタグをつける
net_prio NIC 別にトラフィックのプライオリティを設定する
コンテナを実現するカーネル機能
ルートディレクトリを、任意の特定のディレクトリに変更できる機能。
chroot 内で起動されるプロセスは、設定された任意の場所をルートディレクトリとして動作するため、その範囲外のディレクトリやファイルへは一切アクセスできなくなる。
/
lib bin usr home etc
bin lib
chroot → /
etc usr
コンテナを実現するカーネル機能
netns(Linux Network Namespace)は、ホストサーバ内に、仮想的ブリッジ「br0」と、「veth」と呼ばれる直結した仮想NICのペアからなる仮想ネットワークを構築する。コンテナ毎に独立した veth が生成され、その片側をコンテナ内部のイーサネット「eth0」として割り当てる。
引用 : http://www.school.ctc-g.co.jp/columns/nakai/nakai41.html
デモ(その1)
chroot を使ったルートファイルシステムの隔離
chroot
/
lib bin usr demo etc
bin lib
chroot → /
etc usr
chroot
新たな ルートディレクトリの作成
bashの動作に最低限必要な環境を新たな ルートディレクトリ配下にコピー
新たなルートディレクトリでbashを動かす
$ sudo mkdir -p /demo/chroot
$ sudo cp -pr /bin /lib /lib64 /usr /etc /demo/chroot/
$ sudo chroot /demo/chroot /bin/bash
LXC
Linuxカーネルの機能のみを用いてコンテナの操作を行うソフトウェアとして、2008年ごろから linuxcontainers.orgで 開発されている。
Linuxカーネルにパッチを当てたりすることなく、カーネルに実装されているコンテナに関する機能を前提にして簡単にコンテナの操作が行える。
Container と LXC
LXCという用語は以下の2つの意味で使われることがある。
I. Linuxカーネルが持つ機能を使って実現するコンテナという一般的な意味で使う場合
II. linuxcontainers.org で開発されているコンテナを扱うためのソフトウェアという狭い意味
本講習会では、前者の意味では「Container/コンテナ」、後者の意味では「LXC」と区別して説明する。
ちなみに、LXC以外には?
LXC以外の代表的なコンテナ方面のソフトウェア。
Linuxカーネルにコンテナ関連の技術が充分に実装されていない頃から、カーネルにパッチを当ててコンテナを実現してきた本分野のパイオニア的ソフトウェア。現在Linuxカーネルに実装されているコンテナ機能にはOpenVZ由来のものが数多くある。なお、これをベースとした商用ソフト「Virtuozzo」は、現在でも、世界中のホスティングサービスで広く使われている。
Cloud Foundry というPaaSを構築できるソフトウェアで、その心臓部といえるコンテナ機能を提供するコンポーネント。
主に、Linux kvm サーバ仮想化環境を管理するツールであるが、Linuxコンテナにも対応している。
デモ(その2)
LXCを使用したコンテナの利用
LXCの利用条件
LXCのインストールには、ubuntu OSがお勧め、出来る限り ubuntu14.04 以降のバージョンを使用すること。
centos など RedHat系OSにもインストールできるようであるが、ubunutに比べて環境設定が激しく面倒くさい。(インストーラでいろいろやってくれない)
LXCは、root ユーザで操作する必要がある。
デモ環境
ホスト ubuntu 14.0.4 trusty / 64bit Kernel 3.13.0-48-generic
lxc version 1.0.7-0ubuntu0.1
LXC インストール
ubuntuの場合、以下のコマンド一発でインストールが終わる。
ubuntu01という名前でubuntuベースのコンテナ作成
※ 社内ネットワークを経由する場合は、別途Proxy設定が必要。
$ sudo apt install lxc
$ sudo lxc-create -t ubuntu -n ubuntu01
LXCでコンテナ作成
LXCコンテナは、仮想マシンのようにDVDなどのISOイメージからインストールすることはできない。
従って、LXCには、コンテナを作成するためのスクリプトとしてテンプレートが付属しており、テンプレートを使って、コンテナイメージを作成する。
また、 lxc-downloadという名前のテンプレートが付属しており、あらかじめ構築されたコンテナイメージをLXCのサイトからダウンロードしてコンテナを作成することも可能である。
コンテナ起動と停止
ubuntu01 という名前のコンテナを起動
起動したコンテナに接続(その1)
起動したコンテナに接続(その2)
起動したコンテナを停止
$ sudo lxc-start -n ubuntu01 -d
$ sudo lxc-attach -n ubuntu01
$ sudo lxc-stop -n ubuntu01
$ sudo lxc-console -n ubuntu01
その他の基本操作 作成したコンテナの一覧を見る
ubuntu01 という名前のコンテナの情報を見る
$ sudo lxc-ls ubuntu01
$ sudo lxc-ls -f NAME STATE IPV4 IPV6 AUTOSTART --------------------------------------------- ubuntu01 RUNNING 10.0.3.18 - NO
$ sudo lxc-info -n ubuntu01 Name: ubuntu01 State: RUNNING PID: 26948 ... ...
その他の基本操作
ubuntu01コンテナをubuntu02という名前でクローン
ubuntu02 という名前のコンテナを削除
その他、メモリやCPU、ディスクなどのコンテナ・リソースを制御するコマンド(lxc-cgroup)などがある。
$ sudo lxc-clone -o ubuntu01 -n ubuntu02
$ sudo lxc-destroy -n ubuntu02
入門編
Docker
「Docker」は、米国 Docker社(旧dotCloud)が開発するオープンソースのコンテナ管理ソフトウェアのひとつ。Go言語で実装されている。
軽量な仮想化環境であるコンテナを提供し、アプリケーション実行環境をそのまま Dockerイメージとして保存できる。
Docker
仮想サーバではなくアプリケーションに最適化されているため、原則的に、ひとつのコンテナに、ひとつのアプリケーションが実行する構成となる。
さらに、Dockerは、ネットワーク、ストレージ、ロギング、ディストリビューションなどマシン特有の設定を抽象化しているため、どんなマシンへも、どんな構成でも実行でき、ポータブルデプロイを実現できる。
LXCとDocker
もともとDockerは、LXCを経由してLinuxコンテナ機能を利用していた。
Docker Ver0.9 より、libcontainer という独自のライブラリを経由するように改良。
現在でもオプションでLXCを選択することが可能。
引用 : https://blog.docker.com/2014/03/docker-0-9-introducing-execution-drivers-and-libcontainer/
AUFS
AUFS(Another Union FS)とは、レイヤ構造のファイルシステムである。
親のファイルシステムをリード・オンリーとし、その上にライタブルなレイヤを重ねていく。
こうして複数のレイヤを積み重ね、レイヤを通じて、ひとつのファイルシステムのように扱う。
親コンテナからの差分管理ができるため、コンテナイメージの容量を軽量化できる。
AUFS
親コンテナからの差分管理ができるため、コンテナイメージの容量を軽量化できる。
引用 : http://gesellix.github.io/gradle-summit-2014/
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
デモ(その3)
Dockerの基礎的な利用方法
Docker の利用条件
Docker をインストールできる環境は、 Red Hat系 OS もしくは ubuntu系 OS であること、および 64bitマシン+OS であること。
カーネルが古いとうまく動作しないので、インストール前に 最新バージョンにアップ・トゥ・デートしておくこと
Dockerは、root ユーザ で操作する必要がある。
デモ環境
ホスト cnetos 6.6 / 64bit Kernel 2.6.32-504.el6.x86_64
docker version 1.4.1, build 5bc2ff8/1.4.1
Docker インストール
centos 6.6 へインストール
centos 6.6 で自動起動設定(必要に応じて)
※ 社内ネットワークを経由する場合は、別途Proxy設定が必要。
$ sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6 $ sudo yum -y install ¥ http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum install docker-io
$ sudo chkconfig docker on
Docker インストール
centos 7系 へインストール
centos 7系 で自動起動設定(必要に応じて)
※ 社内ネットワークを経由する場合は、別途Proxy設定が必要。
$ sudo yum install docker
$ sudo systemctl enable docker.service
Docker インストール
ubuntu 14.04 LTS へインストール
ubuntu 14.04 LTS で自動起動設定(必要に応じて)
※ 社内ネットワークを経由する場合は、別途Proxy設定が必要。
$ sudo apt install docker.io
$ sudo update-rc.d docker.io defaults
Docker イメージ取得
centos 最新版のDockerイメージをDL
ubuntu 最新版のDockerイメージをDL
ubuntu 12.04 DockerイメージをDL
$ sudo docker pull ubuntu:latest
$ sudo docker pull ubuntu:12.04
$ sudo docker pull centos:latest
※社内ネットワークを経由する場合は、別途 DNSサーバの設定と Proxy設定が必要。
Docker イメージ管理
Dockerイメージの一覧表示
DLした ubuntu 12.04 イメージを削除
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos latest 214a4932132a 40 hours ago 229.6 MB ubuntu latest d0955f21bf24 3 weeks ago 192.7 MB ubuntu 12.04 9c5e4be642b7 3 weeks ago 132.1 MB
$ sudo docker rmi ubuntu:12.04
$ sudo docker rmi [IMAGE ID で指定することも可能]
Docker コンテナ生成+起動
centos 最新版イメージから centos01という名前でコンテナを作成、そして、アプリケーションに bash を指定して実行する
Dockerコンテナ centos の bash に入る
Dockerコンテナの bash を exit するとコンテナ自体も終了する
$ sudo docker run -i -t --name centos01 centos:latest /bin/bash
[コンテナ内のbashでいろいろ操作] ... ...
# exit (bash を exit)
Docker コンテナ生成+起動
ubuntu 最新版イメージから ubuntu01 という名前でコンテナを作成、同じくアプリケーションに bash を指定して実行
Dockerコンテナ ubuntu の bash に入る
コンテナの bash を exit するとコンテナも終了する
$ sudo docker run -it --name ubuntu01 ubuntu /bin/bash
Docker コンテナ生成+起動
docker run コマンド書式
# docker run ¥ [オプション] ¥ [--name コンテナ名] ¥ イメージ名 [:タグ名] ¥ [コンテナで実行するコマンドとその引数]
Docker コンテナ生成+起動
docker run の主なオプション
option 説 明
-d コンテナをバックグラウンドで実行する。 WebサーバやDBサーバなど、デーモン系のプロセスを常時実行するコンテナの場合に指定する。
-i コンテナの標準入力を開く。 /bin/bashなどでコンテナを対話で操作する場合に指定する。
-t 端末デバイス(tty)を確保する。-iと同時に使用することが多い。 /bin/bashなどでコンテナを対話で操作する場合に指定する。
-p "-p ホスト側ポート:コンテナ側ポート" で、Dockerサーバとホストサーバ間のポートマッピングを構成する
Docker コンテナ生成+起動
Docker は、仮想サーバではなくアプリケーションに最適化されているため、原則的に、ひとつのコンテナに、ひとつのアプリケーションが実行する構成となる。
すなわち、Dockerは、docker run で作成したコンテナ内で、同コマンドで指定するひとつの アプリケーションを実行する。
指定したアプリケーションが exit すると同時にそのDockerコンテナも 停止 する。
デタッチ/アタッチ
centos02コンテナを作成してbashを起動
Dockerコンテナをデタッチ
Dockerコンテナにアタッチ
再び、Dockerコンテナに入る
bash を exit でコンテナを終了
$ sudo docker run -it --name centos02 centos:latest /bin/bash
コンテナ内で [Ctrl] + [p] → [Ctrl] + [q] キーを押下
$ sudo docker attach centos02
Docker コンテナ管理
既存コンテナ centos02 を再起動
docker start コマンド書式
$ sudo docker start –i centos02
# docker start [-i] {コンテナ名|コンテナID}
option 説 明
-i コンテナの標準入力を開く。 /bin/bashなどでコンテナを対話で操作する場合に指定する。
Docker コンテナ管理
Docker コンテナ一覧(動いているものだけ)表示
止まってるものを含め全部の一覧
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0e9b0b2759ec centos:latest "/bin/bash" 4 minutes ago Up 50 seconds centos02
$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0e9b0b2759ec centos:latest "/bin/bash" 6 minutes ago Up 3 minutes centos02 1352f3ef1c8b ubuntu:latest "/bin/bash" 11 minutes ago Exited (0) 11 minutes ago ubuntu01 cc8c0601370d centos:latest "/bin/bash" 13 minutes ago Exited (0) 12 minutes ago centos01
Docker コンテナ管理
起動中の centos02コンテナを停止
Docker コンテナの削除
$ sudo docker stop centos02
$ sudo docker stop [container ID で指定することも可能]
$ sudo docker rm centos02
$ sudo docker rm [container ID で指定することも可能]
カスタム Docker イメージ作成
Docker コンテナ
Docker イメージ
Docker イメージ
docker run docker commit
Docker コンテナ
docker run
httpd install
httpd 起動
with httpd
カスタム Docker イメージ作成
centos03 コンテナを作成して bashで起動
Dockerコンテナのシェルに入る
centos03コンテナに httpd をインストール
Ctrl+p+q で Dockerコンテナをデタッチ
[コンテナ内のbashで操作] # yum install -y httpd
$ sudo docker run -it --name centos03 centos:latest /bin/bash
※社内ネットワークを経由する場合は、コンテナ内部のサーバに対する Proxy設定が必要。
カスタム Docker イメージ作成
centos03 コンテナを停止
Apache をインストールした centos03 コンテナから「hoge/httpd」という名前の新たな Dockerイメージを作成
$ sudo docker stop centos03
$ sudo docker commit centos03 hoge/httpd
カスタム Docker イメージ作成
docker commit コマンド書式
# docker commit ¥ {コンテナ名|コンテナID} ¥ [ユーザ名/]イメージ名
カスタム Docker イメージ作成
docker imagesで、作成したイメージを確認
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE hoge/httpd latest 140390d72115 13 seconds ago 311.2 MB centos latest 0114405f9ff1 6 hours ago 229.6 MB ubuntu latest d0955f21bf24 3 weeks ago 192.7 MB
カスタム Docker イメージ作成
作成した hoge/httpd イメージを元に、web01というコンテナを作成、バックグラウンドモードで起動する
docker ps で起動確認
ホストの8080ポートにアクセスしてテスト!
$ curl localhost:8080
$ sudo docker run -d -p 8080:80 --name web01 ¥ hoge/httpd /usr/sbin/httpd -D FOREGROUND
Docker コンテナ管理
バックグラウンドで起動中の web01コンテナに接続
バックグラウンドで起動中の web01コンテナを停止
$ sudo docker exec -it web01 /bin/bash
$ sudo docker stop web01
$ sudo docker stop [container ID で指定することも可能]
Docker Hub でイメージ共有
Docker Hub のアカウントを作成
Docker Hubにログイン
Docker Hub に先ほど作成した「hoge/httpd」イメージをPUSH
$ sudo docker login
$ sudo docker push hoge/httpd
https://www.docker.com/
実践編
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
Dockerイメージのビルド
docker build 書式
# docker build ¥ [-t ユーザ名/イメージ名[:タグ名]] ¥ Dockerfile格納ディレクトリ
引用 : 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
デモ(その4)
Dockerを使用した
書籍管理アプリケーション実行環境構築
デモ環境
ホスト cnetos 6.6 / 64bit Kernel 2.6.32-504.el6.x86_64
docker version 1.4.1, build 5bc2ff8/1.4.1
基本編と 同じ環境
ホストサーバ
Data Volume
完成イメージ
APサーバ コンテナ
Tomcat
DBサーバ コンテナ
postgresql
データベース ファイル
ログ ファイル
ポート フォワード
8080:8080
コンテナ リンク
DB接続
利用者
簡易版書籍管理 アプリケーション
Data Volume
DBサーバ構築
postgreSQL 構築用
Dockerfile
docker build
PostgreSQL Dockerイメージ
hoge/postgres:1.0
DB初期化用 コンテナ
データベースファイル
PostgreSQL 実行コンテナ
DBファイル
初期化
DBサーバのDockerfile
DBサーバ構築
FROM centos:latest MAINTAINER hoge <[email protected]> # postgerSQL セットアップ RUN yum -y install postgresql-server # PORT 開放 EXPOSE 5432 # コンテナ実行コマンド CMD su - postgres -c "postgres -D /var/lib/pgsql/data"
DBサーバイメージ(hoge/postgres)ビルド
Data Volume を格納するディレクトリをホストに作成
DBサーバ構築
$ sudo docker build -t hoge/postgres:1.0 [dockerfile格納DIR]
$ sudo mkdir -p /docker_mnt/pgsql/data
DBサーバ構築
Postgresql初期セットアップ用コンテナ起動
Postgresqlの初期セットアップ
$ sudo docker run -it --rm ¥ -v /docker_mnt/pgsql/data:/var/lib/pgsql/data ¥ hoge/postgres:1.0 /bin/bash
[コンテナ内のbashで操作] # chown -R postgres:postgres /var/lib/pgsql/data # su - postgres $ initdb --encoding=UTF8 --no-locale $ pg_ctl -D /var/lib/pgsql/data start $ psql・・ 必要に応じてDBオブジェクトを構築し当該コンテナを終了
PostgreSQL初期セットアップは、Data Volumeに格納されるデータベースファイルを作成するものである。このため、本作業は最初に一度だけ行えば良い。
DBサーバ構築
DBサーバコンテナ生成してPostgrrSQLを起動
$ sudo docker run -d ¥ -v /docker_mnt/pgsql/data:/var/lib/pgsql/data ¥ -p 5432:5432 --name db01 hoge/postgres:1.0
実行コマンドの指定がない場合Dockerfile の CMD で定義したコマンドが起動する
Data Volume
APサーバ構築
Tomcat 構築用
Dockerfile
docker build
Tomcat Dockerイメージ
hoge/tomcat:1.0
ログファイル
Tomat 実行コンテナ
APサーバ構築 APサーバのDockerfile
FROM centos:latest MAINTAINER hoge # Tomcat セットアップ RUN yum -y install tomcat RUN echo 'export CATALINA_BASE="/usr/share/tomcat"' >> /root/.bashrc # Tomcat 起動スクリプトをコピー ADD tomcat_start.sh /usr/bin/ RUN chmod a+x /usr/bin/tomcat_start.sh # 書籍管理アプリをデプロイ ADD bookmgr.war /usr/share/tomcat/webapps/ # PORT 開放 EXPOSE 8080 # コンテナ実行コマンド ENTRYPOINT ["/usr/bin/tomcat_start.sh"]
APサーバ構築
(参考)tomcat_start.sh
#! /bin/bash export CATALINA_BASE="/usr/share/tomcat" /usr/sbin/tomcat start trap '/usr/sbin/tomcat stop; sleep 2; exit 0' TERM while : do sleep 1 done
APサーバ構築
APサーバイメージ(hoge/tomcat)ビルド
Data Volume を格納するディレクトリをホストに作成
$ sudo docker build -t hoge/tomcat:1.0 [dockerfile格納DIR]
$ sudo mkdir -p /docker_mnt/tomcat/logs $ sudo chmod a+w /docker_mnt/tomcat/logs
APサーバ構築
APサーバコンテナを生成、Tomcat を起動
$ sudo docker run -d ¥ -v /docker_mnt/tomcat/logs:/usr/share/tomcat/logs ¥ -p 8080:8080 --link db01:db ¥ --name ap01 hoge/tomcat:1.0
Dockerfile の ENTRYPOINTで定義した 起動コマンドは docker run で別のコマンドに変更することができない。
活用のススメ
Docker の利点
コンテナなのでオーバヘッドが少なく、動作が軽い
コンテナイメージを手軽にやり取りできる
コンテナは様々な環境で等しく動く
各コンテナは、いろいろなディストリビューションやバージョンで構成できる
コンテナ(インフラ)をコードで表現できる
利点を生かすためには
コンテナ内で動くアプリケーションは、できるだけシンプルなものであること。
複数のコンテナで動く、アプリケーションはできるだけ疎結合に連携すること。
各アプリケーションは、ステートレスな作りであること。
ユーザデータなどの保存先は分離できること。
マイクロ・サービス
ひとつのアプリケーションを、大きな一枚岩の塊ではなく、複数の軽量なサービスを連携させたアーキテクチャで実現する。
各サービスはそれぞれのプロセスで動き、サービス間のメッセージは、HTTP経由でAPI呼び出しされるか、RabbitMQやZeroMQといった軽量メッセージングシステムによる通信で交換される。
サービスごとに言語やデータベースなどは統一されず、個別に適切なものが選択される。また、サービスごとにデータを持ち、統合されていない。
どんなシステムに使えるか
すでにWeb関連サービス では主流になりつつある。
2014年5月の段階で『自社のサービスは全てDocker のようなコンテナで動いており、旧来の仮想マシンは使用していない』と発表。
近い将来、科学技術計算、情報通信、製造、流通など様々な分野での活用が予想されるが、うまく活用するためには、シンプルで小さなアプリケーションであることが重要。 複雑で大きなモジュールの塊から、疎結合で自律的な小さなアプリケーション群を連携させるマイクロサービスへ転換できるかどうかが鍵!!
商用として利用できますか?
Yes! 既にWeb系のサービスはコンテナの活用が進んでいる。
しかし、他のオープンソース同様、何か問題があった場合は、自分たちで解決する必要がある。
製品に詳しい技術者の育成が重要。
なにから始めるか
社内 Docker リポジトリ
結合試験環境1系
結合試験環境2系
Docker活用のススメ
開発環境 (開発PC)
アプリケーション コンテナイメージ
ステージング環境
アプリケーション コンテナイメージ
アプリケーション コンテナイメージ
アプリケーション コンテナイメージ
アプリケーション コンテナイメージ
社内 git/svn リポジトリ
結合試験環境1系
Docker活用のススメ
開発環境 (開発PC)
アプリケーション コンテナイメージ
Dockerfile
Dockerfile 結合試験環境N系
アプリケーション コンテナイメージ
自動テスト環境
社内 git/svn リポジトリ
結合試験環境1系
Docker活用のススメ
開発環境 (開発PC)
アプリケーション コンテナイメージ
アプリケーション コンテナイメージ
Dockerfile
Dockerfile
CIサーバ
Jenkins
社内 Docker リポジトリ
アプリケーション コンテナイメージ
結合試験環境N系
アプリケーション コンテナイメージ
コンテナとは、 CPUやメモリ、プロセス空間、ディスク、ネットワークなどを隠蔽するOS(Linuxカーネル)が持つ機能を使って実現している。
コンテナを簡単に使えるようにしたツールのひとつにLXCがある。
Docker は、LXCを拡張してコンテナを更に簡単に扱えるようにしたツール。
Docker Hubというリポジトリを経由すると、インターネットを介して、コンテナをポータブルにできる。
Dockerfile という形式で、サーバインフラをコード化することができる。
Docker をうまく活用するには、それなりのアーキテクチャを検討する必要がある。
つまり、疎結合で自律的な小さなアプリケーション群を連携させるマイクロサービス型アーキテクチャであることが重要。
Docker は、主要なベンダを巻き込みながら、非常に影響力の大きなエコシステムを構築しており、今後ますます発展することが見込まれる。
まずは、開発業務や検証業務での活用をお勧め。
ぜひ自分でも Docker をインストールしてさわって見て下さい!!
これを機会に、複数の Docker使い が誕生することを期待しています
期待しています
おしまい
ご静聴ありがとうございました