欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Docker技术剖析--Swarm集群

程序员文章站 2024-03-25 13:56:16
...

 

Swarm是什么?
swarm是一个用于创建docker主机 运行docker守护进程的服务器。它是一个集群的工具
使用swarm操作集群会使用户感觉就像在一台主机上运行操作
docker1.12集成了swarmkit,使你在可以不用安装额外的软件包,使用很简单的命令启动创建docker swarm集群
如果运行docker1.12时,就可以创建一个原生的swarm集群 
swarmkit将节点分为两类:一个是工作节点(worker)主要负责通过容器运行的任务,第二个是管理节点(Manager):负责接收响应用户的请求,将集群状态调节到最终的状态。
manager组的任务提示:

 

Docker技术剖析--Swarm集群

一、部署docker1.12 Swarm
这里选择三台主机运行swarm,依次为:
node1-IP地址192.168.3.100 GATEWAY=192.168.3.1
node2-IP地址192.168.3.200 GATEWAY=192.168.3.1
node3-IP地址192.168.3.250 GATEWAY=192.168.3.1
1)三台主机的时间要一致 

2)三台都关闭selinux,开启路由转发。

3)三台主机配置IP地址修改主机名配置hosts列表

这里以node1为例,配置如下:

selinux配置

 

# cat /etc/sysconfig/selinux 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 

hosts列表配置

 

 

# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
node1:192.168.3.100
node2:192.168.3.200
node3:192.168.3.250
node1:192.168.3.100
node2:192.168.3.200
node3:192.168.3.250

开启路由转发

 

 

# cat /etc/sysctl.conf 
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
  net.ipv4.ip_forward =1net.ipv4.ip_forward =1

主机名设置

 

 

# hostname
node1

4)开启宿主机之间的端口

 

TCP端口2377  集群管理端口

TCP/UDP7946  节点通讯端口

TCP/UDP4789 overlay网络通讯端口

 

#firewall-cmd --add-port=2377/tcp
firewall-cmd --add-port=2377/udp
firewall-cmd --add-port=7946/tcp
firewall-cmd --add-port=7946/udp
firewall-cmd --add-port=4789/tcp
firewall-cmd --add-port=4789/udp

 

二、安装docker1.12(在所有节点上安装docker1.12)

 

# yum install -y docker
已加载插件:fastestmirror, langpacks
updates                                                                                                                             | 3.4 kB    
updates/7/x86_64/primary_db                                                                                                         | 2.9 MB  
Determining fastest mirrors
 * base: mirrors.btte.net
 * extras: mirrors.tuna.tsinghua.edu.cn
 * updates: mirrors.btte.net
正在解决依赖关系
--> 正在检查事务
---> 软件包 docker.x86_64.2.1.12.6-55.gitc4618fb.el7.centos 将被 安装
--> 正在处理依赖关系 docker-common = 2:1.12.6-55.gitc4618fb.el7.centos,它被软件包 2:docker-1.12.6-55.gitc4618fb.el7.centos.x86_64 需要

 

安装完成后启动docker 查看docker版本

 

# systemctl start docker
[aaa@qq.com ~]# docker -v
Docker version 1.12.6, build c4618fb/1.12.6

 

创建swarm集群

 

在node1上初始化swarm集群:
你只需要在一个node1上初始化swarm集群,其他node加入这个集群就可以了,所以下面命令只需要在node1上运行。

 

# docker swarm init --advertise-addr 192.168.3.100
Swarm initialized: current node (9kjx0n04qnobx9xa35u66hnvn) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-5yrr03p6s78xlfac1l5chbfi7j2wsy7iuwjjvwmtdanyvhbvoz-6x3ruv19nlm6yxsumtz9t0l0b \
    192.168.3.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.docker swarm join \
    --token SWMTKN-1-5yrr03p6s78xlfac1l5chbfi7j2wsy7iuwjjvwmtdanyvhbvoz-6x3ruv19nlm6yxsumtz9t0l0b \
    192.168.3.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

根据如上的命令提示: 我们的其他节点服务器以worker角色加入swarm集群要登录到服务器运行以下命令
Docker技术剖析--Swarm集群
Docker技术剖析--Swarm集群

 

在node1上查看端口监听情况

Docker技术剖析--Swarm集群

查看swarm集群node列表

 

# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
1uz0on6ywiqb6mce1kv5lfi55    node2     Ready   Active        
7twa8trhgxyka65i4f4wdmgob    node3     Ready   Active        
9kjx0n04qnobx9xa35u66hnvn *  node1     Ready   Active        LeaderID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
1uz0on6ywiqb6mce1kv5lfi55    node2     Ready   Active        
7twa8trhgxyka65i4f4wdmgob    node3     Ready   Active        
9kjx0n04qnobx9xa35u66hnvn *  node1     Ready   Active        Leader

我们可以看到其他服务器已经加入swarm集群里了,
不过现在集群只有一个manager节点node1为了swarm集群的高可用,避免单点故障我们在建立一个manager节点。例如我们把node2提升为manager节点:

 

Docker技术剖析--Swarm集群
我们可以看到node2已经提升为manager节点。

有了docker swarm集群我们把应用跑在swarm集群上。基本上原来我们都是使用docker run 的命令创建容器,把前面替换成docker service create就行了。
我们可以搭建一个私有仓库,由私有仓库提供所需要的镜像

 

#docker pull registry:2
# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
registry            2                   c6c14b3960bd        14 months ago       33.28 MB

registry1使用python语言写的,而现在的registry2版本是docker distribution更加安全和快速,是GO语言写的。
在默认的情况下,registry2会将仓库存放于容器/var/lib/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所有我们一般情况下,会指定本地目录挂载到容器的/var/lib/registry下,两个目录都有
registry的默认存储路径是/var/lib/registry,只是一个临时的目录,一段时间之后就会消失,所以我们使用-v的参数,指定本地持久的路径就好了

 

 

# mkdir -p /opt/data/registry
[aaa@qq.com ~]# docker run -d -p 5000:5000 --restart=always -v /opt/data/registry/:/var/lib/registry --name registry2 registry:2           
67b474bcccadc013ef82f66c7d70db15c222ebd48e174c0dc79897a7ba622e22
[aaa@qq.com ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
67b474bcccad        registry:2          "/entrypoint.sh /etc/"   6 seconds ago       Up 2 seconds        0.0.0.0:5000->5000/tcp   registry2

我们可以看到它默认是5000端口所以我们开启宿主机的5000端口

 

 

# firewall-cmd --add-port=5000/tcp
success
[aaa@qq.com ~]# firewall-cmd --add-port=5000/udp
success
# curl 192.168.3.100:5000/v2/_catalog
{"repositories":[]}{"repositories":[]}

出现了# {"repositories":[]}是对的,因为目前我们没有上传镜像所有它显示[]

接下来我们将所有主机指向registry服务器 如下:

 

 

# vim /usr/lib/systemd/system/docker.service 

Docker技术剖析--Swarm集群
添加进入之后我们重载配置,并重启docker服务

 

 

# systemctl daemon-reload 
[aaa@qq.com ~]# systemctl restart docker

接下来我们上传镜像,但是现在我们没有镜像,我们可以用dockerfile来写一个http服务的镜像。回顾知识~

 

 

# mkdir -p /docker/apache
[aaa@qq.com ~]# cd /docker/apache/
[aaa@qq.com apache]# vim dockerfile
[aaa@qq.com apache]# cat dockerfile 
FROM docker.io/centos:centos6
RUN yum install -y httpd
RUN sed -i 's/#ServerName www.example.com:80/ServerName www.yankerp.com/g' /etc/httpd/conf/httpd.conf
EXPOSE 80
CMD ["/usr/sbin/httpd","-DFOREGROUND"]
[aaa@qq.com apache]# docker build -t centos:httpd .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM docker.io/centos:centos6
 ---> cf2c3ece5e41
Step 2 : RUN yum install -y httpd
 ---> Running in a50e74be31a6

运行结束之后我们查看镜像

 

 

# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              httpd               25dd81d51fe1        27 seconds ago      301.9 MB
registry            2                   c6c14b3960bd        14 months ago       33.28 MB
docker.io/centos    centos6             cf2c3ece5e41        15 months ago       194.6 MBcentos              httpd               25dd81d51fe1        27 seconds ago      301.9 MB
registry            2                   c6c14b3960bd        14 months ago       33.28 MB
docker.io/centos    centos6             cf2c3ece5e41        15 months ago       194.6 MB

我们把http镜像推送到本地registry,首先tag一个标签 如下:

 

 

# docker tag centos:httpd 192.168.3.100:5000/centos:http
[aaa@qq.com ~]# docker images 
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
centos                      httpd               25dd81d51fe1        3 minutes ago       301.9 MB
192.168.3.100:5000/centos   http                25dd81d51fe1        3 minutes ago       301.9 MB
registry                    2                   c6c14b3960bd        14 months ago       33.28 MB
docker.io/centos            centos6             cf2c3ece5e41        15 months ago       194.6 MB192.168.3.100:5000/centos   http                25dd81d51fe1        3 minutes ago       301.9 MB
registry                    2                   c6c14b3960bd        14 months ago       33.28 MB
docker.io/centos            centos6             cf2c3ece5e41        15 months ago       194.6 MB

将tag后的镜像上传到registry

 

 

# docker push  192.168.3.100:5000/centos:http 
The push refers to a repository [192.168.3.100:5000/centos]
fdea3cab26e0: Pushed 
017593a8f88a: Pushing [=====>                                             ] 12.31 MB/107.3 MB
2714f4a6cdee: Pushing [====>                                              ]  15.7 MB/194.6 MB

上传完后我们查看registry中的镜像

 

 

# curl 192.168.3.100:5000/v2/_catalog
{"repositories":["centos"]}["centos"]}

