“Docker容器编排”的版本间的差异

来自CloudWiki
跳转至: 导航搜索
第15行: 第15行:
  
  
  Dockcr容器编排的使用
+
== Dockcr容器编排的使用 ==
 +
 
  
 
部署Swarm集群
 
部署Swarm集群
  
  1.配置主机映射
+
  '''1.配置主机映射
 
+
'''
 
  [rootamaster~]#cat lete:hosts
 
  [rootamaster~]#cat lete:hosts
 
  10.18.4.39 master
 
  10.18.4.39 master
 
  10.18.4.46 client
 
  10.18.4.46 client
  
  2.配置时间同步
+
  '''2.配置时间同'''步
  
 
  所有节点安装chrony 服务
 
  所有节点安装chrony 服务
第52行: 第53行:
 
  所有节点执行chronyc sources命令,查询结果中如果存在以“^*”开头的行,即说明己经同步成功。
 
  所有节点执行chronyc sources命令,查询结果中如果存在以“^*”开头的行,即说明己经同步成功。
  
3.配置Docker API
+
'''3.配置Docker API'''
  
 
所有节点开启Docker API。
 
所有节点开启Docker API。
第69行: 第70行:
 
  ./image.sh
 
  ./image.sh
  
4.初始化集群
+
'''4.初始化集群'''
  
 
  在Master节点创建Swarm集群。
 
  在Master节点创建Swarm集群。
第78行: 第79行:
 
3添加manager node需要执行的命令。
 
3添加manager node需要执行的命令。
  
5 Node节点加入集群
+
'''5 Node节点加入集群'''
  
 
  复制前面的docker swarm join命令,在Node节点执行以加入 Swarm集群。
 
  复制前面的docker swarm join命令,在Node节点执行以加入 Swarm集群。
第87行: 第88行:
 
  [root@master~]# docker swarm join-token worker
 
  [root@master~]# docker swarm join-token worker
  
6验证集群
+
'''6验证集群'''
  
 
  登录Master节点,查看各节点状态。
 
  登录Master节点,查看各节点状态。
 
  [root@master~]# docker node Is
 
  [root@master~]# docker node Is
  
7安装Portainer
+
'''7安装Portainer'''
  
 
​ Portainer是Docker 的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传和下载镜像、创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型企业对容器管理的全部需求。
 
​ Portainer是Docker 的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传和下载镜像、创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型企业对容器管理的全部需求。
第100行: 第101行:
 
  [root@swarm ~]#docker service create --name portainer  --publish 9000:9000 --replicas=1 --constraint 'node.role == manager' --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock --mount type=volume,src=portainer_data,dst=/data portainer/portainer -H unix://var/run/docker.sock
 
  [root@swarm ~]#docker service create --name portainer  --publish 9000:9000 --replicas=1 --constraint 'node.role == manager' --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock --mount type=volume,src=portainer_data,dst=/data portainer/portainer -H unix://var/run/docker.sock
  
8登录Portainer
+
'''8登录Portainer'''
  
 
  打开浏览器,输入地址http://master_IP:9000访问Portainer主页,
 
  打开浏览器,输入地址http://master_IP:9000访问Portainer主页,
第106行: 第107行:
 
![image-20201008150335761](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201008150335761.png)
 
![image-20201008150335761](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201008150335761.png)
  
  运行Service
+
   
 +
== 运行Service ==
 +
 
  
1运行Service
+
'''1运行Service'''
  
 
  现在已经创建好了Swarm集群,执行如下命令部署一个运行httpd镜像的Service。
 
  现在已经创建好了Swarm集群,执行如下命令部署一个运行httpd镜像的Service。
第122行: 第125行:
 
![image-20201008152756750](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201008152756750.png)
 
![image-20201008152756750](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201008152756750.png)
  
2 Service伸缩
+
'''2 Service伸缩'''
  
 
刚刚仅部署了只有一个副本的Service,不过对于Web服务,通常会运行多个实例。这样可以负载均衡,同时也能提供高可用。
 
刚刚仅部署了只有一个副本的Service,不过对于Web服务,通常会运行多个实例。这样可以负载均衡,同时也能提供高可用。
第136行: 第139行:
 
  [root@master ~]# docker service scale web_server=2
 
  [root@master ~]# docker service scale web_server=2
  
