[docker]02docker三剑客简介(代码片段)

bouygues bouygues     2023-01-01     430

关键词:

前言

DOCKER技术在推出后掀起了一阵容器化技术的热潮,容器化使得服务的部署变得极其简易,这为微服务和分布式计算提供了很大的便利。

为了把容器化技术的优点发挥到极致,docker公司先后推出了三大技术:docker-machine,docker-compose,docker-swarm可以说是几乎实现了容器化技术中所有可能需要的底层技术手段。

在使用go语言实现了判题引擎并打包好docker镜像后,就需要进行分布式判题的编写,这次就让我们手动实践,尝试使用docker的三大杀器来部署一个多机器构成的判题服务集群。

三剑客简介

# docker-machine

docker技术是基于Linux内核的cgroup技术实现的,那么问题来了,在非Linux平台上是否就不能使用docker技术了呢?答案是可以的,不过显然需要借助虚拟机去模拟出Linux环境来。

docker-machine就是docker公司官方提出的,用于在各种平台上快速创建具有docker服务的虚拟机的技术,甚至可以通过指定driver来定制虚拟机的实现原理(一般是virtualbox)。

# docker-compose

docker镜像在创建之后,往往需要自己手动pull来获取镜像,然后执行run命令来运行。当服务需要用到多种容器,容器之间又产生了各种依赖和连接的时候,部署一个服务的手动操作是令人感到十分厌烦的。

dcoker-compose技术,就是通过一个.yml配置文件,将所有的容器的部署方法、文件映射、容器连接等等一系列的配置写在一个配置文件里,最后只需要执行docker-compose up命令就会像执行脚本一样的去一个个安装容器并自动部署他们,极大的便利了复杂服务的部署

# docker-swarm

swarm是基于docker平台实现的集群技术,他可以通过几条简单的指令快速的创建一个docker集群,接着在集群的共享网络上部署应用,最终实现分布式的服务。

相比起zookeeper等集群管理框架来说,swarm显得十分轻量,作为一个工具,它把节点的加入、管理、发现等复杂的操作都浓缩为几句简单的命令,并且具有自动发现节点和调度的算法,还支持自定制。虽然swarm技术现在还不是非常成熟,但其威力已经可见一般。

浅谈docker服务架构和远程API

在正式使用docker技术部署集群应用时,我们应该先来了解一下docker工作的一些底层原理,和docker远程调用的API,这样才能大体了解集群究竟是如何运作的。

daemon

docker的基础服务,比如容器的创建、查看、停止、镜像的管理,其实都是由docker的守护进程(daemon)来实现的。

每次执行的docker指令其实都是通过向daemon发送请求来实现的。

daemon的运作(通信模式)主要有两种,一种是通过unix套接字(默认,但只能在本地访问到,比较安全),一种是通过监听tcp协议地址和端口来实现(这个可以实现在远程调用到docker服务)。

除了通过远程tcp协议访问远程主机上的docker服务外,docker还提供了一套基于HTTP的API,可以使用curl来实现操作远程主机上的docker服务,这为开发基于WEB的docker服务提供了便利。



最终实现集群的时候实际是使用docker的远程调用来将不同的docker主机连接成一个整体的(通过tcp协议)。
[SAMPLE]
1. 首先需要在提供服务的主机上将docker的运行方式改为tcp,具体方法为修改/etc/default/docker中的DOCKER_OPTS为如下内容

-H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock

-H 后的参数是自己定义的要绑定的tcp地址和端口,成功绑定后重启docker服务就可以在该端口访问到docker的daemon服务。

假设我们在192.168.1.123这台主机上开启了docker服务,监听了2345端口,那么我们就可以在同一网段的其他主机上(比如192.168.1.233)通过docker -H tcp://192.168.1.123:2345 <command>的方式调用到该主机上的docker服务。
docker -H tcp://192.168.1.123:2345 ps
docker -H tcp://192.168.1.123:2345 images
docker -H tcp://192.168.1.123:2345 run ...

最终swarm构建集群的时候,就是通过这样的远程服务调用来调度各个节点的。

集群和分布式运算

在正式开始实践集群之前,我们有必要了解究竟什么是集群,什么是分布式计算。

