安装portainer,比较建议的是,将portainer安装到非应用服务器,这样与应用分隔开来,而且portainer也可以同时管理多个docker节点
安装portainer的过程很简答,可以直接使用docker进行安装。
方式1:命令行运行
docker run -d -p 9000:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock \
--name prtainer-test portainer/portainer
方式2:通过compose-file来启动。
docker-compose.yml
version: '3'
services:
portainer:
image: portainer/portainer
volumes:
- /var/run/docker.sock:/var/run/docker.sock
ports:
- 9000:9000
#使用命令启动portainer
docker-compose up -d
访问portainer是通过 ip + 端口来访问的 。如 10.99.23.10:9000.
进入portainer先设置用户名密码,接着就可以开始连接docker主机了。
管理docker主机分为三种:
- 管理本地docker主机
- 管理远程docker主机
- 管理swarm集群
1.管理本地主机
以node-1为例
访问http://node-1IP:9000 设置账号密码登录
直接点击Connect 按钮,就可以直接管理本地的Docker容器了
2.管理远程主机
在node-1上管理node-2,首先需要开启node-2的2375端口
# 被管理节点
vi /usr/lib/systemd/system/docker.service
#修改为
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
#重启docker
systemctl daemon-reload
systemctl restart docker
node-1portainer管理界面添加endpoint
3.管理swarm集群
要添加swarm集群管理需要在每个节点安装agent,编写yml文件
portainer-agent.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
ports:
- target: 9001
published: 9001
protocol: tcp
mode: host
networks:
- portainer_agent
deploy:
mode: global
placement:
constraints: [node.platform.os == linux]
networks:
portainer_agent:
driver: overlay
compose-file中 定义的 deploy.mode = global表示集群中的每个节点都会部署一个服务,placement表示部署的约束条件。
这里需要注意的是确保每个节点都有portainer-agent镜像,或者每个节点都可以连接Harbor(dockerhub)。同时确保每个节点都存在相同的映射,即按照上面的脚本来讲,确保每个节点都有一个 /var/lib/docker/volumes 路径。我刚才启动agent的服务时,发现只在我执行的节点上启动了agent服务,其他节点发现没有启动agent服务,后面发现,其他节点不存在映射的路径,而且并没有portainer-agent镜像,当把这些解决之后,所有的节点都可以使用了。
实在找不到原因时,可以通过命令查找启动失败的原因。
# 查找服务列表
docker service ls
# 查看服务详细信息
docker service ps pa_agent
同时在portainer-agent.yml文件中有两个参数需要注意:
- port下的mode值为host表示在每一个节点发布端口9001,但是该端口无负载均衡的功能,默认的ingress才有负载均衡功能,可以通过部署一个类似的nginx测试服务来测试,这里附上swarm文档中相关说明port的host模式与ingress模式
- deploy下的mode值为global表示在每一个节点必须有一个任务启动,新增加的swam节点会自动发现并启动服务,而replicated是只保证总的任务数量,并不会强制要求每一个节点的任务数,所以global模式特别适合部署需要在每一个节点运行的应用,比如监控的agent
确保这些之后,就可以启动portainer-agent了。
# docker swarm Leader节点执行
docker stack deploy -c portainer-agent.yml portainer-agent
启动之后可以看每个节点是否都启动了portainer-agent的服务。
接着在portainer的管理页面配置agent的地址。
这里面的端口号是固定的,ip地址只需填写swarm集群的leader节点的IP地址 (如果填写了非leader节点,即使添加上,也无法获取信息,还会报错)。
点击连接,就可以在portainer中管理swarm集群了。
同时点击左侧Swarm菜单会看到当前集群状态和节点列表。
需要注意的是一个 swarm集群只能被一个 portainer 管理,不能被多个portainer管理,如果要更换管理的portainer,则需要先停止portainer-agent 然后再重启,再在新的portainer中配置portainer-agent。
如:原来的 10.0.12.13:9000 管理 A swarm集群。现在想使用10.0.12.14:9000 管理 A swarm集群.
那么首先停止A swarm集群的portainer-agent服务。
# 在集群的Leader节点执行
docker stack rm pa
# 然后重新启动
docker stack deploy -c portainer-agen.yml pa
接着在 10.0.12.14:9000 中配置A swarm集群的地址即可。
此时发现10.0.12.13:9000中已经无法管理A swram集群了
Dashboard中显示集群状态为Down。
portainer中配置了多个swarm集群,如何切换集群呢?
首先点击左侧的Home菜单,然后出现管理的集群列表,选择要管理的集群,接着Home菜单下方就显示了当前管理的集群,同理,当想要切换集群时,也是先要点击Home菜单,选择集群即可。
如果10.0.12.13:9000又需要管理swarm集群了,那么先在10.0.12.14:9000中的Endpoints菜单中删除A swarm集群配置,然后重启A swarm的portainer-agent服务,然后在10.0.12.13:9000中的Endpoints菜单去更新A swarm集群(实际上什么都不需要改,只是点击一个更新按钮),然后点击10.0.12.13:9000的Home菜单(此时集群可能还是显示的时DOWN状态),再点击集群发现已经可以管理了。
最近在初始化集群时(9台节点),发现在部署portainer-agent时,总有3个节点部署处于pending状态,
提示:
host-mode port already in use on 1 node
但是实际上去节点上看并没有占用9001端口,然后去查找资料,只在github上找到了相关说明,但但是没有解决问题,本来想着portanier-agent没有部署也可以,然后就去直接部署应用了,发现只要时在那3个节点的应用,就无法启动,到那三台节点上去看,发现应用容器一直处于 CREATED 状态,没有办法,将3个节点从集群中摘除,然后重启了3个节点的docker服务,接着再次加入集群,发现一切正常了,protainer-agent也正常了(由于上面protainer-agent.yml使用的是global,因此当新节点加入时,会自动部署)。
最近在部署docker-swarm集群时,由于服务器使用的是麒麟系统,且不能关闭防火墙,遇到了几个问题:
1.docker-swarm service 无法连接外部服务器地址
2.docker-swarm service之间无法互相通信(表现形式:unknownHost , connection timeout)
以上问题都通过开放服务器端口,和重启docker服务解决,
需要注意使用Dokcer Swarm 需要开放服务器的2376、 2377 、 2375 、7946 、 4789 端口