迄今为止,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来实现对集群的管理,不再像以前一样只能在单一主机上部署容器。
如下文所示,Swarm的基础架构非常简单:
i. 在每台主机上都部署一个Swarm agent,并在一台主机上安装Swarm manager(在小型集群上跑测试的时候,安装Swarm manager的主机上也可以同时装agent)。
ii. 所有主机上的容器都由manager来编排和调度。
iii. Swarm提供了高可用机制,比如说,我们可以通过etcd、Consul或ZooKeeper来将现有业务转交给备用的manager,从而实现故障转移。
Swarm提供了若干种不同的机制来查找主机并将其加入到某个集群中,业内管这一功能叫Swarm发现服务。Swarm默认的是令牌查找模式,在这种模式下,每台主机的IP地址都以列表形式存储在Docker Hub上。
下面我们进入实战环节,作为一个入门教程,我们先从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节点上的启动步骤是一样的:
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集群中的所有节点:
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节点上的启动步骤是一样的:
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集群中的所有节点:
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带来的便捷和高效!