Announcing the release of Docker 17.03 CE
https://blogs.oracle.com/linux/announcing-the-release-of-docker-1703-ce
Technology preview ですが、Docker Swarm を利用してよいとのことなので、
Swarm モードにしてみました。
OL7 のマニュアルにも、Docker Swarm の記載があります。
Oracle Linux 7 Docker User's Guide
Chapter 6 Docker Swarm
https://docs.oracle.com/cd/E52668_01/E87205/html/docker-swarm.html
今回は、3ノード(うち Manaer は 1ノード)構成にしてみました。
ホスト名、IP アドレスは、それぞれ下記です。
- swarm01 192.168.1.51 ※Manager
- swarm02 192.168.1.52
- swarm03 192.168.1.53
OS の準備。
3台それぞれで、同様の準備をしておきます。
例として、1台目「swarm01」の設定です。
最新の ORACLE Public Yum リポジトリのリストをダウンロードしてから、
RPM を yum コマンドで、最新化しておきます。
[root@swarm01 ~]# curl -o /etc/yum.repos.d/public-yum-ol7.repo http://yum.oracle.com/public-yum-ol7.repo
[root@swarm01 ~]# yum upgrade -y
[root@swarm01 ~]# reboot
Oracle Linux 7.3 を使用します。
[root@swarm01 ~]# cat /etc/oracle-release
Oracle Linux Server release 7.3
[root@swarm01 ~]# uname -r
4.1.12-94.3.7.el7uek.x86_64
addons チャネルから、docker-engine をインストールします。
[root@swarm01 ~]# yum install -y --enablerepo=ol7_addons docker-engine
firewalld は、事情により無効化、停止しておきます。
[root@swarm01 ~]# systemctl disable firewalld
[root@swarm01 ~]# systemctl stop firewalld
Docker 17.03 CE の RPM がインストールされました。
[root@swarm01 ~]# rpm -q docker-engine
docker-engine-17.03.1.ce-3.0.1.el7.x86_64
Docker サービスを有効化し、起動します。
[root@swarm01 ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@swarm01 ~]# systemctl start docker
[root@swarm01 ~]# systemctl is-active docker
active
Docker Swarm を構成する。
ここからは、Master と Worker とで設定内容が変わります。
まず、Manager にする 1台目で、Swarm を 初期化します。
Worker を参加させるためのコマンドラインが表示されるので、記録しておきます。
[root@swarm01 ~]# docker swarm init
Swarm initialized: current node (ttf1z7dop1ot09jt45ecywyyk) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-43wj3xufbiup17m0ai4bpe3svnlo6ntzvn8c0d2p9no8o1tqcb-d3s4mme98ejek8bzbv4w8jqk4 \
192.168.1.51:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[root@swarm01 ~]#
そして、Worker を追加します。
swarm init 実行時に表示された swarm join のコマンドラインを
swarm02 / swarm03 で、実行します。
swarm02
[root@swarm02 ~]# docker swarm join --token SWMTKN-1-43wj3xufbiup17m0ai4bpe3svnlo6ntzvn8c0d2p9no8o1tqcb-d3s4mme98ejek8bzbv4w8jqk4 192.168.1.51:2377
This node joined a swarm as a worker.
swarm03
[root@swarm03 ~]# docker swarm join --token SWMTKN-1-43wj3xufbiup17m0ai4bpe3svnlo6ntzvn8c0d2p9no8o1tqcb-d3s4mme98ejek8bzbv4w8jqk4 192.168.1.51:2377This node joined a swarm as a worker.
Master ノードでコマンド実行すると、
3ノードの Swarm クラスタが構成されたことが確認できます。
[root@swarm01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
qdizh97sqam2amem0wvfhq81n swarm02 Ready Active
ttf1z7dop1ot09jt45ecywyyk * swarm01 Ready Active Leader
we6kkeha7ubdnyjjgjhush3vu swarm03 Ready Active
コンテナの起動。
docker run コマンドのかわりに、docker service create コマンドでコンテナを起動します。
- サービスは web01 という名前にします。
- 3つのコンテナ(--replica 3)を起動します。
- TCP 80 番ポートを外部に公開しています。
- コンテナイメージは DockerHub 公式の nginx です。
[root@swarm01 ~]# docker service create --replicas 3 --name web01 -p 80:80 nginx
ugzfu0lfrp54faqeawfpg5i1j
コンテナが 3つすべて(3/3)起動しました。
コンテナのイメージは、自動的に Docker Registry からダウンロードされます。
[root@swarm01 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE
ugzfu0lfrp54 web01 replicated 3/3 nginx:latest
web01 サービスのコンテナは、3ノードの Dcoker ホストに分散されています。
[root@swarm01 ~]# docker service ps web01
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
ejzdixkz7c87 web01.1 nginx:latest swarm02 Running Running 5 seconds ago
n6xnki6ga9g6 web01.2 nginx:latest swarm03 Running Running 6 seconds ago
45mdye7mnpgu web01.3 nginx:latest swarm01 Running Running 5 seconds ago
ためしに 1台(swarm02) で docker image を表示してみると、
イメージがダウンロードされていることがわかります。
[root@swarm02 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx <none> c246cd3dd41d 5 days ago 107 MB
コンテナも起動されています。
[root@swarm02 ~]# docker container psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
291307e09faf nginx@sha256:72c7191585e9b79cde433c89955547685db00f3a8595a750339549f6acef7702 "nginx -g 'daemon ..." 2 minutes ago Up 2 minutes 80/tcp web01.1.ejzdixkz7c87ijrq17xw8ge28
サービスへのアクセス確認。
コンテナの Web サーバに curl でアクセスしてみます。
3台のホストの 80番ポートにアクセスしてみると、HTML が取得できているように感じます。
しかし実際は Swarm のロードバランス機能が動作しているので、
このようなアクセス確認の場合は、それぞれの Docker ホストで HTML を変更したりして
どこにアクセスしているか見やすくしたほうがよさそうです。
[root@swarm01 ~]# curl -s http://192.168.1.51:80 | head -n 4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
[root@swarm01 ~]# curl -s http://192.168.1.52:80 | head -n 4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
[root@swarm01 ~]# curl -s http://192.168.1.53:80 | head -n 4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
[root@swarm01 ~]#
たとえば、web01 サービスのコンテナを 1つに減らしてから
同様にアクセスしても・・・
[root@swarm01 ~]# docker service scale web01=1
web01 scaled to 1
[root@swarm01 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE
ugzfu0lfrp54 web01 replicated 1/1 nginx:latest
[root@swarm01 ~]# docker service ps web01
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
ejzdixkz7c87 web01.1 nginx:latest swarm02 Running Running 8 minutes ago
Swarm の機能で、どのホストからでもコンテナにアクセスできるので、
swarm02 以外の Docker ホストにアクセスしても、HTML が取得できます。
[root@swarm01 ~]# curl -s http://192.168.1.51:80 | head -n 4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
[root@swarm01 ~]# curl -s http://192.168.1.52:80 | head -n 4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
[root@swarm01 ~]# curl -s http://192.168.1.53:80 | head -n 4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
[root@swarm01 ~]#
このように、わりと簡単に Docker ホストのクラスタを動作させることができます。
以前のパッケージ(Docker 1.12.x)でも既に Swarm モードは利用可能でしたが、
以前のパッケージ(Docker 1.12.x)でも既に Swarm モードは利用可能でしたが、
Technology preview での提供がアナウンスされたので、あえて構成してみました。
以上、OL7 で Docker Swarm を構成してみる話でした。
0 件のコメント:
コメントを投稿