docker入门教程(docker技术入门与实战)

蜂窝集群。

为了便于理解,首先需要解释一下几个概念,以及蜂窝集群的工作原理。

蜂窝的概念和原理

  • Swarm: 一个蜂窝是一组计算机,它们都运行了Docker Engine并且相互连接组成一个集群。显然,一个蜂窝可以包含多台计算机,而一台计算机只能加入一个蜂窝集群。
  • Swarm manager: 蜂窝经理是Swarm集群中一类特殊的计算机,它们负责执行Docker命令行的命令以及按照一定的策略在各个节点上管理容器。
  • Swarm workers: 蜂窝工人是Swarm集群中的另一类计算机,它们受经理的管理,只负责运行容器,而不能执行Docker命令行的命令。
  • node: 蜂窝集群中的每一个计算机 (经理或工人)都称为一个节点。
  • Ingress routing mesh: 蜂窝利用一种称为Ingress routing mesh的机制来实现负载均衡,其原理如下图所示:

在每一个节点上都运行了一个负载均衡器(swarm load balancer),它负责把网络请求分发到各个节点运行的容器中。由上图可以看出,蜂窝集群是一个很复杂的网状结构,每个节点的负载均衡器都与所有节点中的容器相连接。

创建集群

下面以Win10操作系统为例,创建2个虚拟机并将它们组合成一个蜂窝集群。

打开 Hyper-V Manager, 点击右侧的菜单"Virtual Switch Manager…":

新建一个External类型的virtual switch,取名为"myswitch",勾选"Allow management operating system to share this network adapter"。

当创建了myswitch虚拟网络交换配置后,虚拟机就可以访问外部网络了。

下面的docker-machine命令可以创建两个虚拟机。
   提示:从现在开始,所有的docker-machine命令请在CMD管理员模式下运行。

使用docker-machine ls命令查看虚拟机列表。你可以从列表中看到虚拟机的IP地址和状态,例如:

C:\Users\i062893\OneDrive\code\docker-workspace\my-first-container>docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 - hyperv Running tcp://10.58.181.134:2376 v18.09.7
myvm2 - hyperv Running tcp://10.58.180.164:2376 v18.09.7

我们打算让myvm1作为蜂窝集群的经理,因此在myvm1中执行docker swarm init命令。方法如下:

C:\Users\i062893\OneDrive\code\docker-workspace\my-first-container>docker-machine ssh myvm1 "docker swarm init --advertise-addr 10.58.181.134"
Swarm initialized: current node (64ve59yqsdgvcpsphbn59et5v) is now a manager.

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

 docker swarm join --token SWMTKN-1-2zpjxx9ie1a8g8kadizxhy0pygx5sb1lrpjp5wqlu7qxqg2lo6-5h5zw6h0dvq6gf51tly19y9uj 10.58.181.134:2377

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

上述命令将引号中的指令通过ssh连接发送到myvm1虚拟机上并执行。从响应消息中可以看到一个docker swarm join指令,将它拷贝出来,在myvm2上执行,就可以把第二个虚拟机加入同一个蜂窝集群。也可以使用docker swarm join-token worker再次查看具体的docker swarm join 指令,例如:

C:\Users\i062893\OneDrive\code\docker-workspace\my-first-container>docker-machine ssh myvm1 "docker swarm join-token worker"
To add a worker to this swarm, run the following command:

 docker swarm join --token SWMTKN-1-3ych7gmhb6uwven0nn4fo0ft8oe5857vitnlzztofvwia307pn-2vlvn2dng0lr5m87mozo4d5vt 10.59.173.123:2377

我们接着把myvm2加入蜂窝集群:

C:\Users\i062893\OneDrive\code\docker-workspace\my-first-container>docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-2zpjxx9ie1a8g8kadizxhy0pygx5sb1lrpjp5wqlu7qxqg2lo6-5h5zw6h0dvq6gf51tly19y9uj 10.58.181.134:2377"
This node joined a swarm as a worker.