3访问Service
+
'''3访问Service'''
  
 
​ 要访问http服务,首先得保证网络通畅,其次需要知道服务的IP。查看容器的网络配置。
 
​ 要访问http服务,首先得保证网络通畅,其次需要知道服务的IP。查看容器的网络配置。
第146行: 第149行:
 
  --publish-add 8080:80将容器的80映射到主机的8080端口,这样外部网络就能访问到Service了。通过http://任意节点IP:8080即可访问Service
 
  --publish-add 8080:80将容器的80映射到主机的8080端口,这样外部网络就能访问到Service了。通过http://任意节点IP:8080即可访问Service
  
4 Service存储数据
+
'''4 Service存储数据'''
  
 
​ Service的容器副本可能会伸缩,甚至失败,会在不同的主机上创建和销毁,这就引出一个问题,如果Service有需要管理的数据,那么这些数据应该如何存放呢?如果把数据打包在容器里,这显然不行,除非数据不会发生变化,否则,如何在多个副本之间保持同步呢?volume是将宿主级的目录映射到容器中,以实现数据持久化。可以用两种方式来实现:
 
​ Service的容器副本可能会伸缩,甚至失败,会在不同的主机上创建和销毁,这就引出一个问题,如果Service有需要管理的数据,那么这些数据应该如何存放呢?如果把数据打包在容器里,这显然不行,除非数据不会发生变化,否则,如何在多个副本之间保持同步呢?volume是将宿主级的目录映射到容器中,以实现数据持久化。可以用两种方式来实现:
第224行: 第227行:
 
  [root@master~]# docker exec -it albce967830e bash
 
  [root@master~]# docker exec -it albce967830e bash
  
5调度节点
+
'''5调度节点'''
  
 
默认配置下Master也是worker node,所以Master上也运行了副本。如果不希望在Master上运行Service,可以执行如下命令。
 
默认配置下Master也是worker node,所以Master上也运行了副本。如果不希望在Master上运行Service,可以执行如下命令。

2020年10月12日 (一) 05:41的版本

概述

容器编排是指自动化容器的部署、管理、扩展和联网。容器编排可以为需要部署和管理成百上千个容器和主机的企业提供便利 容器编排可以在使用容器的任何环境中使用。它可以帮助您在不同环境中部署相同的应用,而无需重新设计。通过将微服务放入容器,就能更加轻松地编排各种服务(包括存储、网络和安全防护)。

编排工具

Docker-Compose

Docker-Compose 是用来管理你的容器的,有点像一个容器的管家,想象一下当你的Docker中有成百上千的容器需要启动,如果一个一个的启动那得多费时间。有了Docker-Compose你只需要编写一个文件,在这个文件里面声明好要启动的容器,配置一些参数,执行一下这个文件,Docker就会按照你声明的配置去把所有的容器启动起来,但是Docker-Compose只能管理当前主机上的Docker,也就是说不能去启动其他主机上的Docker容器

Docker Swarm

Docker Swarm则是由Docker 公司自行研发的一款用来管理多主机上的Docker容器的工具,可以负责帮你启动容器,监控容器状态,如果容器的状态不正常它会帮你重新帮你启动一个新的容器,来提供服务,同时也提供服务之间的负载均衡,而这些东西Docker-Compose 是做不到的。Swarm现在与Docker Engine完全集成,并使用标准API和网络。Swarm模式内置于Docker CLI中,无需额外安装,并且易于获取新的Swarm命令。

Kubernetes

Kubernetes它本身的角色定位是和Docker Swarm 是一样的,也就是说他们负责的工作在容器领域来说是相同的部分,当然也有自己一些不一样的特点。这个就像是Eclipse和IDEA一样,也是一个跨主机的容器管理平台。Kubernetes正在成为容器编排领域的领导者,由于其可配置性,可靠性和大型社区的支持,从而超越了Docker Swarm。Kubernetes由Google创建,作为一个开源项目,与整个Google云平台协调工作。此外,它几乎适用于任何基础设施。



Dockcr容器编排的使用

部署Swarm集群

1.配置主机映射