此时我们看见有一个centos代表上传成功 接下来我们使用node3&&node2来下载镜像

 

 

# docker pull 192.168.3.100:5000/centos:http
Trying to pull repository 192.168.3.100:5000/centos ... 
http: Pulling from 192.168.3.100:5000/centos

b60ffe91fdc1: Pull complete 
176281937944: Extracting [==================>                                ]  15.6 MB/43.17 MB
ef18d337d5c7: Download complete 
# docker images 
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
192.168.3.100:5000/centos   http                25dd81d51fe1        7 minutes ago       301.9 MB

Docker技术剖析--Swarm集群
node3也一样 在这里我就不截图了。

 

三、overlay网络

解决了镜像构建的问题为了让应用跑在swarm集群上我们还需要解决容器间的网络访问问题

swarm上默认有一个名为dockercoins的overlay network我们在docker应用创建一个名为dockercoins的overlay network

# docker network create --driver overlay dockercoins
5g6qfpmqd8qkpgam9wqfutult
[aaa@qq.com ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
5baf5b47ae76        bridge              bridge              local               
2f711e84b258        docker_gwbridge     bridge              local               
5g6qfpmqd8qk        dockercoins         overlay             swarm               
9d127dd1a330        host                host                local               
8xug1kzgolgi        ingress             overlay             swarm               
d0af7b63e4cb        none                null                local5g6qfpmqd8qk        dockercoins         overlay             swarm               
9d127dd1a330        host                host                local               
8xug1kzgolgi        ingress             overlay             swarm               
d0af7b63e4cb        none                null                local

在网络的列表中可以看到dockercoins网络的scope是swarm,表示该网络在整个swarm集群里生效,其他一些网络是local,表示本机网络

在swarm集群上运行docker应用
下面我们可以使用之前push到本地registry的镜像启动服务, 以centos:http为例

在manager执行

 

# docker service create --replicas 1 --network dockercoins --name web2 -p 8080:80 192.168.3.100:5000/centos:http

 

在网络的列表中可以看到dockercoins网络的scope是swarm,表示该网络在整个swarm集群里生效,其他一些网络是local,表示本机网络
--name标签命名service 为web1
--replicas标签来声明1个运行实体
使用docker service ls来查看服务

# docker service ls
ID            NAME     REPLICAS  IMAGE                           COMMAND  
4l6z900mbwsf  web2     1/1       192.168.3.100:5000/centos:http 

然后我们指定了它的端口为8080 我们打开浏览器去访问测试http://IP:8080

 

Docker技术剖析--Swarm集群
如果运行多个 可以用--replicas标签来声明 如:

 

# docker service  create --replicas 2 --network dockercoins --name Apache3  -p 520:80 192.168.3.100:5000/centos:http--replicas 2 --network dockercoins --name Apache3  -p 520:80 192.168.3.100:5000/centos:http
# docker service ls
ID            NAME     REPLICAS  IMAGE                           COMMAND  
4l6z900mbwsf  web2     1/1       192.168.3.100:5000/centos:http 
4144zk4hp98k  Apache3  2/2       192.168.3.100:5000/centos:http 
4144zk4hp98k  Apache3  2/2       192.168.3.100:5000/centos:http 

最后测试访问

 

Docker技术剖析--Swarm集群

希望对您有所帮助,再见~