之后可以使用docker node ls查看蜂窝中的所有节点信息:

C:\Users\i062893\OneDrive\code\docker-workspace\my-first-container>docker-machine ssh myvm1 "docker node ls"
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
64ve59yqsdgvcpsphbn59et5v * myvm1 Ready Active Leader 18.09.7
15dve4fu9wuazzqedtvg40lfe myvm2 Ready Active 18.09.7

此时,我们已经组建了一个蜂窝集群,包含了两个节点。一个是经理 (myvm1),另一个是工人 (myvm2)。

在蜂窝集群中部署程序

为了方便演示,我们可以把当前的shell窗口直接连到某一个虚拟机上,方法如下:
   运行docker-machine env myvm1,例如:

C:\Users\i062893\OneDrive\code\docker-workspace\my-first-container>docker-machine env myvm1
SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://10.58.181.134:2376
SET DOCKER_CERT_PATH=C:\Users\i062893\.docker\machine\machines\myvm1
SET DOCKER_MACHINE_NAME=myvm1
SET COMPOSE_CONVERT_WINDOWS_PATHS=true
REM Run this command to configure your shell:
REM @FOR /f "tokens=*" %i IN ('docker-machine env myvm1') DO @%i

提示:如果你的Docker配置了代理,那么需要执行命令: docker-machine env --no-proxy myvm1
   否则,你会在接下来的运行中遇到Forbidden的错误。

按照响应消息中的提示,再运行最后一行的代码即可:

C:\Users\i062893\OneDrive\code\docker-workspace\my-first-container>@FOR /f "tokens=*" %i IN ('docker-machine env myvm1') DO @%i

这样,当前shell窗口就和myvm1虚拟机建立了连接。所有后续的命令都会直接在myvm1虚拟机上运行。通过查看虚拟机列表,也可以发现myvm1处于ACTIVE状态 (ACTIVE列显示了一个星号):

C:\Users\i062893\OneDrive\code\docker-workspace\my-first-container>docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 * hyperv Running tcp://10.58.181.134:2376 v18.09.7
myvm2 - hyperv Running tcp://10.58.180.164:2376 v18.09.7

使用Part 3 指南中相同的命令来部署一个服务:

C:\Users\i062893\OneDrive\code\docker-workspace\my-first-container>docker stack deploy -c docker-compose.yml getstartedlab
Creating network getstartedlab_webnet
Creating service getstartedlab_web

这个服务包含5个任务,它们会随机的分布在两个虚拟机中。使用docker stack ps getstartedlab可以查看这些任务的详情。例如,下面的列表显示,1, 3, 5号任务运行在myvm2节点上,而2, 4号任务运行在myvm1节点上。

C:\Users\i062893\OneDrive\code\docker-workspace\my-first-container>docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
3nky30x2zeig getstartedlab_web.1 feiandytan/get-started:part2 myvm2 Running Running less than a second ago
o6vtrdz6dlvb getstartedlab_web.2 feiandytan/get-started:part2 myvm1 Running Running less than a second ago
58xgzjldd6jk getstartedlab_web.3 feiandytan/get-started:part2 myvm2 Running Running less than a second ago
uywciema025m getstartedlab_web.4 feiandytan/get-started:part2 myvm1 Running Running less than a second ago
xfmjvv0jgvly getstartedlab_web.5 feiandytan/get-started:part2 myvm2 Running Running less than a second ago

测试的方式和之前一样,使用curl http://10.58.181.134:4000 或 curl http://10.58.180.164:4000 来访问我们的服务。这里使用的是myvm1或myvm2的IP地址。还记得之前介绍的Ingress routing mesh 机制吗?正是利用了这个机制,使得Docker蜂窝集群的任何一个节点,都可以作为外部web service的访问入口。

清理stack

使用下面的命令删除一个stack:
   docker stack rm getstartedlab

使用下面的命令移除一个蜂窝节点:

docker-machine ssh myvm2 "docker swarm leave"
docker-machine ssh myvm1 "docker swarm leave --force"

