Docker Swarm入門教程

迄今為止,Docker Swarm問世已有一年的時間。Docker Swarm的首次隆重亮相要追溯到2014年,Docker官方在當年12月的DockerConEU峰會上正式推出了Docker Swarm。Docker Swarm不僅是一種用於管理Docker及Docker Machine的集群管理工具,同時也是一種CLI工具,可用來控制Docker主機。Docker官方意在通過Docker Swarm提供一套全面的、能夠覆蓋容器運行的各個環節的集成式解決方案,並突破自身的現有定位,實現從單純提供Docker引擎到產品多樣化的轉變。

對於Docker而言,Docker Swarm可謂是原生的集群管理工具。Swarm調用的是Docker API標準介面,我們只需通過常規的docker運行命令來啟動容器,後續的工作就不用管了,Swarm會自動選擇適合的主機來運行相關容器。也就是說,像Compose和bespoke scripts等同樣調用Docker API的管理工具可以在不經任何改動的情況下,直接通過Swarm來實現對集群的管理,不再像以前一樣只能在單一主機上部署容器。

Advertisements

如下文所示,Swarm的基礎架構非常簡單:

i. 在每台主機上都部署一個Swarm agent,並在一台主機上安裝Swarm manager(在小型集群上跑測試的時候,安裝Swarm manager的主機上也可以同時裝agent)。

ii. 所有主機上的容器都由manager來編排和調度。

iii. Swarm提供了高可用機制,比如說,我們可以通過etcd、Consul或 ZooKeeper來將現有業務轉交給備用的manager,從而實現故障轉移。

Swarm提供了若干種不同的機制來查找主機並將其加入到某個集群中,業內管這一功能叫Swarm發現服務。Swarm默認的是令牌查找模式,在這種模式下,每台主機的IP地址都以列表形式存儲在Docker Hub上。

Advertisements

下面我們進入實戰環節,作為一個入門教程,我們先從Docker Swarm的部署講起。筆者只花了幾分鐘時間,就在自己的谷歌雲引擎上創建了4個集群節點,其中包括一個Swarm Master節點,兩個Agent節點和一個Swarm Manager節點,後者用於管理整個集群。運行環境如下:

創建Swarm Master節點:

首先我們要在Docker Swarm集群的節點上安裝Docker 1.9.1,可參照下文的命令行將所有主機上的Docker升級到最新版本:

wget -qO- https://get.docker.com/ | sh

[注意這裡是大寫字母O,不是數字0]

Processing triggers for systemd (225-1ubuntu9) …

Processing triggers for man-db (2.7.4-1) …

Setting up docker-engine (1.9.1-0~wily) …

Installing new version of config file /etc/bash_completion.d/docker …

Installing new version of config file /etc/init.d/docker …

Installing new version of config file /etc/init/docker.conf …

Processing triggers for ureadahead (0.100.0-19) …

Processing triggers for systemd (225-1ubuntu9) …

+ sh -c docker version

Client:

Version: 1.9.1

API version: 1.21

Go version: go1.4.2

Git commit: a34a1d5

Built: Fri Nov 20 13:20:08 UTC 2015

OS/Arch: linux/amd64

Server:

Version: 1.9.1

API version: 1.21

Go version: go1.4.2

Git commit: a34a1d5

Built: Fri Nov 20 13:20:08 UTC 2015

OS/Arch: linux/amd64

如果要以非root用戶的角色使用Docker,則需用以下命令行將用戶添加到「docker」用戶組:

sudo usermod -aG docker [要添加的用戶]

注意,執行該命令行之後,要退出重新登錄才能生效。

啟動Docker Daemon

root@dockerhost-1 ~]# docker -H tcp://0.0.0.0:2375 -d &

[1] 11516

[root@dockerhost-1 ~]# Warning: 『-d』 is deprecated, it will be removed soon. See usage.

WARN[0000] please use 『docker daemon』 instead.

WARN[0000] /!\ DON』T BIND ON ANY IP ADDRESS WITHOUT setting -tlsverify IF YOU DON』T KNOW WHAT YOU』RE DOING /!\

INFO[0000] Listening for HTTP on tcp (0.0.0.0:2375)

ERRO[0000] WARNING: No –storage-opt dm.thinpooldev specified, using loopback; this configuration is strongly discouraged for production use

INFO[0000] [graphdriver] using prior storage driver 「devicemapper」

INFO[0000] Option DefaultDriver: bridge

INFO[0000] Option DefaultNetwork: bridge

WARN[0000] Running modprobe bridge nf_nat br_netfilter failed with message: modprobe: WARNING: Module br_netfilter not found.

, error: exit status 1

INFO[0000] Firewalld running: true

INFO[0000] Loading containers: start.

INFO[0000] Loading containers: done.

