上一篇日记Traefik及Portainer边缘代理的配置写到使用Portainer的Edge Agent来管理在其他地方的VPS,后来又研究了一下,实际上Edge Agent边缘代理实际上主要是为没有公网ip,但具有互联网访问能力的节点而设计的,如果主机节点都有公网IP,可以被访问的话,那么实际上直接使用Agent即可。
Portainer官方提供一个免费的5节点商业版,https://www.portainer.io/pricing/take5,填个表就行,没啥验证,几分钟就能收到License。
根据文档描述,我们需要对Portainer设置一个环境变量AGENT_SECRET,作为和Agent通讯加密的密钥。基于此,Portainer的docker-compose编排文件如下
version: "3.3"
services:
portainer:
image: portainer/portainer-ee:2.14.2-alpine
container_name: portainer
command: -H unix:///var/run/docker.sock
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer:/data
networks:
- work-net
environment:
- AGENT_SECRET=12345678
labels:
# Frontend
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`pt.mooim.com`)"
- "traefik.http.routers.frontend.entrypoints=websecure"
- "traefik.http.services.frontend.loadbalancer.server.port=9000"
- "traefik.http.routers.frontend.service=frontend"
- "traefik.http.routers.frontend.tls=true"
- "traefik.http.routers.frontend.tls.certresolver=dnspod"
# Edge
- "traefik.http.routers.edge.rule=Host(`edge.mooim.com`)"
- "traefik.http.routers.edge.entrypoints=websecure"
- "traefik.http.services.edge.loadbalancer.server.port=8000"
- "traefik.http.routers.edge.service=edge"
- "traefik.http.routers.edge.tls=true"
- "traefik.http.routers.edge.tls.certresolver=dnspod"
networks:
work-net:
external: true
volumes:
portainer:
name: portainer
与之对应的Agent启动命令也要加上密钥
docker run -d -p 9001:9001 \
--name portainer_agent \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/lib/docker/volumes:/var/lib/docker/volumes \
-v /:/host \
-e AGENT_SECRET=12345678 \
portainer/agent:2.14.2-alpine
这里就直接开放9001端口了,如果走traefik的话,还要挨个配置域名太麻烦,我就直接用ip:9001,比较方便。
然后Add environment的时候选择Docker
最后点击Connect即可
一点说明:
为什么不用Edge Agent了?因为很慢,它依赖websocket的轮询,所以每次想用的时候可能要等很久,而普通的Agent就是简单的http连接,要用的时候就发请求,获取信息,不用的时候不发请求。