2017年6月30日金曜日

Oracle Linux 7 で Docker Swarm モード。

Oracle Linux 7 (OL7)むけの Docker 17.03 CE パッケージがリリースされました。

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 アドレスは、それぞれ下記です。
  1. swarm01  192.168.1.51 ※Manager
  2. swarm02  192.168.1.52
  3. 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 モードは利用可能でしたが、
Technology preview での提供がアナウンスされたので、あえて構成してみました。

以上、OL7 で Docker Swarm を構成してみる話でした。

0 件のコメント:

コメントを投稿