はじめに本スライドは、以下の資料を抜粋したものです!!もうすこし詳しい情報を知りたい場合は併せて御覧ください
そろそろ知っておきたい Docker のキホン その2Docker Compose Swarm Machine 利用編http://www.slideshare.net/ngzm/so-50778247
また、 Docker の開発速度は非常に早いので、最新情報は公式ドキュメントをご確認ください
http://docs.docker.com/userguide/
Docker Compose インストール
$ curl -L https://github.com/docker/compose/releases/download/1.3.2/docker-
compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker- compose$ docker-compose -vcompose version 1.3.2
インストール例 ・・・ バイナリをころがすだけ!!
Linux 版 と MAC OS 版があるよ!
例えば WordPress システム構築
ホストサーバ
(storage)
Data Volumeコンテナ
(web)
WordPressコンテナ
(db)
MySQLコンテナ
データベースファイル
/var/lib/mysql
ポートフォワード
8080:80
コンテナリンク
DB 接続
利用者
Data Volume
Docker Compose を使うdocker-compose.yml でシステム構成を定義
storage: build: ./storagedb: image: mysql:5.7 volumes_from: - storage ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: passwordweb: image: wordpress:latest links: - db:mysql ports: - "8080:80"
コンテナ間のシステム構成を YAML で定義できる!!
定義内容は、 docker runのオプションとほぼ対応しておりうれしい!!
① Data
Volumeコンテナ
②MySQLコンテナ
③WordPres
sコンテナ
Docker Compose を使う
$ docker-compose build storage
$ docker-compose up -d
Data Volume コンテナイメージ( storage )をビルド
WordPress システムを構成するコンテナを一気に作成して起動
$ docker-compose stop
システムを構成するコンテナを一気に停止
$ docker-compose logs
システムを構成するコンテナのログを見る
Swarm クラスタリング
ホスト1192.168.1.11
ホスト 2192.168.1.12
ホスト 3192.168.1.13
役割• manager• node
役割• node
役割• node
node1 node2 node3
Docker Swarm ノードにより構成されるひとつの manager ノードが必要だよ!
Docker Swarm ノードの作り方
$ docker run --rm swarm create..... e1fc62b24f818a2af00fb4ddb8899965
まずは、任意のホストで create おまじない
$ docker run -p 2377:2375 -d swarm manage\
token://e1fc62b24f818a2af00fb4ddb8899965
ホスト1で Swarm manager コンテナを構築
$ docker run -d swarm join --addr=[ ノード IP アドレス ]:2375\
token://e1fc62b24f818a2af00fb4ddb8899965
各ホストそれぞれで Swarm node コンテナを構築
swarm create すると token と呼ばれる 文字列が表示されるので、これを使って 各node を構成します
Docker Swarm を使ってみる
ホスト1192.168.1.11
ホスト 2192.168.1.12
ホスト 3192.168.1.13
役割• manager• node
役割• node
役割• node
node1 node2 node3
manager にアクセスすると、あたかもひとつの Docker エンジンのように扱うことができるさー
Docker Swarm を使ってみる$ docker -H tcp://192.168.1.11:2377 infoContainers: 0Nodes: 3 agent-2: 192.168.1.13:2375 └ Containers: 0 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 514.5 MiB agent-1: 192.168.1.12:2375 └ Containers: 0 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 514.5 MiB agent-0: 192.168.1.11:2375 └ Containers: 0 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 514.5 MiB
Docker コマンドの接続先に manager の IP アドレスとポートを指定すると、 Docker Swarm クラスタにアクセスできる!!
Docker Swarm を使ってみる
$ docker -H tcp://192.168.1.11:2377 ps$ docker -H tcp://192.168.1.11:2377 images$ docker -H tcp://192.168.1.11:2377 run
いろんな Docker コマンドも普通に使える
環境変数を設定すると、 "-H tcp://[IP アドレス ]:[ ポート ]" が不要になる
$ export DOCKER_HOST=tcp://192.168.1.11:2377$ docker ps -a$ docker run ...
Docker Swarm 内にコンテナ生成
$ docker run -d -p 80:80 --name front1 nginx$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa4b0755a685 nginx:latest "nginx -g 'daemon of 32 seconds ago Up 27 seconds
192.168.1.12:80->80/tcp front1
Docker Swarm クラスタに nginx コンテナをたててみる
$ docker run -d -p 80:80 --name front2 nginx$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa4b0755a685 nginx:latest "nginx -g 'daemon of 32 seconds ago Up 27 seconds
192.168.1.12:80->80/tcp front1fa586fafd753 nginx:latest "nginx -g 'daemon of 3 minutes ago Up 3 minutes
192.168.1.11:80->80/tcp front2
もうひとつ nginx コンテナをたててみる
動いた!
Docker Machine
Docker Machine は、ローカル あるいは クラウド 上に、 Docker エンジンが動くホスト( vm )を構築したり管理したりできるツール! Docker Swarm クラスタも構築できる。
Vagrant みたいなイメー
ジ?
ローカル PC
仮想マシン/オーケストレーション製品
クラウド・プロバイダ
Amazon Web ServiceDigital OceanGoogle Compute EngineMicrosoft Azure .... etc
OpenStackVmwareVirtualBoxHyper-V ... etcDocker
Machine
VitualBox(boot2docker)
Docker Machine インストール
$ curl -L https://github.com/docker/machine/releases/download/v0.3.0/docker-
machine_darwin-amd64 > /usr/local/bin/docker-machine
$ chmod +x /usr/local/bin/docker-machine$ docker-machine -vmachine version 0.3.0
MAC OS へのインストール例 ・・ バイナリをころがすだけ!!Linux 版 や Windows 版もあるで~
$ curl -L https://get.docker.com/builds/Darwin/x86_64/docker-latest > /usr/local/bin/docker
必要に応じて Docker クライアントも拾ってきます
ローカルに Docker ホストをたてる
※ 実際には VirtualBox に boot2docker の vm イメージをダウンロードして起動します。 このため、ローカル PC に Virtualbox 4.3.28 がインストールされていることが前提となります。
$ docker-machine create --driver virtualbox host1
『 host1 』 という名前で Docker ホスト( Virtualbox 上の vm )を構築
$ docker-machine lsNAME ACTIVE DRIVER STATE URL SWARMhost1 virtualbox Running tcp://192.168.99.100:2376
構築した Docker ホストの一覧を見るOK
Docker ホストを使ってみる
$ eval "$(docker-machine env host1)"
構築した 『 host1 』 ホストをアクティブにするおまじない!!
$ docker-machine env host1export DOCKER_TLS_VERIFY="1"export DOCKER_HOST="tcp://192.168.100.99:2376"export DOCKER_CERT_PATH="/Users/<username>/.docker/machine/machines/host1"export DOCKER_MACHINE_NAME="host1"
Docker ホストを使ってみる
$ docker-machine lsNAME ACTIVE DRIVER STATE URL SWARMhost1 * virtualbox Running tcp://192.168.99.100:2376
もういちど Docker ホスト一覧を見ると・・
アクティブになった!!
$ docker run -d -p 80:80 --name web nginx$ docker ps$ docker stop ...$ docker rm ...
アクティブな Docker ホストにコンテナを生成したりして遊ぶ・・
アクティブな Docker ホストに対しては、普通に Docker コマンドが使用できる
いい感じにやりたいこと
Docker Machine を使って、 Amazon EC2 に Docker が動くホストを数台構築する
同時に、これらのホストをクラスタリングして Docker Swarm 環境を構築しチャウ
この Docker Swarm 環境に、 Docker Compose で コンテナを生成して連携させチャイナ
Amazon Web ServiceAmazon Web Serviceホスト1
DockerMachine
master
ホスト2
node1
ホスト3
node2
DockerSwarm
ホス
ト構
築・管
理
DockerCompose
コンテナ構築・管
理
$ docker-machine create --driver amazonec2\
--amazonec2-access-key [your access-key]\
--amazonec2-secret-key [your secet-key]\
--amazonec2-ami ami-f4b06cf4 \
--amazonec2-region ap-northeast-1 \
--amazonec2-vpc-id [your vcp-id] \
swarm-create
Docker Machine で Docker Swarm クラスタリングを create する用のホスト 『 swarm-create 』を構築!!
Docker Swarm を構築する
TokyoRegionの場合
AWS
Docker Swarm create おまじない
$ eval $(docker-machine env swarm-create)$ docker run swarm create ... 7d1ca38131c37fe03af760221de31a01
token
Docker Swarm を構築する
Docker Swarm を構築するDocker Machine で Swarm manager となるホスト1 『 master 』 を構築
$ docker-machine create --driver amazonec2\
--amazonec2-access-key [your access-key]\
--amazonec2-secret-key [your secet-key]\
--amazonec2-ami ami-f4b06cf4 \
--amazonec2-region ap-northeast-1 \
--amazonec2-vpc-id [your vcp-id]\
--swarm\
--swarm-master\
--swarm-discovery token://7d1ca38131c37fe03af760221de31a01\ master
token
Swarm manager 設定
Docker Swarm を構築するDocker Machine で Swarm node となるホスト2 『 node1 』 とホスト3『 node 2』を構築
$ docker-machine create --driver amazonec2\
--amazonec2-access-key [your access-key]\
--amazonec2-secret-key [your secet-key]\
--amazonec2-ami ami-f4b06cf4 \
--amazonec2-region ap-northeast-1 \
--amazonec2-vpc-id [your vcp-id]\
--swarm\
--swarm-discovery token://7d1ca38131c37fe03af760221de31a01\ node[12]
token
Swarm node 設定
Docker Swarm を構築するSwarm manager のホスト1 『 master 』 に接続、確認
$ eval $(docker-machine env --swarm master)$ docker infoContainers: 4Images: 3Role: primaryStrategy: spreadFilters: affinity, health, constraint, port, dependencyNodes: 3 dm-master: 52.69.171.103:2376 └ Containers: 2 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 1.018 GiB └ Labels: executiondriver=native-0.2, kernelversion=3.13.0-53-generic, operatingsystem=Ubuntu 14.04.2 LTS, provider=amazonec2, storagedriver=aufs dm-node1: 52.69.146.1:2376 └ Containers: 1 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 1.018 GiB └ Labels: executiondriver=native-0.2, kernelversion=3.13.0-53-generic, operatingsystem=Ubuntu 14.04.2 LTS, provider=amazonec2, storagedriver=aufs dm-node2: 52.69.190.50:2376 └ Containers: 1 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 1.018 GiB └ Labels: executiondriver=native-0.2, kernelversion=3.13.0-53-generic, operatingsystem=Ubuntu 14.04.2 LTS, provider=amazonec2, storagedriver=aufsCPUs: 3Total Memory: 3.053 GiB
Docker Compose で利用してみる
簡単ですが nginx コンテナを作成して起動!
nginx: image: nginx:latest ports: - "80:80"
docker-compose.yml
nginx コンテナを生成して起動!
$ docker-compose up -dCreating nginx_nginx_1...
Docker Compose で利用してみる
docker ps で確認する$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2a6ab7f5b98a nginx:latest "nginx -g 'daeon 7seconds ago Up 7 seconds 52.69.146.1:80->80/tcp node1/nginx_nginx_1
OK
スケール・アウトしてみる
Docker Compose で利用してみる
docker ps で確認する$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES82caa4b2b626 nginx:latest "nginx -g 'da 4 seconds ago Up 2 seconds 52.69.171.103:80->80/tcp master/nginx_nginx_3312649a3b648 nginx:latest "nginx -g 'da 5 seconds ago Up 4 seconds 52.69.190.50:80->80/tcp node2/nginx_nginx_22a6ab7f5b98a nginx:latest "nginx -g 'da a minute ago Up About a minute 52.69.146.1:80->80/tcp node1/nginx_nginx_1
Ooh !
$ docker-compose scale nginx=2
$ docker-compose scale nginx=3Service nginx specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.
Creating nginx_nginx_3...Starting nginx_nginx_3...
ノード数を超えて スケール・アウトしてみる!!$ docker-compose scale nginx=4Service nginx specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.
Creating nginx_nginx_4...unable to find a node with port 80 available
Docker Compose で利用してみる
docker ps で確認する$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES82caa4b2b626 nginx:latest "nginx -g 'da 4 seconds ago Up 2 seconds 52.69.171.103:80->80/tcp master/nginx_nginx_3312649a3b648 nginx:latest "nginx -g 'da 5 seconds ago Up 4 seconds 52.69.190.50:80->80/tcp node2/nginx_nginx_22a6ab7f5b98a nginx:latest "nginx -g 'da a minute ago Up About a minute 52.69.146.1:80->80/tcp node1/nginx_nginx_1
エラー w
スケール・インする$ docker-compose scale nginx=1Service nginx specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.
Stopping nginx_nginx_3...Stopping nginx_nginx_2...Removing nginx_nginx_3...Removing nginx_nginx_2...
Docker Compose で利用してみる
docker ps で確認する$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2a6ab7f5b98a nginx:latest "nginx -g 'da a minute ago Up About a minute 52.69.146.1:80->80/tcp node1/nginx_nginx_1
good!
ついでに Volume と Link を試す
冒頭でご紹介した wordpress システムの docker-compose.ymlstorage: build: ./storagedb: image: mysql:5.7 volumes_from: - storage ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: passwordweb: image: wordpress:latest links: - db:mysql ports: - "80:80"
Data Volume コンテナイメージ( storage )をビルド
$ docker-compose build storage
ついでに Volume と Link を試す
docker ps で確認する$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES9b214205ddb0 wordpress:latest "/entrypoint.sh 6 seconds ago Up 5 seconds 52.69.146.1:80->80/tcp node1/wp1_web_1bdffe99d4b6e mysql:5.7 "/entrypoint.sh 6 seconds ago Up 5 seconds 52.69.146.1:3306->3306/tcp node1/wp1_db_1
WordPress システムを構成するコンテナを一気に作成して起動$ docker-compose up -d
!!同ノード?
Docker Swarm の注意点
Volume を用いてコンテナが使用するディスクをマウントしたり、
Link を用いて、コンテナ間の連携をさせようとすると、
これらのコンテナは同一ノードに生成されてしまう!!
今だけ?
Docker Compose を使うと、幾つかのコンテナで構成されるシステムをまとめて管理できる必要に応じて Scale の変更も簡単!!
Docker Swarm を使えば、複数の Docker をクラスタリングして扱うことができる
Docker Machine を使うと、 Docker ホスト( vm )を1コマンドで構築できる! Docker Swarm ノードを作るのも簡単!
Docker Compose は まあ使える、特にScale 変更が簡単なのがうれしい!
Docker Swarm と Docker Machine もいい感じに便利 ・・ だが、ベータ版ということもあり 多少!?なところも・・
Docker Swarm • ノードをまたぐ Volume や Link ができない
Docker Machine• Windows 版でローカルな VirtualBox に vm を構築
しようとするとネットワーク( NIC )周りでエラー!利用断念
• AWS に Docker Machine で Swarm ノードを構築した場合、各ノードを再起動すると、 Swarm のノード構成が失われた ・・・ ip アドレスが変わったせいかしら??
!?だったところ
Top Related