IP | HOSTNAME |
---|---|
192.168.0.101 | node1 |
192.168.0.102 | node2 |
192.168.0.103 | node3 |
192.168.0.104 | node4 |
192.168.0.105 | node5 |
1.修改hosts
[root@localhost ~]# vi /etc/hosts
# 将上面对应的IP地址对应写入
# 每台服务器都需要
192.168.0.101 node1
192.168.0.102 node2
192.168.0.103 node3
192.168.0.104 node4
192.168.0.105 node5
然后通过scp
命令将hosts
文件拷贝到另外几台服务器,如果不嫌麻烦也可以一个一个手动修改。
2.然后对应IP修改hostname
比如在192.168.0.101的服务器中输入以下命令,需要在所有服务器中修改对应的hostname
,为了后期方便管理。
[root@localhost ~]# hostnamectl set-hostname node1
curl -sSL https://get.daocloud.io/docker | sh
卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装依赖
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
安装docker
sudo yum install docker-ce docker-ce-cli containerd.io
如果提示您接受 GPG 密钥,请选是。
安装完默认并没有启动,需要手动通过service或systemctl启动。
记得安装完后,使用docker -v
命令查看版本,尽量确保这几台服务器的docker版本
相同,虽然不同也可以构建swarm
集群。
yum -y install epel-release
yum -y install python3
pip3 install --upgrade pip
pip3 install docker-compose
在当前node1
节点(作为manager
节点)运行以下命令
docker swarm init --advertise-addr 192.168.0.101
它会在控制台显示下面类似下面这段文字:
Swarm initialized: current node (wmqsnwnwv4jcvjt1tmq47zzkp) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-8d9aum4b9egagaymoe8r3kmo23hx0y6nwmdt3b9kmxpfcn7vmu-btou5dm6kn8rb33euaoz4605w 192.168.0.101:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions
意思是让你在其他主机运行上面那段docker swarm join --token SWMTKN-1-8d9aum4b9egagaymoe8r3kmo23hx0y6nwmdt3b9kmxpfcn7vmu-btou5dm6kn8rb33euaoz4605w 192.168.0.101:2377
,就可以添加为worker
节点。
注意:上面给了5台服务器做测试。3个worker,2个manager,自由组合,你也可以只用3台做测试。
在manager
节点运行docker swarm join-token manager
或docker swarm join-token worker
,控制台会显示类似之前那段文字,所以不需要去记录token
,如果忘记,输入一遍这2条命令中的其中一条即可,第一条命令会显示添加为manager
节点的命令及token
,第二条命令为worker
节点的命令及token
。
docker文档
注意,集群管理的命令只能在manager
节点中运行(除了docker info
这种命令)。
docker info
# 或下面这条命令
# docker node inspect
# 其实inspect的信息在docker info中就能看见。
docker nodes ls
节点ID通过 docker nodes ls
查看
docker node rm 节点ID或hostname
节点ID通过 docker nodes ls
查看
docker node update –-availability active 节点ID或hostname # 更新节点状态 (active 激活|pause 暂停|drain 排除自身work任务)
docker node update ––label-add 标签名 节点ID或hostname # 更新节点标签名
docker node update ––label-rm 节点ID或hostname # 删除节点标签名,如果有
docker node update ––role manager 节点ID或hostname # 更新为manager节点
将node3
节点变为manager
节点
docker promote node3
将node2
节点变为worker
节点
docker demote node2
有更高需求可以替换为Harbor
注意,我们是永久开启,并不是临时开启。(集群内所有服务器都要开启)
文件路径:/etc/sysctl.conf
,它的内容全部是对应于/proc/sys/这个目录的子目录及文件。
vi /etc/sysctl.conf
# 写入一下内容
net.ipv4.ip_forward = 1
然后执行sysctl -p
,加载刚才修改的配置文件。
临时开启
方法:
sysctl -w net.ipv4.ip_forward=1
或
echo 1 > /proc/sys/net/ipv4/ip_forward
registry
镜像mkdir /opt/data/registry # 为了将容器内的volume映射出来。
docker pull registry:2
# 1版本是python写的,2版本是GO语言。
docker run -d -p 5000:5000 --restart always -v /opt/data/registry/:/var/lib/registry/ --name private_registry registry:2
curl 私仓节点ip:5000/v2/_catalog
使用
--insecure-registry
的原因是,我们搭建的是http
的,并没有弄https
,所以需要使用insecure
vi /usr/lib/systemd/system/docker.service
# 在ExecStart 最后面增加一个Option,--insecure-registry 私仓ip:端口
ExecStart = /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.0.101:5000
,然后需要重启docker服务。
第二种方式
在/etc/docker/daemon.json
加入insecure-registries
配置
"iinsecure-registries":["192.168.0.101:5000"]
打标签
打标签的原因是要在
push
的时候让docker
知道私仓地址及端口
。
docker tag httpd:latest 192.168.0.101:5000/httpd
push到私仓
docker push 192.168.0.101:5000/httpd
docker pull dockersamples/visualizer # 拉取visualizer镜像
docker tag dockersamples/visualizer:latest 192.168.0.101:5000/visualizer # 打个标签
docker push 192.168.0.101:5000/visualizer # 传到私仓
version: "3"
services:
visualizer:
image: 192.168.0.101:5000/visualizer
ports:
- "9001:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager] # 约束条件为部署在manager节点
portainer:
image: portainer/portainer
ports:
- "9000:9000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
使用docker stack
部署
docker stack deploy -c docker-compose.yml visual_manager
docker stack services visual_manager
使用
docker network
命令可以创建你自己的网络。
docker network ls # 列出所有网络
docker network create --driver overlay my_network # 创建一个overlay网络 名为my_network