へっぽこプログラマーの備忘録
プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。
menu
keyboard_arrow_up
Top
search
close
home
ホーム
computer
PC一般
construction
開発環境・ツール
code
プログラミング
home
ホーム
computer
PC一般
construction
開発環境・ツール
code
プログラミング
Home
›
Docker
›
[Docker] Swarm モードに入門してみた
2022/04/22
[Docker] Swarm モードに入門してみた
update
event_note
label
Docker
Docker をプロダクションで使っていくにあたり、コンテナの管理やアップデートをどうしようかと考えていました。 最初はこれを機に Kubernetes を使ってみようかと思ったのですが、学習コストが高いうえに、対象が小さなシステムなのでちょっと大仰すぎるなぁと思ってたところ、Docker 自体に Swarm モードというオーケストレーション機能が含まれていることを知ったので、そちらを試しに使ってみることにしました。
というわけで、以下のチュートリアルを少しやってみました。 - http://docs.docker.jp/engine/swarm/swarm-tutorial/toc.html 手順としては上記をなぞるだけになるかもしれませんが、自分にとってわかりにくかったところや、他のサイトで調べたりしたことなどを補足しながら書いていこうと思います。 一応、Swarm のドキュメントは以下になります。 - http://docs.docker.jp/engine/swarm/toc.html ちなみに Kubernetes と Docker Swarm の比較は以下のページがとても参考になりました。 - https://circleci.com/ja/blog/docker-swarm-vs-kubernetes/ ## 環境 - Ubuntu 20.04 - Docker 20.10.7 - Ubuntu 20.04 on WSL2 on Windows10 - Docker 20.10.10 Docker はインストール済みの前提です。 Docker がインストールされていれば Swarm モードも使えます。 チュートリアルでは Docker ホストは3つありますが、用意できなかったので Ubuntu と WSL2 上の Ubuntu の2つでやりました。 ## 概要 Docker Swarm モードは `manager` ノードと `worker` ノードから構成されます。 ノードというのは Docker のホスト(Docker エンジンが動作している環境)の単位になります。 - manager ノードはクラスタを管理するノード - worker ノードはコンテナを稼働させるノード - manager ノードは worker ノードを兼ねることもできる ## Swarm モードの有効化 Swarm モードを有効化するには `docker swarm init` を実行します。 このコマンドを実行すると manager ノードが作成されるので、manager ノードを作成したいマシン上で実行します。 ```shell $ docker swarm init Swarm initialized: current node (z9voajpw84i4jk2fomqwsmnc7) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-23t6ldii7xxyyol2ulu0qddlqgwp3i1xpckiij2yjpintebbjq-bw598idhl229sykrhyiykviiw 192.168.1.10:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. ``` 出力結果には worker ノードを manager ノードに登録するためのコマンドが表示されます(後述)。 また、1つのマシンに複数のIPアドレスが割り当てられている場合、以下のように `--advertise-addr` オプションで他のノードとの通信に使用するIPアドレスを指定することもできます。 ```shell $ docker swarm init --advertise-addr 192.168.1.10 ``` ### 確認 Swarm モードが有効になっているかどうかは `docker info` で確認できます。 ```shell $ docker info ``` 抜粋ですが、以下のような出力が確認できます。 ```shell Swarm: active NodeID: z9voajpw84i4jk2fomqwsmnc7 Is Manager: true ClusterID: 61lmt9ptc8jyphn725cj96vxj Managers: 1 Nodes: 1 ``` ノードに関する情報は `docker node ls` で確認できます。 ```shell $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION z9voajpw84i4jk2fomqwsmnc7 * manager1 Ready Active Leader 20.10.7 ``` ## worker ノードの作成 worker ノードの作成には `docker swarm init` を実行したときの出力結果に表示されたコマンドを使います。 manager ノードを作成したマシンとは別のマシンで以下のコマンドを実行します。 ```shell $ docker swarm join --token SWMTKN-1-23t6ldii7xxyyol2ulu0qddlqgwp3i1xpckiij2yjpintebbjq-bw598idhl229sykrhyiykviiw 192.168.1.10:2377 This node joined a swarm as a worker. ``` もし上記のコマンドが分からない場合は、`docker swarm join-token worker` で確認できます。 ```shell $ docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-23t6ldii7xxyyol2ulu0qddlqgwp3i1xpckiij2yjpintebbjq-bw598idhl229sykrhyiykviiw 192.168.1.10:2377 ``` 尚、既に worker ノードを作成済みであったり、manager ノードを作成しているマシンで `docker swarm join` を実行した場合、以下のエラーが表示されます。 ```shell Error response from daemon: This node is already part of a swarm. Use "docker swarm leave" to leave this swarm and join another one. ``` ### 確認 先ほどと同じように `docker node ls` で確認できます。 尚、このような Swarm を管理するコマンドは manager ノードが動作しているマシンでのみ実行可能です。 ```shell $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION hqi4gtcdh4a7ya8myg0x0my37 worker1 Ready Active 20.10.12 z9voajpw84i4jk2fomqwsmnc7 * manager1 Ready Active Leader 20.10.7 ``` ## サービスのデプロイ ノードを作成したので、そこにサービスを追加していきます。 まずは manager ノードにサービスを追加します。 上述したように、manager ノードは worker ノードも兼ねることができるので、サービスを動かすこともできます。 manager ノードが動作しているマシンで `docker service create` を実行します。 ```shell $ docker service create --replicas 1 --name helloworld alpine ping docker.com 84aq1iszx44xq2f3cmohfl2tu verall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged ``` ここでは、`alpine` のベースイメージで `helloworld` という名前のコンテナを作成し、コンテナ内で `ping docker.com` というコマンドを実行しています。 `--replicas 1` はコンテナの数です。 ### 確認 `docker service ls` で実行中のサービスを確認できます。 ```shell $ docker service ls ID NAME MODE REPLICAS IMAGE PORTS 84aq1iszx44x helloworld replicated 1/1 alpine:latest ``` ### サービスの詳細を調べる 別記事に書きました。 - https://kuttsun.blogspot.com/2022/04/docker-swarm.html ## サービスのスケール Swarm で実行しているサービスをスケールするには、`docker service scale <サービスID>=<タスク数>` を実行します。 尚、サービス内で実行中のコンテナを「タスク」(task)と呼ぶそうです。 ```shell $ docker service scale helloworld=5 helloworld scaled to 5 overall progress: 5 out of 5 tasks 1/5: running [==================================================>] 2/5: running [==================================================>] 3/5: running [==================================================>] 4/5: running [==================================================>] 5/5: running [==================================================>] verify: Service converged ``` ### 確認 `docker service ps <サービスID>` で確認すると、インスタンスが合計5つになったのが分かります。 タスク(コンテナ)は Swarm のノード間で分散されています。 また、各ノードで `docker ps` を実行することでコンテナの情報が確認できます。 ## サービスの削除 ```shell $ docker service rm helloworld helloworld ``` ### 確認 `docker service ls` で helloworld サービスが削除されたのを確認できます。 ```shell $ docker service ls ID NAME MODE REPLICAS IMAGE PORTS ``` `docker service inspect` で調べようとしてもそんなサービスはないと言われます。 ```shell $ docker service inspect helloworld [] Status: Error: no such service: helloworld, Code: 1 ``` `docker ps` でタスク(コンテナ)も削除されたことを確認できます。 ## ノードの削除 とりあえずここまでやってみました。 チュートリアルでは次はローリングアップデートとなっていますが、そこはまた今度にします。 尚、上記サービスは削除しましたが、ノードは残ったままです。 ノードの削除方法(Swarm モードの停止方法)を別記事に書きました。 - https://kuttsun.blogspot.com/2022/04/docker-swarm_21.html
## 参考 URL - https://knowledge.sakura.ad.jp/11072/ - https://circleci.com/ja/blog/docker-swarm-vs-kubernetes/
tweet
facebook
Pocket
B!
はてブ
LINE
chevron_left
chevron_right
Translate
Popular Posts
TortoiseGit でコミットメッセージを変更する
image
NO IMAGE
smbclient で session setup failed: NT_STATUS_LOGON_FAILURE が表示される
Docker for Windows の設定
image
NO IMAGE
マージ元ブランチとマージ先ブランチ
image
NO IMAGE
TortoiseSVN ロック状態のチェック
image
NO IMAGE
Visual Studio で文字がにじむ(ぼやける)
TortoiseGit でブランチ間の差分を見る
image
NO IMAGE
AsciidocFX をビルドする
image
NO IMAGE
PowerShellでブレークポイントが設定できない場合
[Python] 文字列の判定で、None と空文字を同時に判定する
Labels
.NET Core
31
.NET Framework
17
.NET Standard
2
AdminLTE
1
AI
1
Apache
3
AppVeyor
2
AsciiDoc
7
ASP.NET Core
55
Atom
4
AWS
5
AWS Cloud9
4
blockdiag
1
Blogger
13
Bootstrap
3
C/C++
6
C#
106
CentOS
3
Chrome
1
Chronograf
3
chrony
1
Codecov
1
CSS
1
Docker
80
DokuWiki
4
Doxygen
1
draw.io
1
EasyTag
1
Electron
1
Electron.NET
2
Entity Framework Core
9
Excel
2
FFmpeg
3
Firefox
6
Flask
1
Git
19
GitBook
4
GitBucket
7
GitHub
7
GitLab
39
Go
1
Google
1
Google Cloud Platform
1
Grafana
13
GStreamer
2
HTML
5
IIS
8
InfluxDB
14
JavaScript
15
Jekyll
2
Jenkins
7
Linux
34
Log4View
1
MahApps.Metro
3
MaterialDesignInXamlToolkit
1
MkDocs
2
MongoDB
5
MVC
1
MVVM
6
nginx
3
NLog
3
Node.js
8
npm
1
NVIDIA
3
onvif
1
OpenAPI
2
OpenCV
4
OpenSSL
3
OpenVINO
2
ownCloud
2
pandas
1
Pine Script
1
PlantUML
5
Portainer
3
PowerShell
8
Prism
2
PySide
19
Python
88
PyTorch
1
RabbitVCS
1
Razor
3
redis
1
Redmine
33
Redoc
1
remark.js
2
rocketchat
10
Ruby
3
scikit-learn
1
shotcut
1
SignalR
1
Slack
1
Socket.IO
1
SonarQube
5
Sphinx
10
SQL Server
5
SQLite
1
StableDiffusion
1
Subversion
2
Swagger
1
Swarmpit
1
Syslog
3
Telegraf
6
Tesseract
3
TestLink
2
Tomcat
2
TortoiseGit
11
TortoiseSVN
2
Trading View
1
Traefik
3
Travis CI
1
Ubuntu
31
Visual Studio
39
Visual Studio Code
10
VSCode
8
Vue.js
8
Windows
62
Windows 10
5
Windows ADK
1
Windows API
2
Windows Embedded
4
wkhtmltopdf
2
Word
3
WPF
12
WSL
5
WSL2
5
Xamarin
1
xUnit
5
yaml
1
yolo
1
アプリケーション
1
デザインパターン
1
テスト
1
バッチファイル
2
プログラミング
4
ライセンス
1
暗号資産(仮想通貨)
1
英語
2
確定申告
1
機械学習
1
強化学習
1
雑記
1
書籍
1
数学
1
正規表現
1
動画編集
1
Blog Archive
►
2024
(18)
►
9月
(5)
►
8月
(1)
►
7月
(2)
►
6月
(1)
►
4月
(2)
►
3月
(1)
►
2月
(5)
►
1月
(1)
►
2023
(30)
►
12月
(3)
►
11月
(5)
►
10月
(2)
►
9月
(1)
►
8月
(2)
►
7月
(4)
►
6月
(2)
►
5月
(3)
►
4月
(2)
►
3月
(2)
►
2月
(3)
►
1月
(1)
▼
2022
(106)
►
12月
(5)
►
11月
(1)
►
10月
(3)
►
9月
(6)
►
8月
(7)
►
7月
(6)
►
6月
(13)
►
5月
(9)
▼
4月
(15)
[Docker] Swarm を WebUI で管理できる Swarmpit を動かしてみる
[Docker] Image, Container, Node, Service, Stack などの概念
Ubuntu のファイルシステムを overlayroot で読み込み専用にする
[Docker] Swarm モードのローリングアップデートを試してみた
[Docker] Swarm モードに入門してみた
[Docker] Swarm モードの停止
Portainer を docker-compose で動かす
[Docker] Swarm モードで動作中のサービスについて調べる
Ubuntu に GitLab-Runner を直接インストールする
TortoiseGit で過去のコミットの作者(コミッター)を修正する
git で clone する場合に 503 エラーが表示される
[PySide] ARM アーキテクチャ環境に PySide をインストールできない?
Ubuntu に SSD をマウント
Docker イメージの保存先を変更
GitLab の root の初期パスワードを調べる
►
3月
(11)
►
2月
(14)
►
1月
(16)
►
2021
(85)
►
12月
(11)
►
11月
(6)
►
10月
(4)
►
9月
(10)
►
8月
(8)
►
7月
(4)
►
6月
(18)
►
5月
(7)
►
4月
(8)
►
3月
(2)
►
2月
(2)
►
1月
(5)
►
2020
(56)
►
12月
(1)
►
11月
(3)
►
10月
(3)
►
9月
(3)
►
8月
(3)
►
7月
(7)
►
6月
(7)
►
5月
(2)
►
4月
(6)
►
3月
(6)
►
2月
(3)
►
1月
(12)
►
2019
(92)
►
12月
(13)
►
11月
(9)
►
10月
(3)
►
9月
(2)
►
8月
(3)
►
7月
(5)
►
6月
(11)
►
5月
(6)
►
4月
(17)
►
3月
(9)
►
2月
(6)
►
1月
(8)
►
2018
(100)
►
12月
(1)
►
11月
(11)
►
10月
(8)
►
9月
(6)
►
8月
(10)
►
7月
(10)
►
6月
(8)
►
5月
(9)
►
4月
(8)
►
3月
(14)
►
2月
(4)
►
1月
(11)
►
2017
(117)
►
12月
(14)
►
11月
(20)
►
10月
(17)
►
9月
(19)
►
8月
(10)
►
7月
(8)
►
6月
(3)
►
5月
(6)
►
4月
(5)
►
3月
(2)
►
2月
(8)
►
1月
(5)
►
2016
(91)
►
12月
(5)
►
11月
(9)
►
10月
(11)
►
9月
(9)
►
8月
(6)
►
7月
(14)
►
6月
(14)
►
5月
(11)
►
4月
(10)
►
3月
(2)
►
2015
(23)
►
12月
(4)
►
11月
(2)
►
10月
(8)
►
9月
(8)
►
7月
(1)
►
2013
(3)
►
11月
(1)
►
9月
(1)
►
7月
(1)
►
2012
(2)
►
7月
(1)
►
6月
(1)
►
2011
(1)
►
9月
(1)
►
2009
(1)
►
7月
(1)
►
2008
(2)
►
11月
(1)
►
7月
(1)
►
2007
(3)
►
10月
(3)