[rootamaster~]#cat lete:hosts
10.18.4.39 master
10.18.4.46 client
2.配置时间同
所有节点安装chrony 服务
yum install -y chrony
Master节点修改/etc/chrony.conf文件,注释默认NTP服务器,指定上游公共NTP服务器,并允许其他节点同步时间。
[root@master ~]# sed -i 's/^server/#&/'/etc/chrony.conf
[root@master~]# cat >>/etc/chrony.conf<<EOF
local stratum 10
server master iburst
allow all
EOF
Master节点重启chronyd服务并设为开机启动,开启网络时间同步功能。
[root@master~]# systemctl enable chronyd && systemctl restart chronyd
[root@master~]# timedatectl set-ntp true
Node节点修改letc/chrony.conf文件,指定内网Master节点为上游NTP服务器,重启服务并设为开机启动。
[root@node~]# sed -i 's/^server/&/'l/etc/chrony.conf
[root@node ~]# echo server 10.18.4.33 iburst >>/etc/chrony.conf//IP为master节点地址
[root@node~]# systemctl enable chronyd && systemctl restart chronyd
所有节点执行chronyc sources命令,查询结果中如果存在以“^*”开头的行,即说明己经同步成功。

3.配置Docker API

所有节点开启Docker API。

vi /lib/systemd/system/docker.service
将
 ExecStart=/usr/bin/dockerd -H fd://--containerd=/run/containerd/containerd.sock
修改为
ExecStart=/usr/bin/dockerd  -H tcp://0.0.0.0:2375-H unix:///var/run/docker.sock

systemctl daemon-reload

systemctl restart docker

./image.sh

4.初始化集群

在Master节点创建Swarm集群。
[root@master ~]# docker swarm init --advertise-addr 10.18.4.39初始化命令中“--advertise-addr”选项表示管理节点公布它的IP是多少。其它节点必须能通过这个IP找到管理节点。
输出结果中包含3个步骤:

1Swarm创建成功,swarm-manager成为manager node。 2添加worker node需要执行的命令。 3添加manager node需要执行的命令。

5 Node节点加入集群

复制前面的docker swarm join命令,在Node节点执行以加入 Swarm集群。

[ root@node~]# docker swarm join --tokenSWMTKN-1-2oyrpgkp41z40zg0z6l0yppv6420vz18rr171kqvOmfsbiufii-c3ficc1qh782wo567uavl6n3n 10.18.4.39:2377

	This node joined a swarm as a worker.
查找指令集
[root@master~]# docker swarm join-token worker

6验证集群

登录Master节点,查看各节点状态。
[root@master~]# docker node Is

7安装Portainer

​ Portainer是Docker 的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传和下载镜像、创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型企业对容器管理的全部需求。 登录Master节点,安装Portainer。

[root@swarm~]# docker volume create portainer_data
[root@swarm ~]#docker service create --name portainer  --publish 9000:9000 --replicas=1 --constraint 'node.role == manager' --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock --mount type=volume,src=portainer_data,dst=/data portainer/portainer -H unix://var/run/docker.sock

8登录Portainer

打开浏览器,输入地址http://master_IP:9000访问Portainer主页,

![image-20201008150335761](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201008150335761.png)


运行Service

1运行Service

现在已经创建好了Swarm集群,执行如下命令部署一个运行httpd镜像的Service。
[root@master~]# docker service create --name web_server httpd
部署Service的命令形式与运行容器的docker run很相似,--name为Service命名,httpd为镜像的名字。
通过docker service ls命令可以查看当前Swarm中的Service。
[root@master~]# docker service ls

​ REPLICAS显示当前副本信息,1/1意思是web_server这个Service期望的容器副本数量为1,目前已经启动的副本数量为1,即当前ervice已经部署完成。命令docker service ps可以查看Service每个副本的状态。

[root@master ~]# docker service ps web_server

![image-20201008152756750](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201008152756750.png)

2 Service伸缩

刚刚仅部署了只有一个副本的Service,不过对于Web服务,通常会运行多个实例。这样可以负载均衡,同时也能提供高可用。 Swarm要实现这个目标非常简单,增加Service的副本数就可以了。在 Master节点上执行如下命令。

[root@master~]# docker service scale web_server=5
副本数增加到5,通过docker service ls和docker service ps命令查看副本的详细信息。
[root@master~]# docker service ls
[root@master~]# docker service ps web_server

既然可以通过scale up扩容服务,当然也可以通过scale down减少副本数,运行下面的命令。

[root@master ~]# docker service scale web_server=2

3访问Service

​ 要访问http服务,首先得保证网络通畅,其次需要知道服务的IP。查看容器的网络配置。

[root@master~]# docker ps

