前端时间一直在研究docker相关技术,想把他用在我最近的项目上,最开始想使用的kubernates,但是不知道为什么一直下载不下来相关镜像,*都没用,于是转战docker swarm,并且在学校的四个免费的2C4G服务器上搭建了一个实验性质的集群,最近打算把这个实验性质的集群转移到生产环境中,并将其中的一些过程记录下来。
简单说下我目前用这种方式之后的好处吧
- 第一是简化了部署,再不需要打包、选择可用节点上传,最后运行这种方式了,现在都是一键然后集群根据目前的负载情况自行选择服务部署节点。
- 第二是简化了运维,平时都是服务出了问题,收到报告,然后登录服务器,手动重启服务,但是现在服务会在崩溃之后自启。
- 第三是可伸缩,可以根据需求来选择服务的副本,而且节点增加也不用去重新配置Java、MySQL、Python等环境,只需要安装docker即可。
目前只想到了以上三个优势吧,不过我觉得已经很足够了。
本文所有节点的操作系统均为Ubuntu 18.04
1.docker的安装
首先需要在各台机器上都安装docker环境,使用如下命令都可以安装好了
curl -sSL https://get.daocloud.io/docker | sh
接下来需要修改/etc/docker/daemon.json文件,修改它有两个目的,第一是为了加快镜像的下载速度,另外一个原因是docker0接口会占用ip地址172.17.0.0/24,由此可能导致内网环境下登录不上服务器,因此需要配置让docker0去占用其他的ip。
sudo vim /etc/docker/daemon.json
编辑为如下的内容
{
"bip" : "192.168.200.1/24",
"mtu" : 1400,
"registry-mirrors": ["https://pee6w651.mirror.aliyuncs.com","http://hub-mirror.c.163.com", "https://registry.docker-cn.com"]
}
然后用如下命令使修改生效
sudo apt-get install bridge-utils
sudo systemctl stop docker
sudo ip link set dev docker0 down
sudo brctl delbr docker0
sudo systemctl start docker
最后将用户添加到docker组中,这样执行docker相关的命令就不需要sudo了。
# 添加docker用户组,一般已存在,不需要执行
sudo groupadd docker
# 将登陆用户加入到docker用户组中
sudo gpasswd -a $USER docker
# 更新用户组
newgrp docker
# 测试docker命令是否可以脱离sudo正常使用
docker version
到这里docker安装完毕。
2.创建docker swarm集群
这里假设有一个主节点,IP为A,一个从节点,IP为B
首先需要开放2375端口来方便portainer进行管理,这里至少需要给从节点配置,主节点不配置似乎也可以正常使用。
sudo cp /lib/systemd/system/docker.service /lib/systemd/system/docker.service.bak
sudo vim /lib/systemd/system/docker.service
# 找到ExecStart行改成这样的: ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
sudo systemctl daemon-reload
sudo systemctl restart docker
2.1.主节点配置
运行如下命令来初始化集群
docker swarm init --advertise-addr A
会得到如下输出
2.2.从节点配置
让其他节点加入swarm集群,这里如果是内网环境的话,只需要执行主节点执行初始化集群之后输出的那一行命令即可,但是这里是使用公网环境的,所以需要指定公网的nodeIP
docker swarm join --token SWMTKN-1-0fgcvcltafdsafdsafdsafdsaed5b4skmash31l2c0jyvus44z-77uyqrafdsafdsad5ia602oyy A:2377 --advertise-addr B:2377
这里参考了公网情况下的docker swarm搭建,更细节的内容可以参考这篇博文,使用公网环境时,需要保证TCP2377,TCP7946,TCP4789与UDP7946和UDP4789被放通。
3.管理程序服务安装
这里我使用了两个服务来对集群进行监控和管理,visualizer和portainer。
3.1.visualizer
用如下命令启动visualizer服务
docker service create --replicas 1 --mount type=bind,target=/var/run/docker.sock,source=/var/run/docker.sock --name visualizer -p 8080:8080 dockersamples/visualizer
然后访问http://A:8080,可以看到各节点部署的容器。
3.2.portainer
接下来是portainer,这是一个更加全面的管理工具,可以对各节点的服务、镜像、容器等进行管理。
利用如下命令启动portainer服务,该服务需要在主节点运行。
docker pull portainer/portainer # 拉取portainer镜像
mkdir portainer_data # 创建数据文件夹
docker run -d -p 8000:8000 -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /home/zekdot/portainer_data:/data portainer/portainer # 启动容器
启动之后访问浏览器http://A:9000,可以看到要求创建一个账户的窗口,输入密码与确认密码后点击下一步
然后这里选择local,直接连接。
然后点击Endpoints那一个条目,再点击Add endpoint来增加对从节点B的管理
选择Docker项,输入B相关信息之后点击Add endpoint。
然后可以看到两个节点都在管理之下了。
到这里基础的管理和运行环境就配置好了。