重启虚拟机

使用docker-machine stop来停止一个虚拟机:
   docker-machine stop myvm1

使用docker-machine start启动一个虚拟机:
   docker-machine start myvm1

使用docker-machine restart重启虚拟机:
   docker-machine restart myvm1

重新生成证书

通常当实体机的网络发生变化时,虚拟机的IP地址也会变化。此时原始的TLS证书就不能使用了。当执行docker-machine ls查看虚拟机状态时,会看到错误提示:Unable to query docker version: Get
   https://192.168.31.72:2376/v1.15/version: x509: certificate is valid for 10.59.162.174, not 192.168.31.72

解决方法是运行下面的命令重新生成一个虚拟机的证书:
   docker-machine regenerate-certs myvm1

小结

下面列出本章中用到的命令,供大家参考:

docker-machine create --driver virtualbox myvm1 # Create a VM (Mac, Win7, Linux)
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1 # Win10
docker-machine env myvm1 # View basic information about your node
docker-machine ssh myvm1 "docker node ls" # List the nodes in your swarm
docker-machine ssh myvm1 "docker node inspect" # Inspect a node
docker-machine ssh myvm1 "docker swarm join-token -q worker" # View join token
docker-machine ssh myvm1 # Open an SSH session with the VM; type "exit" to end
docker node ls # View nodes in swarm (while logged on to manager)
docker-machine ssh myvm2 "docker swarm leave" # Make the worker leave the swarm
docker-machine ssh myvm1 "docker swarm leave -f" # Make master leave, kill swarm
docker-machine ls # list VMs, asterisk shows which VM this shell is talking to
docker-machine start myvm1 # Start a VM that is currently not running
docker-machine env myvm1 # show environment variables and command for myvm1
eval $(docker-machine env myvm1) # Mac command to connect shell to myvm1
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression # Windows command to connect shell to myvm1
docker stack deploy -c# Deploy an app; command shell must be set to talk to manager (myvm1), uses local Compose file
docker-machine scp docker-compose.yml myvm1:~ # Copy file to node's home dir (only required if you use ssh to connect to manager and deploy the app)
docker-machine ssh myvm1 "docker stack deploy -c" # Deploy an app using ssh (you must have first copied the Compose file to myvm1)
eval $(docker-machine env -u) # Disconnect shell from VMs, use native docker
docker-machine stop $(docker-machine ls -q) # Stop all running VMs
docker-machine rm $(docker-machine ls -q) # Delete all VMs and their disk images

Part 5: Stacks

在Part 5 指南中,我们一起来了解一下栈的概念。在Docker的世界中,你可以把一组相互关联,共同完成某个程序功能的服务组合成一个栈。在之前的文章中,我们已经使用过栈了:使用docker-compose.yml文件来定义栈,使用docker stack deploy命令来部署一个栈。由此可知,栈是Docker中部署(deploy)的最小单元。即使你的程序只有一个服务,你也必须把它包裹在一个栈中,比如Part 4的示例程序就是一个仅包含一个服务的栈。

在进行下面的练习之前,先确保你的蜂窝集群状态正常。

把当前的shell连接到myvm1, 并运行docker node ls:

C:\Users\i062893\OneDrive\code\docker-workspace\my-first-container>docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
uneyxvztmsxahbilzoneq76tu * myvm1 Ready Active Leader 18.09.7
gnove3cdyjxfpchn99vc3ff5j myvm2 Ready Active 18.09.7

确保每个节点的状态都是Ready。否则请参考Part 4搭建蜂窝集群。

增加一个visualizer服务

接下来,我们在之前的getstartedlab的基础上,新增加一个服务。修改docker-compose.yml文件如下:

version: "3"
services:
 web:
 image:/get-started:part2
 deploy:
 replicas: 5
 restart_policy:
 condition: on-failure
 resources:
 limits:
 cpus: "0.1"
 memory: 50M
 ports:
 - "80:80"
 networks:
 - webnet
 visualizer:
 image: dockersamples/visualizer:stable
 ports:
 - "8080:8080"
 volumes:
 - "/var/run/docker.sock:/var/run/docker.sock"
 deploy:
 placement:
 constraints: [node.role == manager]
 networks:
 - webnet
