网站设计文献,互联网做网站属于什么行业,精品网站建设费用 要上磐石网络,兰州网站制作公司哪个好文章目录 一、问题引入1. 多容器位于同一主机2. 多容器位于不同主机 二、介绍三、特性四、概念1. 节点nodes2. 服务(service)和任务(task)3. 负载均衡 五、docker网络1. overlay网络 六、docker集群搭建1. 环境介绍2. 创建集群3. 集群网络4. 加入工作节点 七、部署可视化界面po… 文章目录 一、问题引入1. 多容器位于同一主机2. 多容器位于不同主机 二、介绍三、特性四、概念1. 节点nodes2. 服务(service)和任务(task)3. 负载均衡 五、docker网络1. overlay网络 六、docker集群搭建1. 环境介绍2. 创建集群3. 集群网络4. 加入工作节点 七、部署可视化界面portainer1. 部署单机模式2. 部署集群模式 八、部署一个容器集群1. 拉取镜像2. 创建网络3. 创建服务4. 进入portainer查看busybox集群5. 不同节点间容器的通信6. 集群扩展 一、问题引入
在我们日常学习或开发过程中如果我们的服务均采用docker容器的方式运行比如提供后端接口服务的容器containerA和提供数据存取服务的容器containerB如下图所示不同的docker容器拥有各自的ip地址和端口号。 1. 多容器位于同一主机
本文假定一台主机只有一个docker进程。在这种情况下容器AcontainerA和容器BcontainerB被同一个docker进程管理容器之间的通信就可以通过目标容器ipport进行直接访问如下图所示 当容器AcontainerA需要和容器BcontainerB进行通信时只需要在容器AcontainerA中通过172.18.0.2:3306即可完成通信。这种通信方式为同主机容器到容器的通信。
这种方式有个较明显的缺点就是将容器限制在一台主机了。如果要求将容器分布在不同的主机那这个方法就行不通了。
下面来看看将容器分布在不同的主机如何操作。
2. 多容器位于不同主机
但是在企业级项目部署中往往存在多个主机协同提供服务的情况。例如我们的后端接口服务容器containerA位于主机AhostA中数据存储容器containerB位于主机BhostB中在这种情况下我们为了方便省事往往会将数据存储容器containerB的端口号(比如mysql的3306)映射到主机BhostB的3306端口当位于主机AhostA的后端接口服务容器containerA需要对数据进行操作时通过主机A的ip:port对其数据存储容器containerB进行访问。如下图所示 在该示意图中容器A要想与容器B通信需要容器B将端口映射到宿主机hostB中当连接主机B的3306端口时根据映射规则将访问请求转发到容器B中。这种通信方式为跨主机容器到主机再到容器的通信。
这种方式虽然做到了将容器分布在不同的主机但是仍暴露出一个缺点目标容器的端口不得不挂载到宿主机对应端口且目标容器宿主机的端口也不得不对外开放万一该端口被不法分子扫描到进行攻击那就GG了。
针对以上两个方式所暴露出的缺点当我们既希望将容器分布在不同的主机又希望不暴露宿主机端口而是直接通过容器的ip:port进行通信docker官方推荐我们考虑一下集群环境。
二、介绍
Swam是Docker引擎内置原生)的集群管理和编排工具。Docker Swarm是Docker官方三剑客项目之一提供 Docker容器集群服务是Docker官方对容器云生态进行支持的核心方案。使用它用户可以将多个Docker主机封装为单个大型的虚拟Docker主机快速打造一套容器云平台。Swarm mode内置kv存储功能提供了众多的新特性比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得Docker原生的 Swam集群具备与Mesos ,Kubernetes竞争的实力。 一个集群由多个Docker主机组成这些主机以集群模式运行充当管理者(管理成员资格和委托)和工作者(运行群服务)。一个给定的Docker主机可以是一个管理者manager、一个工作者worker或者同时扮演这两个角色。创建服务时您需要定义其最佳状态(副本数量、可用的网络和存储资源、服务对外开放的端口等)。Docker致力于保持这种理想状态。例如如果一个工作节点变得不可用Docker会将该节点的任务调度到其他节点上。任务是一个运行的容器它是群服务的一部分由群管理器管理而不是一个独立的容器。 与独立容器相比swarm服务的一个关键优势是您可以修改服务的配置包括它所连接的网络和卷而无需手动重启服务。Docker将更新配置停止使用过期配置的服务任务并创建与所需配置匹配的新任务。
当Docker在swarm模式下运行时您仍然可以在任何参与集群的Docker主机上运行独立的容器和swarm服务。独立容器和集群服务之间的一个关键区别是只有集群管理器可以管理集群而独立容器可以在任何守护进程上启动。Docker守护进程可以作为管理人员、工作人员或两者参与到一个群体中。
三、特性
docker集群模式swarm mode为我们提供了非常丰富的特性来满足不同的场景需求。 与Docker引擎集成的集群管理 使用Docker Engine CLI创建一组Docker引擎可以在其中部署应用程序服务。不需要额外的编排软件来创建或管理一个群体。这不就是打算和k8s杠一杠呢 去中心化设计 Docker引擎在运行时处理任何专门化而不是在部署时处理节点角色之间的差异。我们可以使用Docker引擎部署两种类型的节点管理器和工作器。这意味着我们可以从单个磁盘映像构建整个swarm。 声明式服务模型 Docker引擎使用一种声明性的方法让我们自定义应用程序堆栈中各种服务的期望状态。例如我们可能会描述一个由带有消息队列服务的web前端服务和数据库后端组成的应用程序。 动态伸缩 对于每个服务我们可以声明想要运行的任务数量。当扩大或缩小规模时swarm manager会通过添加或删除任务来自动适应以保持所需的状态。swarm manager节点持续监控集群状态并协调实际状态和期望状态之间的任何差异。例如如果我们设置一个服务来运行一个容器的10个副本并且托管其中两个副本的工作机崩溃管理器将创建两个新副本来替换崩溃的副本。群组管理器将新的副本分配给正在运行且可用的worker。 多主机网络 我们可以为服务指定叠加网络。当初始化或更新应用程序时群管理器自动分配地址给覆盖网络上的容器。 服务发现 集群管理器节点为集群中的每个服务分配一个唯一的DNS名称和负载平衡运行容器。可以通过嵌入在swarm中的DNS服务器查询swarm中运行的每一个容器。 负载均衡 可以向外部负载平衡器公开服务端口。在内部swarm允许我们指定如何在节点之间分发服务容器。 安全传输 群中的每个节点强制执行TLS相互认证和加密以确保自身和所有其他节点之间的通信安全。我们可以选择使用自签名根证书或来自自定义根CA的证书。 滚动更新 在部署时我们可以增量地将服务更新应用到节点。swarm manager允许您控制不同节点集的服务部署之间的延迟。如果出现任何问题可以回滚到服务的前一个版本。
四、概念
在搭建docker集群之前我们需要了解几个概念节点(node)、服务(service)、任务(task)、负载均衡(loadbalance)。
1. 节点nodes
每个节点node都是docker集群中的每一个docker实例当然也可以理解为运行docker进程的物理机。在集群中的所有节点中又分为管理节点和工作节点。 管理节点 管理节点用于对docker集群的管理对集群的操作命令都需要在管理节点中执行(例外工作节点退出集群时需要在工作节点中执行退出命令)一个docker集群可以具有多个管理节点在众多管理节点中通过raft协议选举出唯一一个leader节点。 工作节点 工作节点接收并执行来自管理节点分发的任务(task)默认地管理节点也可以同时具有工作节点的功能。
2. 服务(service)和任务(task)
服务是对任务的定义而任务执行于管理节点或工作节点。服务是docker集群的中心结构也是用户与swarm交互的主要介质。 服务 docker集群中的服务类似于微服务系统中的服务一个服务是一个或多个实例的集合。而在docker集群中一个服务我们可以理解为多个提供相同服务的docker容器的集合。 在创建一个服务时我们可以指定该服务使用的docker镜像以及该服务能够创建的docker实例的副本数量。 如在一个docker集群中主机A中有两个容器mysqlA和redisA主机B中有两个容器mysqlB和redisB那么主机A中的mysqlA和主机B中的mysqlB属于同一个服务主机A中的redisA和主机B中的redisB属于同一个服务并且由管理节点实现对服务的管理(如同微服务系统中的注册中心)如下图所示 任务 任务就是当我们需要调用集群中某一个服务时管理节点从其管理的服务集合中找到该服务所对应的docker容器实例然后向该实例指派一个任务使其提供相应的服务。一旦任务被分配到某一个节点则不允许再对其进行修改。
3. 负载均衡
当我们需要调用某一个服务时管理节点自动对该服务所对应的节点进行负载均衡调用。例如微服务系统中服务注册中心的负载均衡机制。
五、docker网络
介绍完docker集群的概念我们需要考虑一下在docker集群中由于是多主机架构那么什么样的网络驱动能使跨主机的容器相互通信呢docker给我们提供的网络驱动有bridge、host、overlay、none、ipvlan、macvlan。 bridge 默认的网络驱动。适用于同一主机中docker容器之间的通信。 host 移除docker容器与宿主机之间的网络隔离直接使用宿主机的网络。 overlay 该网络驱动允许多个主机之间的docker容器相互通信。 none 脱机独立运行docker容器无法与其他容器以及主机之间通信。 ipvlan 把对ipv4和ipv6的ip地址的控制权完全交给我们。 macvlan 允许我们对docker容器分配物理地址使docker容器具有物理机表现。
在docker集群中我们使用overlay网络实现多主机内容器之间的相互通信。
1. overlay网络
overlay网络驱动在多个Docker主机之间创建分布式网络。这个网络位于(覆盖)特定于主机的网络之上允许连接到它的容器(包括集群服务容器)在启用加密(TLS)时安全地通信。Docker透明地处理往返于正确的Docker守护进程主机和正确的目的地容器的每个分组的路由。
六、docker集群搭建
1. 环境介绍 两台linux虚拟机 操作系统主机名主机ipdocker版本CentOS7host10(管理节点)192.168.10.10v24.0.7CentOS7host20(工作节点)192.168.10.20v24.0.7CentOS7host30(工作节点)192.168.10.30v24.0.7docker版本必须大于v1.12.0docker的集群模式是从该版本开始的该版本发行于2016.07.28现在都已经2023年了我们直接安装最新版还能避免许多bug。 端口开放或关闭防火墙 2377/tcp用于集群管理通信。 7946/tcp、7946/udp集群中各节点之间的通信。 4789/udpoverlay网络使用。 开放端口的命令如下 # --permanent表示永久生效
[roothost10 ~] firewall-cmd --zonepublic --add-port2377/tcp --permanent
success
[roothost10 ~] firewall-cmd --zonepublic --add-port7946/tcp --permanent
success
[roothost10 ~] firewall-cmd --zonepublic --add-port7946/udp --permanent
success
[roothost10 ~] firewall-cmd --zonepublic --add-port4789/udp --permanent
success
# 重新加载防火墙配置
[roothost10 ~] firewall-cmd --reload
success查看端口是否开放成功 # 查看已开放的端口列表
[roothost10 ~] firewall-cmd --zonepublic --list-ports
2377/tcp 7946/tcp 7946/udp 4789/udp关闭防火墙 # 关闭防火墙
[roothost10 ~] systemctl stop firewalld
# 开机禁用防火墙
[roothost10 ~] systemctl disable firewalld 2. 创建集群
在管理节点host10创建集群使用以下命令
[roothost10 ~] docker swarm init --advertise-addr 192.168.10.10
# 输出
Swarm initialized: current node (0cibl244fqcmh7k6x8a3kwkfp) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-0glmg3n472i4bbpxrynjw0z0uoa7lnxagcfcgnwg40dd3mu4ga-eazqx6idqvn954nfpumn2vob0 192.168.10.10:2377To add a manager to this swarm, run docker swarm join-token manager and follow the instructions.
--advertise-addr用于配置一个ip地址集群中其他节点使用此ip地址与管理节点实现通信。
创建集群的节点默认为管理节点。
另外在输出中包含以下命令用于其他工作节点加入该集群
docker swarm join --token SWMTKN-1-0glmg3n472i4bbpxrynjw0z0uoa7lnxagcfcgnwg40dd3mu4ga-eazqx6idqvn954nfpumn2vob0 192.168.10.10:2377如果需要加入管理节点则使用下面命令
docker swarm join-token manager --token SWMTKN-1-0glmg3n472i4bbpxrynjw0z0uoa7lnxagcfcgnwg40dd3mu4ga-eazqx6idqvn954nfpumn2vob0 192.168.10.10:2377注意该token有效期为24小时。如果该token已过期则可以使用下面命令重新获取
[roothost10 ~] docker swarm join-token workerTo add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-0glmg3n472i4bbpxrynjw0z0uoa7lnxagcfcgnwg40dd3mu4ga-eazqx6idqvn954nfpumn2vob0 192.168.10.10:2377使用docker info查看当前集群的详细信息
[roothost10 ~] docker infoClient: Docker Engine - CommunityVersion: 24.0.7Context: defaultDebug Mode: falsePlugins:buildx: Docker Buildx (Docker Inc.)Version: v0.11.2Path: /usr/libexec/docker/cli-plugins/docker-buildxcompose: Docker Compose (Docker Inc.)Version: v2.21.0Path: /usr/libexec/docker/cli-plugins/docker-composeServer:Containers: 0Running: 0Paused: 0Stopped: 0Images: 4Server Version: 24.0.7Storage Driver: overlay2......Swarm: activeNodeID: 0cibl244fqcmh7k6x8a3kwkfp......Raft:......Dispatcher:Heartbeat Period: 5 seconds......
很长很长使用docker node ls查看当前集群中的各个节点信息
[roothost10 ~] docker node lsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
0cibl244fqcmh7k6x8a3kwkfp * host10 Ready Active Leader 24.0.7其中*表示当前位于此节点中。
3. 集群网络
当我们在管理节点使用docker swarm init初始化一个docker集群时docker默认会创建两个网络
overlay驱动的网络名称为ingress该网络用于处理集群中各个服务之间的控制与数据传输。当我们创建服务service时如果没有指定自定义的overlay网络则默认使用ingress网络。bridge驱动的网络名称为docker_gwbridge该网络用于维持集群中各个节点之间的连接。
[roothost10 docker-scripts]# docker network ls
NETWORK ID NAME DRIVER SCOPE
2d3e81dc418a bridge bridge local
5675307b8b8d docker_gwbridge bridge local
496c4eb3bb51 host host local
j4lsm97dkovz ingress overlay swarm
69df9100d962 myBridge bridge local
e72b30a2ea15 none null local4. 加入工作节点
我们把host20和host30作为工作节点加入到该集群。复制上面的命令分别到到host20和host30两台主机中中执行
[roothost20 ~] docker swarm join --token SWMTKN-1-0glmg3n472i4bbpxrynjw0z0uoa7lnxagcfcgnwg40dd3mu4ga-eazqx6idqvn954nfpumn2vob0 192.168.10.10:2377This node joined a swarm as a worker.[roothost30 ~] docker swarm join --token SWMTKN-1-0glmg3n472i4bbpxrynjw0z0uoa7lnxagcfcgnwg40dd3mu4ga-eazqx6idqvn954nfpumn2vob0 192.168.10.10:2377This node joined a swarm as a worker.恭喜工作节点已加入到集群。 此时如果我们在host20节点中使用docker node ls查看当前集群中的各个节点信息则会出现下面信息
[roothost20 ~] docker node lsError response from daemon: This node is not a swarm manager. Worker nodes can not be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.说明该命令只允许在管理节点中使用。我们在host10(管理节点)中再次执行此命令
[roothost10 docker-scripts] docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
0cibl244fqcmh7k6x8a3kwkfp * host10 Ready Active Leader 24.0.7
wfw312mxlolm6e8xgdwp6kndy host20 Ready Active 24.0.7
rctru4fdjrv6y7gsh6i3ek2lp host30 Ready Active 24.0.7七、部署可视化界面portainer
现在集群已经搭建好了下面我们使用portainer实现docker的可视化界面。
1. 部署单机模式
我们可以将portainer部署在docker集群的管理节点中此时portainer可以通过管理节点的docker进程实现对docker集群的可视化。 在管理节点拉取portainer的镜像 docker pull portainer/portainer-ce:latest将portainer镜像运行为容器 docker run \-p 8000:8000 \-p 9443:9443 \-v /var/run/docker.sock:/var/run/docker.sock \-v portainer_data:/data \--name my-portainer \-d \--privilegedtrue \--restartalways \portainer/portainer-ce:latest--privilegedtrue用于赋予该容器root权限。 在浏览器访问https://192.168.10.10:9443进入portainer创建页面。 创建用户以后进入添加环境页面。有些朋友在这个页面没有Get Started选项只有Add Environments选项。 点击Add Environments选项添加一个docker环境。 我们选择Standalone单机模式的docker环境点击下方按钮对该环境配置。 配置环境。 配置环境的方式有多种通过Agent、API、Socket、Edge Agent Standard四种方式。我们以Socket方式为例将该环境命名为host10-standard。 注意该方式要求我们在运行portainer容器时添加挂载卷-v /var/run/docker.sock:/var/run/docker.sock 环境配置完成后点击portainer首页就可以在环境列表中看到我们刚才添加的环境host1-standalone了。 点击该环境查看其详细信息 点击Go to cluster visualizer查看docker集群
2. 部署集群模式
portainer提供了以集群方式运行的能力既然我们已经搭建好了具有三个节点的docker集群那么我们尝试一下portainer的集群部署。 在管理节点下载部署文件 curl -L https://downloads.portainer.io/ce2-19/portainer-agent-stack.yml -o portainer-agent-stack.yml该文件内容如下主要就是根据镜像创建服务以及挂载卷、网络配置、端口配置、副本配置等信息。 version: 3.2services:agent:image: portainer/agent:2.19.3volumes:- /var/run/docker.sock:/var/run/docker.sock- /var/lib/docker/volumes:/var/lib/docker/volumesnetworks:- agent_networkdeploy:mode: globalplacement:constraints: [node.platform.os linux]portainer:image: portainer/portainer-ce:2.19.3command: -H tcp://tasks.agent:9001 --tlsskipverifyports:- 9443:9443- 9000:9000- 8000:8000volumes:- portainer_data:/datanetworks:- agent_networkdeploy:mode: replicatedreplicas: 1placement:constraints: [node.role manager]networks:agent_network:driver: overlayattachable: truevolumes:portainer_data:但是我们需要对该文件内容中agent部分增加一个端口挂载的配置否则在后面创建环境时会因为连接失败而无法创建环境。 services:agent:image: portainer/agent:2.19.3volumes:- /var/run/docker.sock:/var/run/docker.sock- /var/lib/docker/volumes:/var/lib/docker/volumesports:- 9001:9001networks:- agent_networkdeploy:mode: globalplacement:constraints: [node.platform.os linux]在管理节点部署portainer集群 [roothost10 portainer]# docker stack deploy -c portainer-agent-stack.yml portainerCreating network portainer_agent_network
Creating service portainer_agent
Creating service portainer_portainer可以看到创建了一个网络portainer_agent_network、两个服务portainer_agent和portainer_portainer 在任意节点查看网络创建了一个overlay驱动的网络portainer_agent_network。该网络会在集群中各个节点创建。 [roothost10 portainer]# docker network lsNETWORK ID NAME DRIVER SCOPE
2d3e81dc418a bridge bridge local
5675307b8b8d docker_gwbridge bridge local
496c4eb3bb51 host host local
j4lsm97dkovz ingress overlay swarm
69df9100d962 myBridge bridge local
e72b30a2ea15 none null local
54cnuprrj5e4 portainer_agent_network overlay swarm在管理节点查看服务。 [roothost10 portainer]# docker service lsID NAME MODE REPLICAS IMAGE PORTS
mrjnxf734cki portainer_agent global 3/3 portainer/agent:2.19.3
tfgkmlb6rwwk portainer_portainer replicated 1/1 portainer/portainer-ce:2.19.3 *:8000-8000/tcp, *:9000-9000/tcp, *:9443-9443/tcp在管理节点查看容器。 [roothost10 portainer]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d6d497046594 portainer/agent:2.19.3 ./agent 4 minutes ago Up 4 minutes portainer_agent.0cibl244fqcmh7k6x8a3kwkfp.k3f1gkysdu64718ml6zm5cuzg8742edf0f3b7 portainer/portainer-ce:2.19.3 /portainer -H tcp:/… 4 minutes ago Up 4 minutes 8000/tcp, 9000/tcp, 9443/tcp portainer_portainer.1.otjp9rsp17v8f4l6u2ma1mg7a在工作节点查看容器。与管理节点不同的是工作节点只创建了portainer/agent容器它是由管理节点在集群中创建的副本容器。 [roothost20 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0e090ff0133d portainer/agent:2.19.3 ./agent 5 minutes ago Up 5 minutes portainer_agent.wfw312mxlolm6e8xgdwp6kndy.iputjhsv1q8yudkv6i760e694在浏览器访问https://192.168.10.10:9443进入portainer页面。 与部署单击模式不同的是在选择环境类型时我们应选择集群模式如下图所示 配置环境。 这次我们选择通过Agent的方式配置环境的连接。 完成配置后在环境列表可以看到我们创建的portainer集群环境。 点击进入该环境查看详细信息 进入集群页面可以看到我们在管理节点上部署的portainer容器根据服务的副本配置在工作节点上也建立了相同的portainer容器副本。
八、部署一个容器集群
我们以创建busybox镜像的容器为例创建docker容器集群。
1. 拉取镜像
在管理节点中使用以下命令拉取镜像
docker pull busybox2. 创建网络
在管理节点中创建一个overlay驱动的网络
[roothost10 ~]# docker network create -d overlay --attachable busybox_overlay_network
zjwmzvwlf4fgisos37i5876s9注意在集群环境中创建overlay驱动网络时一定要添加参数--attachable为了集群容器或单机容器与运行在其他节点中的容器建立通信。
3. 创建服务
在管理节点中创建服务
docker service create -td --name busybox_service --network busybox_overlay_network --replicas2 busybox--replicas2表示需要创建两个busybox容器的副本--network busybox_overlay_network表示使用我们在上面创建的网络
4. 进入portainer查看busybox集群 在容器列表页面可以看到busybox容器的集群可以看到两个busybox容器分别位于host20和host30节点ip地址分别为10.0.3.224和10.0.3.225。 5. 不同节点间容器的通信
对于busybox容器集群的情况如下
主机容器ip地址host2010.0.3.225host3010.0.3.224
下面我们进入host20主机的busybox容器去ping位于host30主机中的busybox容器可以ping通反之相同。 6. 集群扩展
上面我们创建busybox容器集群时设置其副本数量为2--replicas2现在我们通过portainer对副本数量进行修改为3。 现在再看一下集群页面可以发现busybox容器已扩展到三个节点如下图所示 到这里docker集群的入门搭建过程就结束了。 纸上得来终觉浅绝知此事要躬行。
————————我是万万岁我们下期再见————————