Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。
Portainer是一款轻量级的Docker图形化管理的方案, 部署Portainer和Portainer Agent来管理Swarm集群很容易!您可以将Portainer作为服务直接部署在Docker集群中。请注意,此方法将自动部署Portainer Server的单个实例,并将Portainer Agent作为全局服务部署到群集中的每个节点上。
前提要求
- 服务器上必须先装有docker, 因为各种版本,所以安装方法查看官方文档。
- 镜像服务使用的是阿里云的容器镜像服务,需要开通此服务。到时的自动构建都会借此服务。
初始化一个集群节点,并设置管理节点为本机的IP
docker swarm init --advertise-addr 192.168.0.150 #这个IP是你本机IP 可以ip -a查看
验证是否swarm是否初始化成功,查看节点是否挂载。
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xbf82bf03t6r7mrvxzxmkv9mm * iZbp12d0p2o2at8bmvb033Z Ready Active Leader 19.03.5
创建一个专有网络
docker network create --driver overlay www_net
创建overlay www_net网络的用处,是给这些docker创建一个内网可相互访问的条件。
比如场景nginx,web,redis三个微应用。需求是nginx与web需要内网相互访问,但是nginx与redis不需要访问的,而web它与redis是需要访问的, 就可以配置nginx: a_net网络, web: a_net,b_net两个网络, redis: b_net网络。这样就可以达到需求了。
第三步:创建Portainer
也可以参照官方部署文档查看其它部署
$ curl -L https://downloads.portainer.io/portainer-agent-stack.yml -o portainer-agent-stack.yml
上述命令会下载一个官方的 swarm 部署yml文件,并修改成配置如下:
version: '3.2'
services:
agent:
image: portainer/agent
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes
networks:
- agent_network
deploy:
mode: global
placement:
constraints: [node.platform.os == linux]
portainer:
image: portainer/portainer
command: -H tcp://tasks.agent:9001 --tlsskipverify
ports:
- "9000:9000"
- "8000:8000" # 只用到web管理界面,此处的8000可以删除。
volumes:
- portainer_data:/data
networks:
- agent_network
- www_net
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
networks:
agent_network:
driver: overlay
attachable: true
www_net:
external: true
volumes:
portainer_data:
上述配置要注意的就是portainer里面有两个网络,有一个是 www_net
的 external: true
意思是使用外部创建的www_net, 如果不设置他会创建当前stack的网络,不设置名称会自动 名称_www_net
。
配置文件准备就绪现在就命令行中部署:
$ docker stack deploy --compose-file=portainer-agent-stack.yml portainer
验证是否部署成功:
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
td1uhbhmsb5f portainer_agent global 1/1 portainer/agent:latest
aeoqcexzg7hu portainer_portainer replicated 1/1 portainer/portainer:latest *:9000->9000/tcp
替换国内镜像
如果 REPLICAS 0/1
时说明还在部署请等待。如果太慢,是因为你没有设置国内镜像。
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://48udk7jr.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
上面的 48udk7jr.mirror.aliyuncs.com 使用的是专属的阿里云镜像,可以在阿里云控制面板里开通镜像服务。
登陆portainer
当部署完成后,就可以访问 http://ip:9000 来访问, 如果是一些云服务器,要先确定是否开放了9000端口
首次登陆他会让你设置密码, 这是登陆后的界面:
注意,后面的自动部署需要使用阿里云的容器镜像服务,而且使用的是私有的镜像,所以要给Portainer注册一个registries。要不然会授权不成功,导致镜像pull失败。 注意:
- registry.cn-hangzhou.aliyuncs.com这个根据访问凭证后面使用的是哪个URL,我的这个是杭州的地域。
- 账号密码,从阿里云的容器镜像服务的访问凭证获取。
之后部署的image镜像他会匹配registry.cn-hangzhou.aliyuncs.com这个前缀。他会自动使用这个注册的授权。
上面的配置相当于我们命令行部署stack是一样的:
sudo docker login --username=用户名 registry.cn-hangzhou.aliyuncs.com
docker stack deploy -c xxx.yml web --with-registry-auth
中后面--with-register-auth的效果是一个原理。
示例图:
到此基础的管理环境搭建结束了。