首先,这两者有一个共同点,就是他们都是使用了多个服务节点的,通俗的说,就是要用到多台服务器协同工作(不一定是实体,也可能是虚拟机)。

而两者的区别在于:

  • 集群是多台机器执行同一个业务,每次根据调度算法寻找最合适的节点来执行该业务
  • 分布式计算是将一个业务拆分成多个独立的部分,由多台机器共同协作完成

集群的优点在于,当业务的需要的资源比较大时,可以避免由一个服务器去独自承担压力,而且即便有一个节点宕机了,业务仍然可以继续正常运行。这有点类似于负载均衡

分布式的优点则是在计算上,可以协同多台机器发挥计算的威力,进行需要超高性能的运算

构建集群

[使用docker-machine创建节点]

docker-machine create --driver virtualbox manager1 

创建一个新的docker-machine虚拟机manager1

在创建了虚拟机后,可以使用docker-machine env manager1来查看虚拟机manager1的相关信息,包括IP地址等

通过docker-machine ssh manager1 <command>的方式来访问虚拟机,执行指令。

[创建swarm集群]

初始化一个swarm集群

docker swarm init --listen-addr <MANAGER-IP>:<PORT> --advertise-addr <IP>

 --listen-addr参数是管理者节点的docker服务所在的IP:PORT,也就是说,可以通过这个组合访问到该节点的docker服务。

--advertise-addr是广播地址,也就是其他节点加入该swarm集群时,需要访问的IP

docker-machine ssh manager1 
docker swarm init --listen-addr 192.168.99.100:2377 --advertise-addr 192.168.99.100

返回响应:

Swarm initialized: current node (23lkbq7uovqsg550qfzup59t6) is now a manager. 
To add a worker to this swarm, run the following command:
docker swarm join
--token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-c036gwrakjejql06klrfc585r
192.168.99.100:2377
To add a manager to this swarm, run ‘docker swarm join-token manager‘ and follow the instructions.

这样便创建了一个swarm集群,并且manager1节点目前是以管理者的身份加入在节点中的。

worker1worker2两个节点加入到swarm集群中去,分别在两个节点的虚拟机中执行docker swarm join --token ..即可:
$ docker-machine ssh worker1 
$ docker swarm join --token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-c036gwrakjejql06klrfc585r 192.168.99.100:2377
This node joined a swarm as a worker. $ docker-machine ssh worker2
$ docker swarm join --token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-c036gwrakjejql06klrfc585r 192.168.99.100:2377
This node joined a swarm as a worker.
 
在任何一个节点上执行docker node ls都可以查看到当前整个集群中的所有节点
$ docker-machine ssh manager1 
$ docker node ls

NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
manager1 - virtualbox Running tcp://192.168.99.100:2376 v1.12.3
worker1 - virtualbox Running tcp://192.168.99.101:2376 v1.12.3
worker2 - virtualbox Running tcp://192.168.99.102:2376 v1.12.3

[创建跨主机网络]

集群建立完毕之后我们要做的就是在集群上部署我们的服务。但是首先应该让所有的节点处在一个共享的网络中,这样当我们把服务部署在这个共享网络中,就相当于部署在整个集群中了。
使用docker network ls可以查看到当前主机所参与的所有网络:
$ docker-machine ssh manager1 
$ docker network ls 
NETWORK ID NAME DRIVER SCOPE 
764ff31881e5 bridge bridge local 
fbd9a977aa03 host host local
6p6xlousvsy2 ingress overlay swarm 
e81af24d643d none null local
其中SCOPE为swarm,DRIVER为overlay的即为集群节点中的共享网络。集群建立后会有一个默认的ingress共享网络,现在我们来再创建一个:
$ docker-machine ssh manager1 
$ docker network create --driver overlay swarm_test
 