networks:
 webnet:

我们新增加了一个服务,取名为“visualizer”。它使用了Docker提供的一个标准的镜像:
   dockersamples/visualizer:stable。这个服务可以在浏览器中显示当前蜂窝集群各个节点的状态。ports属性之前已经介绍过了,即把实体机的端口8080映射到容器的端口8080。volumes属性则是映射磁盘文件,即把实体机的文件"/var/run/docker.sock"映射到容器的文件"/var/run/docker.sock"。而
   deploy.placement.constraints属性,则意味着该visualizer服务仅能部署到蜂窝经理节点上,即myvm1虚拟机。

运行docker stack deploy来部署新的栈:

docker stack deploy -c docker-compose.yml getstartedlab

部署成功后,我们就可以在浏览器中查看visualizer:

再增加一个redis服务

我们重复一遍上述步骤,再新增一个redis服务。在最开始Part 1的python程序中,我们使用到了redis,用来记录当前网站的访问次数。当时由于我们的程序没有包含redis服务,所以返回错误消息。接下来,把redis服务加到docker-compose.yml文件中:

version: "3"
services:
 web:
 image:/get-started:part2
 deploy:
 replicas: 5
 restart_policy:
 condition: on-failure
 resources:
 limits:
 cpus: "0.1"
 memory: 50M
 ports:
 - "80:80"
 networks:
 - webnet
 visualizer:
 image: dockersamples/visualizer:stable
 ports:
 - "8080:8080"
 volumes:
 - "/var/run/docker.sock:/var/run/docker.sock"
 deploy:
 placement:
 constraints: [node.role == manager]
 networks:
 - webnet
 redis:
 image: redis
 ports:
 - "6379:6379"
 volumes:
 - "/home/docker/data:/data"
 deploy:
 placement:
 constraints: [node.role == manager]
 command: redis-server --appendonly yes
 networks:
 - webnet
networks:
 webnet:

redis服务使用的镜像就是"redis"。并且,redis也和visualizer一样,只运行在经理节点上。

请注意volumes属性,它表明redis服务需要将实体机的文件"/home/docker/data"映射到容器的文件"/data"。因此在部署这个栈之前,我们先在myvm1虚拟机上创建子目录/home/docker/data。方法是运行下面的命令:

docker-machine ssh myvm1 "mkdir ./data"

再次运行docker stack deploy来部署新的栈

docker stack deploy -c docker-compose.yml getstartedlab

成功部署后,在myvm1节点上运行docker service ls查看一下3个服务的状态:

docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
xgd8p4k7x5ig getstartedlab_redis replicated 1/1 redis:latest *:6379->6379/tcp
t2fhws0yxz49 getstartedlab_visualizer replicated 1/1 dockersamples/visualizer:stable *:8080->8080/tcp
z0wttomwgrbt getstartedlab_web replicated 5/5 feiandytan/get-started:part2 *:80->80/tcp

使用curl 来看看网站的访问计数器:

C:\code\docker-workspace\part5-1>curl http://10.59.173.123 2944f07a164d
 1
C:\code\docker-workspace\part5-1>curl http://10.59.173.123 b1b2c6a4fc33
 2
C:\code\docker-workspace\part5-1>curl http://10.59.173.123 ce4344324343
 3
C:\code\docker-workspace\part5-1>curl http://10.59.173.123 aaf34aec3fa4
 4

最后看一下Visualizer返回的节点状态:

至此,我们已经搭建了一个docker集群,并部署了一个容器化的程序。该程序包含1个栈 (3个服务)。其中redis服务和visualizer服务只在经理节点上运行了一个容器;web服务则运行了5个容器,由swarm自动将5个容器分配给集群中的各个节点。Docker会自动维护各个容器的状态,一旦出现异常,容器会自动重启。最重要的是,每个节点对外提供的web service都可以作为该程序的入口地址,Docker的Ingress routing mesh 实现了网络请求的负载均衡。