INFO[0000] Daemon has completed initialization

INFO[0000] Docker daemon commit=a01dc02/1.8.2 execdriver=native-0.2 graphdriver=dev

icemapper version=1.8.2-el7.centos

[root@dockerhost-1 ~]#

安裝Docker Swarm:

root@docker-1:~# docker run –rm swarm create

7733f838d176809cb2f2d24eb34ce78c

上面的命令行會創建一個token ID,整個Docker Swarm集群的配置都是圍繞這個ID進行的。

安裝Swarm Agent Node 1:[10.240.0.3]

首先要確定Agent節點1上已經安裝了1.9.x版本的Docker。另外說一句,在Agent節點上啟動Docker daemon的步驟跟在master節點上的啟動步驟是一樣的:

docker run -d swarm join –addr=10.240.0.3:2375 token://7733f838d176809cb2f2d24eb34ce78c

560e58a76ef235c8d74fffb2c680149111b8bbe687f1e0e164cd7c05dad59f33

安裝Swarm Manager Node:[10.240.0.5]

root@docker-3:~# docker run -d -p 7000:2375 swarm manage token://7733f838d176809cb2f2d24eb34ce78c

b26a2bbb336e26e0cd6ac5d61b90d7a9d9f74a2d072f573b6890bd9b0f6e470f

注意此處的7000是swarm manager的埠號,大家可以設置自己的埠號。

下面可以看到swarm集群的詳細信息:

root@docker-3:~# docker -H tcp://10.240.0.5:7000 info

Containers: 0

Images: 2

Storage Driver:

Role: primary

Strategy: spread

Filters: health, port, dependency, affinity, constraint

Nodes: 1

docker-1: 10.240.0.2:2375

+ Status: Healthy

+ Containers: 0

+ Reserved CPUs: 0 / 1

+ Reserved Memory: 0 B / 3.794 GiB

+ Labels: executiondriver=native-0.2, kernelversion=4.2.0-18-generic, operatingsystem=Ubuntu 15.10, storagedriver

=devicemapper

Execution Driver:

Kernel Version:

Operating System:

CPUs: 1

Total Memory: 3.794 GiB

Name: b26a2bbb336e

ID:

Http Proxy:

Https Proxy:

No Proxy:

因為我們上面只添加了一個集群節點,所以這裡顯示的swarm集群中只有節點1。

安裝Swarm Agent Node 2 :[10.240.0.4]

root@docker-2:~# docker run -d swarm join –addr=10.240.0.4:2375 token://7733f838d176809cb2f2d24eb34ce78c

fe5b81d57f6394db655d15ce097f8ca537d6c74c2de6a477ac38544a7db0a5d8

root@docker-2:~#

安裝完畢,在Swarm Manager節點上運行下面的命令行即可查看swarm集群中的所有節點:

docker run –rm swarm list token://7733f838d176809cb2f2d24eb34ce78c

10.240.0.4:2375

10.240.0.2:2375

OK!大功告成!多節點Swarm集群創建完畢!

下面我們來創建一個容器,並通過Swarm Manager來運行該容器:

sudo docker -H tcp://10.0.1.61:5001 run -dt –name swarm-test nginx /bin/sh

root@docker-1:~# docker images

INFO[0999] GET /v1.18/images/json

INFO[0999] +job images()

INFO[0999] -job images() = OK (0)

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE

nginx latest 813e3731b203 4 days ago 133.8 MB

centos latest 14dab3d40372 5 days ago 194.7 MB

swarm latest e9ff33e7e5b9 11 days ago 17.15 MB

ajeetraina/dell-syscfg v1.0 d121b6e6dba4 12 weeks ago 1.449 GB

tduzan/docker-omsa latest ffcbdafb4aa6 16 months ago 806.4 MB

root@docker-1:~#

下面的命令行可以查看各個swarm agent主機上運行的容器:

root@docker-3:~# docker -H tcp://10.240.0.5:7100 ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS

NAMES

d0ee6dad4b39 nginx:latest 「/bin/sh」 58 minutes ago Up 58 minutes 80/tcp,

443/tcp docker-1/swarm-test

cd9bc8c96e45 ajeetraina/dell-syscfg:v1.0 「/bin/bash」 About an hour ago Up About an hour

docker-1/jolly_curie

d0bcc8da090e bad926a6fb50:latest 「/bin/bash」 About an hour ago Up About an hour

docker-2/hopeful_tesla

root@docker-3:~#

綜上所述,用戶只需通過Swarm Manager節點便可創建容器,而且操作非常簡便。我們不用去管容器要運行在哪個節點上,Swarm集群具有高度智能化的特點,可自動分配適當的資源以供容器運行。

通過以上教程,大家可以對Docker Swarm的安裝使用有個初步的印象,希望本篇教程能夠幫助到大家。最後祝大家都能體驗到Swarm帶來的便捷和高效!

