前端时间一直在研究docker相关技术,想把他用在我最近的项目上,最开始想使用的kubernates,但是不知道为什么一直下载不下来相关镜像,科学上网都没用,于是转战docker swarm,并且在学校的四个免费的2C4G服务器上搭建了一个实验性质的集群,最近打算把这个实验性质的集群转移到生产环境中,并将其中的一些过程记录下来。
简单说下我目前用这种方式之后的好处吧
目前只想到了以上三个优势吧,不过我觉得已经很足够了。
本文所有节点的操作系统均为Ubuntu 18.04
首先需要在各台机器上都安装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安装完毕。
这里假设有一个主节点,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
运行如下命令来初始化集群
docker swarm init --advertise-addr A
会得到如下输出
让其他节点加入swarm集群,这里如果是内网环境的话,只需要执行主节点执行初始化集群之后输出的那一行命令即可,但是这里是使用公网环境的,所以需要指定公网的nodeIP
docker swarm join --token SWMTKN-1-0fgcvcltafdsafdsafdsafdsaed5b4skmash31l2c0jyvus44z-77uyqrafdsafdsad5ia602oyy A:2377 --advertise-addr B:2377
这里参考了公网情况下的docker swarm搭建,更细节的内容可以参考这篇博文,使用公网环境时,需要保证TCP2377,TCP7946,TCP4789与UDP7946和UDP4789被放通。
这里我使用了两个服务来对集群进行监控和管理,visualizer和portainer。
用如下命令启动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,可以看到各节点部署的容器。
接下来是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。
然后可以看到两个节点都在管理之下了。
到这里基础的管理和运行环境就配置好了。