​ 在Master上运行了一个容器,是web_server 的一个副本,容器监听了80端口,但并没有映射到Docker Host,所以只能通过容器的正访问。但是服务并没有暴露给外部网络,只能在Docker主机上访问,外部无法访问。要将Service暴露到外部,方法其实很简单,执行下面的命令即可。

[root@master ~]# docker service update --publish-add 8080:80 web_server
--publish-add 8080:80将容器的80映射到主机的8080端口,这样外部网络就能访问到Service了。通过http://任意节点IP:8080即可访问Service

4 Service存储数据

​ Service的容器副本可能会伸缩,甚至失败,会在不同的主机上创建和销毁,这就引出一个问题,如果Service有需要管理的数据,那么这些数据应该如何存放呢?如果把数据打包在容器里,这显然不行,除非数据不会发生变化,否则,如何在多个副本之间保持同步呢?volume是将宿主级的目录映射到容器中,以实现数据持久化。可以用两种方式来实现:

```

volume默认模式:工作节点宿主机数据同步到容器内。
volume NFS共享存储模式:管理节点宿主同步到工作节点宿主,工作节点宿主同步到容器。

```

登录Master节点,安装NFS服务端、配置NFS主配置文件、添加权限并启动。

```
[root@master~]# yum install nfs-utils -y
```
[root@master ~]# yum install nfs-utils -y
添加目录让相应网段可以访问并添加读写权限。
[root@master~]# vi /etc/exports
/root/share 192.168.200.110(rw,async,insecure,anonuid=1000,anongid=1000,no_root_squash)
创建共享目录,添加权限。
[root@master~]# mkdir -p /root/share
[root@master~]# chmod 777 /root/share
/root/share为共享目录,生效配置。
[root@master~]# exportfs -rv
exporting 10.18.4.39/24:/root/share
开启RPC服务并设置开机自启。
[root@master~]# systemctl start rpcbind
[root@master ~]# systemctl enable rpcbind
启动NFS服务并设置开机自启。
[root@master~]# systemctl start nfs
[root@master ~]# systemctl enable nfs
查看NFS是否挂载成功。

```

[root@master~]# cat /var/lib/nfs/etab
/root/share
10.18.4.39/24(rw,async,wdelay,hide,nocrossmnt,insecure,no_root_squash,no_al_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=1000,anongid=1000,sec=sys,rw,insecure,no_root_squash,no_all_squash)

```

登录Node节点,安装NFS客户端并启动服务。

[root@node~]# yum install nfs-utils -y
[root@node~] systemctl start rpcbind
[root@node~]# systemctl enable rpcbind
[root@node~]# systemctl start nfs
[root@node~]# systemctl enable nfs
部署的服务可能分不到各个节点上,在所有节点创建docker volume。
[root@master~]# docker volume create --driver local --opt type=nfs --opt o=addr=10.18.4.39,rw  --opt device=:/root/share foo33 --opt device=:/root/share用于指向共享目录,也可以是共享目录下的子目录。查看volume。

docker volume ls

可以查看到docker volume列表中有foo33,查看volume详细信息。

[root@node~]# docker volume inspect foo33
可以看出 NFS 的/root/share被挂载到了/var/lib/docker/volumes/foo33/_data目录。

创建并发布服务。

[root@master~]# doc ker service create --name test-nginx-nfs --publish 80:80 --mount type=volume,source=foo33,destination=/app/share --replicas 3 nginx

查看服务分布的节点。

[root@master~]# docker service ps test-nginx-nfs

在Master节点/root/share目录中生成一个index.html文件。

[root@master~]#cd /root/share/
[root@master share]# touch index.html
[root@master share]# 1l

查看宿主机目录挂载情况。

[root@master share ]# docker volume inspect foo33
[root@master share]# ls /var/lib/docker/volumes/foo33/_data

查看容器目录。

[root@master~]# docker ps

[root@master~]# docker exec -it albce967830e bash

5调度节点

默认配置下Master也是worker node,所以Master上也运行了副本。如果不希望在Master上运行Service,可以执行如下命令。

[root@master~]# docker node update --availability drain master

通过docker node ls命令查看各节点现在的状态。

[root@master~]# docker node ls

Drain表示Master已经不负责运行Service,之前Master运行的那1个副本会如何处理呢?使用docker service ps命令来查看。例

[root@master~]# docker service ps test-nginx-nfs