安裝Swarm Agent Node 1:[10.240.0.3]

首先要確定Agent節點1上已經安裝了1.9.x版本的Docker。另外說一句,在Agent節點上啟動Docker daemon的步驟跟在master節點上的啟動步驟是一樣的:

docker run -d swarm join –addr=10.240.0.3:2375 token://7733f838d176809cb2f2d24eb34ce78c

560e58a76ef235c8d74fffb2c680149111b8bbe687f1e0e164cd7c05dad59f33

安裝Swarm Manager Node:[10.240.0.5]

root@docker-3:~# docker run -d -p 7000:2375 swarm manage token://7733f838d176809cb2f2d24eb34ce78c

b26a2bbb336e26e0cd6ac5d61b90d7a9d9f74a2d072f573b6890bd9b0f6e470f

注意此處的7000是swarm manager的埠號,大家可以設置自己的埠號。

下面可以看到swarm集群的詳細信息:

root@docker-3:~# docker -H tcp://10.240.0.5:7000 info

Containers: 0

Images: 2

Storage Driver:

Role: primary

Strategy: spread

Filters: health, port, dependency, affinity, constraint

Nodes: 1

docker-1: 10.240.0.2:2375

+ Status: Healthy

+ Containers: 0

+ Reserved CPUs: 0 / 1

+ Reserved Memory: 0 B / 3.794 GiB

+ Labels: executiondriver=native-0.2, kernelversion=4.2.0-18-generic, operatingsystem=Ubuntu 15.10, storagedriver

=devicemapper

Execution Driver:

Kernel Version:

Operating System:

CPUs: 1

Total Memory: 3.794 GiB

Name: b26a2bbb336e

ID:

Http Proxy:

Https Proxy:

No Proxy:

因為我們上面只添加了一個集群節點,所以這裡顯示的swarm集群中只有節點1。

安裝Swarm Agent Node 2 :[10.240.0.4]

root@docker-2:~# docker run -d swarm join –addr=10.240.0.4:2375 token://7733f838d176809cb2f2d24eb34ce78c

fe5b81d57f6394db655d15ce097f8ca537d6c74c2de6a477ac38544a7db0a5d8

root@docker-2:~#

安裝完畢,在Swarm Manager節點上運行下面的命令行即可查看swarm集群中的所有節點:

docker run –rm swarm list token://7733f838d176809cb2f2d24eb34ce78c

10.240.0.4:2375

10.240.0.2:2375

OK!大功告成!多節點Swarm集群創建完畢!

下面我們來創建一個容器,並通過Swarm Manager來運行該容器:

sudo docker -H tcp://10.0.1.61:5001 run -dt –name swarm-test nginx /bin/sh

root@docker-1:~# docker images

INFO[0999] GET /v1.18/images/json

INFO[0999] +job images()

INFO[0999] -job images() = OK (0)

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE

nginx latest 813e3731b203 4 days ago 133.8 MB

centos latest 14dab3d40372 5 days ago 194.7 MB

swarm latest e9ff33e7e5b9 11 days ago 17.15 MB

ajeetraina/dell-syscfg v1.0 d121b6e6dba4 12 weeks ago 1.449 GB

tduzan/docker-omsa latest ffcbdafb4aa6 16 months ago 806.4 MB

root@docker-1:~#

下面的命令行可以查看各個swarm agent主機上運行的容器:

root@docker-3:~# docker -H tcp://10.240.0.5:7100 ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS

NAMES

d0ee6dad4b39 nginx:latest 「/bin/sh」 58 minutes ago Up 58 minutes 80/tcp,

443/tcp docker-1/swarm-test

cd9bc8c96e45 ajeetraina/dell-syscfg:v1.0 「/bin/bash」 About an hour ago Up About an hour

docker-1/jolly_curie

d0bcc8da090e bad926a6fb50:latest 「/bin/bash」 About an hour ago Up About an hour

docker-2/hopeful_tesla

root@docker-3:~#

綜上所述,用戶只需通過Swarm Manager節點便可創建容器,而且操作非常簡便。我們不用去管容器要運行在哪個節點上,Swarm集群具有高度智能化的特點,可自動分配適當的資源以供容器運行。

通過以上教程,大家可以對Docker Swarm的安裝使用有個初步的印象,希望本篇教程能夠幫助到大家。最後祝大家都能體驗到Swarm帶來的便捷和高效!

作者:張言,精靈雲產品總監,虛擬化領域專家,曾任IBM和VMWare資深產品經理,對IaaS/PaaS產品有豐富的經驗,實際參與國內多家IDC中心PaaS平台搭建工作。想獲得免費容器?網址:https://www.ghostcloud.cn

Advertisements

你可能會喜歡