Docker
ドッカー集団モード
サーチ…
前書き
スウォームは、 サービスを一括して展開する多くのDockerエンジン(またはノード )です。 Swarmは、多くの物理マシン、仮想マシン、またはクラウドマシンに処理を分散するために使用されます。
構文
swarmを初期化する :docker swarm init [オプション]
ノードまたはマネージャとして swarmに参加する:docker swarm join [オプション] HOST:PORT
新しいサービスを作成する :ドッカーサービス作成[オプション]イメージ[コマンド] [ARG ...]
1つまたは複数のサービスに関する詳細情報を表示する :docker service inspect [オプション]サービス[サービス...]
サービスを一覧表示する :ドッカーサービスls [オプション]
1つ以上のサービスを削除する :ドッカーサービスrm SERVICE [SERVICE ...]
1つまたは複数のレプリケートされたサービスをスケールする :ドッカーサービススケールSERVICE = REPLICAS [SERVICE = REPLICAS ...]
1つ以上のサービスのタスクを一覧表示します :docker service ps [オプション] SERVICE [サービス...]
サービス更新 :ドッカサービスの更新を[OPTIONS]サービス
備考
スウォームモードには、次の機能が実装されています。
- Docker Engineと統合されたクラスタ管理
- 分散設計
- 宣言的サービスモデル
- スケーリング
- 希望の状態の調整
- マルチホストネットワーキング
- サービス発見
- ロードバランシング
- デフォルトで安全なデザイン
- 更新プログラムの更新
Swarmに関するより多くの公式のDockerドキュメント: Swarmモードの概要
スターンモードCLIコマンド
ドキュメントのコマンドの説明をクリックしてください
docker swarm init [OPTIONS]
docker swarm join [OPTIONS] HOST:PORT
docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
docker service inspect [OPTIONS] SERVICE [SERVICE...]
docker service ls [OPTIONS]
docker service rm SERVICE [SERVICE...]
docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...]
docker service ps [OPTIONS] SERVICE [SERVICE...]
docker service update [OPTIONS] SERVICE
docker-machineとVirtualBoxを使ってLinux上にswarmを作成する
# Create the nodes
# In a real world scenario we would use at least 3 managers to cover the fail of one manager.
docker-machine create -d virtualbox manager
docker-machine create -d virtualbox worker1
# Create the swarm
# It is possible to define a port for the *advertise-addr* and *listen-addr*, if none is defined the default port 2377 will be used.
docker-machine ssh manager \
docker swarm init \
--advertise-addr $(docker-machine ip manager)
--listen-addr $(docker-machine ip manager)
# Extract the Tokens for joining the Swarm
# There are 2 different Tokens for joining the swarm.
MANAGER_TOKEN=$(docker-machine ssh manager docker swarm join-token manager --quiet)
WORKER_TOKEN=$(docker-machine ssh manager docker swarm join-token worker --quiet)
# Join a worker node with the worker token
docker-machine ssh worker1 \
docker swarm join \
--token $WORKER_TOKEN \
--listen-addr $(docker-machine ip worker1) \
$(docker-machine ip manager):2377
ワーカーとマネージャのジョイントークンを調べる
swarmに新しいノードのプロビジョニングを自動化するときは、swarmの正しい結合トークンとアドミニストレーターのアドバタイズされたアドレスを知る必要があります。これは、既存のマネージャノードのいずれかで次のコマンドを実行することで確認できます。
# grab the ipaddress:port of the manager (second last line minus the whitespace)
export MANAGER_ADDRESS=$(docker swarm join-token worker | tail -n 2 | tr -d '[[:space:]]')
# grab the manager and worker token
export MANAGER_TOKEN=$(docker swarm join-token manager -q)
export WORKER_TOKEN=$(docker swarm join-token worker -q)
-qオプションは、トークンのみを出力します。このオプションがなければ、swarmに登録するための完全なコマンドが得られます。
次に、新たにプロビジョニングされたノードで、あなたはswarmを使って参加することができます。
docker swarm join --token $WORKER_TOKEN $MANAGER_ADDRESS
こんにちは世界のアプリケーション
通常は、サービスのスタックを作成して、複製されたオーケストレーションされたアプリケーションを作成したいと考えています。
典型的な最新のWebアプリケーションは、データベース、API、フロントエンド、およびリバースプロキシで構成されています。
永続性
データベースには永続性が必要なので、swarmのすべてのノードで共有されるファイルシステムが必要です。それは、NAS、NFSサーバー、GFS2または何か他のものにすることができます。それを設定することはここでは範囲外です。現在、Dockerには集団の永続性は含まれておらず、管理されていません。この例では、すべてのノードに/nfs/
sharedロケーションがマウントされていると想定しています。
ネットワーク
互いと通信できるようにするには、swarmのサービスが同じネットワーク上にある必要があります。
IP範囲(ここでは10.0.9.0/24
)とネットワーク名( hello-network
)を選択し、コマンドを実行します。
docker network create \
--driver overlay \
--subnet 10.0.9.0/24 \
--opt encrypted \
hello-network
データベース
私たちが必要とする最初のサービスはデータベースです。例としてpostgresqlを使ってみましょう。 nfs/postgres
データベース用のフォルダを作成し、これを実行します:
docker service create --replicas 1 --name hello-db \
--network hello-network -e PGDATA=/var/lib/postgresql/data \
--mount type=bind,src=/nfs/postgres,dst=/var/lib/postgresql/data \
kiasaki/alpine-postgres:9.5
--network hello-network
と--mount
オプションを使用したことに注目してください。
API
APIの作成はこの例の範囲外です。したがって、 username/hello-api
下にAPIイメージがあるとしましょう。
docker service create --replicas 1 --name hello-api \
--network hello-network \
-e NODE_ENV=production -e PORT=80 -e POSTGRESQL_HOST=hello-db \
username/hello-api
データベースサービスの名前が渡されたことに注目してください。 Docker swarmにはラウンドロビンDNSサーバーが組み込まれているため、APIはDNS名を使用してデータベースに接続できます。
リバースプロキシ
私たちのAPIを外部世界に提供するためにnginxサービスを作成しましょう。共有場所にnginx設定ファイルを作成し、これを実行してください:
docker service create --replicas 1 --name hello-load-balancer \
--network hello-network \
--mount type=bind,src=/nfs/nginx/nginx.conf,dst=/etc/nginx/nginx.conf \
-p 80:80 \
nginx:1.10-alpine
ポートを公開するために-p
オプションを使用したことに注目してください。このポートは、swarmの任意のノードで使用できます。
ノードの可用性
スウォームモードノード可用性:
- アクティブとは、スケジューラがタスクをノードに割り当てることができることを意味します。
- Pauseはスケジューラーが新しいタスクをノードに割り当てないが、既存のタスクは実行中のままであることを意味します。
- ドレインはスケジューラが新しいタスクをノードに割り当てないことを意味します。スケジューラは、既存のタスクをすべてシャットダウンし、使用可能なノードでスケジューリングします。
モードの可用性を変更するには:
#Following commands can be used on swarm manager(s)
docker node update --availability drain node-1
#to verify:
docker node ls
スウォームノードの宣伝または降格
ノードまたはノードのセットをdocker node promote
は、マネージャノードからdocker node promote
を実行します。
docker node promote node-3 node-2
Node node-3 promoted to a manager in the swarm.
Node node-2 promoted to a manager in the swarm.
ノードまたはノードのセットをdocker node demote
は、マネージャノードからdocker node demote
を実行します。
docker node demote node-3 node-2
Manager node-3 demoted in the swarm.
Manager node-2 demoted in the swarm.
群を離れて
ワーカーノード:
#Run the following on the worker node to leave the swarm.
docker swarm leave
Node left the swarm.
ノードにManagerロールがある場合は、 マネージャの定足数を維持するための警告が表示されます。 --forceを使用すると、マネージャノードを終了することができます。
#Manager Node
docker swarm leave --force
Node left the swarm.
Swarmを離れたノードは、引き続きdocker node ls
出力に表示されます。
リストからノードを削除するには:
docker node rm node-2
node-2