本皮是一个有着5年工作经验的程序员,关于Java,自己有做材料的整合,一个完整学习Java的路线,学习材料和工具。需要的伙伴可以私信我,发送“交流”后就可免费获取。对于学习Java有任何问题(学习方法,学习效率,如何就业)都可以问我。希望你也能凭自己的努力,成为下一个优秀的程序员!

作者:谈飞
       来源:
       https://www.jianshu.com/p/2f1805cf0c1e

(0)

相关推荐

  • docker技术入门与实战(docker快速入门)

    为了更好地理解 Docker 是什么,我们先来讲个故事:我需要盖一个房子,于是我搬石头.砍木头.画图纸.盖房子.一顿操作,终于把这个房子盖好了.结果,住了一段时间,心血来潮想搬到海边去.这时候按以往的 ...

  • NavMesh寻路网格自动生成和动态障碍技术.Navmesh入门教程

    在之前的自己写的NavMesh网格寻路功能的基础上,做了个寻路网格动态自动生成的功能,突破了Unity的自带寻路不能动态生成寻路网格,一定要先break再用的缺点。 用法很简单,把可以走的地形设置成一 ...

  • 在Mac OS X系统编程.软件开发入门教程

    苹果电脑不仅可以用来上网.娱乐.做设计,还可以帮我们做很多事情,比如苹果机(Mac OS X)是编程做软件开发很好的平台. 下面是在Mac OS X编程.软件卡发入门教程苹果最新的操作系统Mac OS ...

  • 可能是史上最全的IPAD插画入门教程

    今天这篇超全面的iPad 插画 入门指南,从哪款绘图软件好,不同触控笔的特点,可以画什么到怎么画都有非常细致的评测和过程,甚至有作者亲自演示的插画 教学(附绘画视频),用心程度让人惊喜不已,千万别错过 ...

  • 火狐浏览器插件开发入门教程

    许多网友都想学习火狐浏览器插件开发这一方面的知识,不过,目前,许多资料都是比较晦涩难懂,不太适合初学者.那么,初学者想要学习火狐浏览器插件开发该怎么入门呢?还是一起来看看今天的火狐浏览器插件开发入门教 ...

  • 新手用单反相机入门教程讲解

    全民摄影的年代,抓着相机都可以叫做摄影师,如何成为一个成功的摄影师?单反相机入门教程,小编总结了必备的十大心法,请对照你做到了几条?帮助你从摄影爱好者到摄影师到摄影家,逐步升级.请仔细查看教程,反复练 ...

  • ps绘图入门教程

    PS是现在图片美化的最重要的技术,很多人都在学习这门技术,我们看到的很多图片都是经过PS处理的,PS还可以进行绘图,下面就介绍一下:ps绘图入门教程 操作方法 01 打开电脑,登录电脑账户,然后点击P ...

  • 华尔兹基础入门教程

    生活中有这许许多多的烦恼,下面就由小编教你华尔兹基础入门教程,希望你的生活多姿多彩~ 操作方法 01 华尔兹的基本舞步结构,是由前进(或后退).横移.并脚三步构成一个基本旋回.这样,第一个旋回和第二个 ...

  • 尼康单反相机入门教程

    全民摄影的年代,抓着相机都可以叫做摄影师,如何成为一个成功的摄影师?单反相机入门教程,小编总结了必备的十大心法,请对照你做到了几条?帮助你从摄影爱好者到摄影师到摄影家,逐步升级.请仔细查看教程,反复练 ...

  • 计算机编程入门教程

    计算机编程入门教程 操作方法 01 首先多看一些语言的基础书籍,确定一门入门语言.个人比较推荐Python--一个非常适合初学者的语言 ,而且当你掌握它的时候它会变得更加强大.被用来开发了许多Web应 ...