docker/docker swarm学习
docker好像越来越流行了,容器化就类似于框架的感觉,封装的越来越多,屏蔽了细节。
docker
docker按层次有这几个层:
- stack
- 栈,代表一个功能整体,比如提供一个网站服务。它可以包含多个service
- service
- 服务,代表一个单一功能,多个单一功能,整合成为一个完成功能。每个service包含多个container
- container/task
- 我的理解这两个概念其实是对等的,当然我的理解可能有误
- service可以有多个实例,每一个container代表service的一个实例,这是容器化的一个显著特点,请求可以在各个实例间均衡负载
docker 使用的通常流程:
- Docker镜像制作
- 创建
Dockerfile
docker build
: 根据Dockerfile生成docker镜像docker push
: 将docker镜像推送到镜像仓库,供其他主机或之后使用- 根据镜像,搭建应用
- 生成
docker compose
的yml
文件,描述stack包含的服务 docker stack deploy
部署应用- 镜像或者容器数量有更新时,通过
docker stack deploy
更新部署
docker swarm
docker swarm与kubernetes对应,用于统一管理节点。
单独的一个stack可以在一台机器上运行,而如果想做高可用,就离不了多台机器部署,同时服务,这时可以用docker swarm。
docker swarm的节点分为manager
节点和worker
节点
swarm 初始化
- manager节点管理整个swarm,管理命令仅能在manager节点运行。
- workder节点加入manager节点后,由manager节点管控
docker swarm的使用其实与前面docker使用的流程类似。使用docker swarm前,首先在manager节点电脑上运行
docker swarm init --advertise-addr {url}
其中url
是加入服务广播节点,我用的阿里云服务器测试的,如果不指定,会默认成私有ip,从而其他服务器无法加入。
在执行初始化后,控制台会给出提示命令,在worker节点的机器上,输入该命令,就能加入这个swarm了,类似如下格式:
docker swarm join xxxxxxxxxxxxxxx
部署stack
初始化swarm后,其实后面的操作和第一部分docker操作一样,deploy服务即可。
所不同的是,未启用swarm时,container只在本机创建,而启用swarm后,container会自动分配在不同的主机中创建。
当访问服务时,docker swarm会自动在各个container以及节点间进行负载。
docker 相关管理命令
- docker service ls
- docker stack ls
- docker service ps
- docker stack ps
- docker leave : worker节点退出swarm
- docker leave --force: manager节点需要指定
force
选项退出
其他
注意docker使用了4789 UDP
端口做负载均衡,7946 TCP/UDP
端口做节点发现服务。一般云主机供应商防火墙会组织这些端口,想要正常负载的话,需要在防火墙中打开。
阿里云夸区域的主机,私有ip不通,所以注意worker和manager节点都要通过--adevertise-addr
指定主机的公网ip才行