[在跨主机网络上部署服务]
在集群上部署应用,就是在共享网络上部署服务(service)。
但首先要保证每个节点上都已经有所需的镜像和环境了 ==> 可以通过将同一份docker-compose配置文件共享到每个主机上,使用docker-compose在每个节点上下载镜像和搭建环境的工作。
$ docker-machine ssh manager1 
$ docker pull registry.cn-qingdao.aliyuncs.com/marklux/judge_server:1.0 
$ docker-machine ssh worker1 $ docker pull registry.cn-qingdao.aliyuncs.com/marklux/judge_server:1.0
$ docker-machine ssh worker2
$ docker pull registry.cn-qingdao.aliyuncs.com/marklux/judge_server:1.0

接下来便是重头戏,我们使用manager1节点,在共享网络上启动我们的服务

$ docker service create --replicas 3 --name judge_swarm -p 8090:8090 --network=swarm_test registry.cn-qingdao.aliyuncs.com/marklux/judge_server:1.0

 这个命令看起来是不是很像docker run?没错,swarm最终的目的就是把操作集群变得像操作单一的docker服务端一样简单!

--replicas 用于指定服务需要的节点数量,也就是集群的规模,这个值是弹性的,你可以在后续动态的更改它。

当服务中某个节点挂掉时,swarm将会搜寻集群中剩余的可用节点,顶替上去。也就是说,swarm会动态的调度,总是保持服务是由3个节点运行着的。

-p 用于暴露端口到宿主机,这样我们就能访问到了。

--network用于指定部署service的网络是哪一个

现在在manager1节点中使用docker service ls来查看集群中的服务:

$ docker service ls 
ID NAME MODE REPLICAS IMAGE PORTS 
kofcno637cmq judge_swarm replicated 3/3 registry.cn-qingdao.aliyuncs.com/marklux/judge_server:1.0 *:8090->8090/tcp

 现在我们尝试在本地访问192.168.99.100:8090/ping,就可以得到响应了,事实上,现在无论将ip换为worker1或者worker2的,响应的结果都是一样,因为此时所有节点已经处在一个共同的集群网络下了

遗留问题

至此集群的部署已经完成,但是我们还遗留了几个问题没有解决:

  • 集群节点的动态添加删除不是很方便,这导致在web端管理判题服务机有一定的难度,当然可以通过docker的REMOTE API来实现,不过复杂度比较高
  • 集群节点间的文件同步不太好实现,可能需要自己写脚本同步或是使用rsync之类的服务来实现
  • swarm非常适合快速构建大量集群来实现业务的处理,不过对于只有几台机器的情况而言,有些"杀鸡用牛刀"的感觉

作者:MarkyLumin
链接:https://www.jianshu.com/p/0e231a928ee6
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
 
 
 
 




































linux企业运维——docker三剑客之docker-compose(代码片段)

Linux企业运维——Docker(九)三剑客之docker-compose文章目录Linux企业运维——Docker(九)三剑客之docker-compose1、Docker-Compose简介2、Docker-Compose实践1、Docker-Compose简介微服务架构的应用系统一般包含若干个微服务,... 查看详情

企业运维实战--docker三剑客一之docker-machine(代码片段)

企业运维实战--Docker三剑客一之Dockermachine前言-dockermachine简介Dockermachine实操安装使用docker-machine前言-dockermachine简介DockerMachine是Docker官方编排(Orchestration)项目之一,负责在多种平台上快速安装Docker环境。DockerMachine 查看详情

企业运维实战--docker三剑客二之docker-compose(代码片段)

企业运维实战--Docker三剑客二之docker-compose前言-dockercompose简介dockercompose实践docker-compose安装docker-compose配置haproxy+nginx负载均衡前言-dockercompose简介DockerCompose是一种编排服务,基于pyhton语言实现,是一个用于在Docker上定... 查看详情

linux企业运维——docker三剑客之dockermachine(代码片段)

Linux企业运维——Docker(八)三剑客之DockerMachine文章目录Linux企业运维——Docker(八)三剑客之DockerMachine1、DockerMachine简介2、DockerMachine一键部署Docker1、DockerMachine简介DockerMachine项目基于Go语言实现,是Doc 查看详情

docker三剑客之compose(代码片段)

Docker三剑客之ComposeDockerCompose是Docker官方编排(Orchestration)项目之一,负责快速的部署分布式应用。Compose基本介绍Compose简介Compose代码Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。从功能上看,跟OpenS... 查看详情

容器技术|docker三剑客之docker-compose(代码片段)

三剑客简介docker-machinedocker技术是基于Linux内核的cgroup技术实现的,那么问题来了,在非Linux平台上是否就不能使用docker技术了呢?答案是可以的,不过显然需要借助虚拟机去模拟出Linux环境来。docker-machine就是docker公司官方提出... 查看详情

linux企业运维——docker三剑客之dockerswarm

Linux企业运维——Docker(十)三剑客之DockerSwarm文章目录Linux企业运维——Docker(十)三剑客之DockerSwarm1、DockerSwarm简介2、DockerSwarm部署实践3、监控Swarm集群4、编写脚本创建集群5、Swarm图形化管理界面1、DockerSwarm简... 查看详情

docker三剑客——docker-compose(代码片段)

一、Docker-Compose简介Compose是用于定义和运行容器docker应用程序的工具。通过Compose,可以使用YAML文件来配合应用程序需要的所有的服务。然后,使用一个命令,就可以从YAML文件配合中创建并启动所有服务。那么就需要了解YAML文... 查看详情

docker:docker三剑客之dockermachine(代码片段)

上篇文章Docker(四):Docker三剑客之DockerCompose介绍了DockerCompose,这篇文章我们来了解DockerMachine。DockerMachine介绍DockerMachine是Docker官方编排(Orchestration)项目之一,负责在多种平台上快速安装Docker环境。DockerMachine是一个工具,它允... 查看详情

docker三剑客之docker-compose(记官方案例)(代码片段)

简介Compose项目来源于之前的fig项目,使用python语言编写,与docker/swarm配合度很高。Compose是Docker容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用DockerCompose不再需要使用shell脚本来启动容器。?Compo... 查看详情

kubernetes实践指南(代码片段)

...简介三、kuadm安装k8s一、Docker相关内容1、Docker工具集Docker三剑客:Compse、swarm、machinedockercompose:适用于单机,容器编排定义dockerswarm:对所有Docker宿主机资源整合,集群管理dockermachine:初始化Docker环境,跨平台支持mesos+marathonmes... 查看详情

24.docker技术入门与实战---docker三剑客之compose

第24章 Docker三剑客之Compose24.1 Compose简介 Compose负责实现对基于docker容器的多应用服务的快速编排。Compose的定位是"定义和运行多个Docker容器的应用"。它允许用户通过一个单独的docker-compose.yml模板文件来定义一组相关联的应用... 查看详情

docker:docker三剑客之dockerswarm(代码片段)

实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行。然而,面对Kubernetes,Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它们之中,Swarm是Docker原生的,同时也是最简单,最易学,最节省... 查看详情

容器技术|docker三剑客之docker-machine(代码片段)

docker-machine是什么?ocker-machine就是docker公司官方提出的,用于在各种平台上快速创建具有docker服务的虚拟机的技术,甚至可以通过指定driver来定制虚拟机的实现原理(一般是virtualbox)。Docker与DockerMachine的区别Docker是一个Client-Ser... 查看详情

docker三剑客之compose(代码片段)

参考:DockerCompose安装以及入门Docker三剑客之DockerComposegithubcomposereadme1.下载安装curl-Lhttps://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname-s`-`uname-m`>/usr/local/bin/docker-compo 查看详情

docker:docker三剑客之dockercompose(代码片段)

前两篇文章我们介绍了Dockerfile的使用Docker(二):Dockerfile使用介绍,我们知道使用一个Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案,今天给大家介绍Docker官... 查看详情

docker三剑客之dockerswarm(代码片段)

DockerMachine创建Docker主机DockerSwarm配置集群节点DockerService部署单个集群服务DockerStack部署多个集群服务,以及GUI管理页面docker-machine、dockerswarm、dockernode、dockerservice和dockerstack常用命令DockerSwarm和DockerCompose一样,都是Docker官方容器... 查看详情

docker三剑客之应用machine,compose,swarm(代码片段)

利用Docker-Machine创建虚拟Docker主机##下载docker-machinehttps://github.com/docker/machine/releases[email protected]:~$curl-Lhttps://github.com/docker/machine/releases/download/v0.16.0/docker-machine-`uname 查看详情