目前我的几个vps都改成了纯docker环境,为了管理方便,用上了Portainer,因为都在不同的地方,所以没办法组成集群来使用,所以只能依赖Portainer的Edge Agent边缘代理来进行管理。不过好在挺方便的,就是官方文档有点坑,这里把踩过的坑记录一下。
版本情况
traefik:v2.8.1
portainer: v2.14.1
Portainer的官方traefik配置文档地址:https://docs.portainer.io/advanced/reverse-proxy/traefik
我的基本跟官方差不多,略有修改
version: "3.3"
services:
portainer:
image: portainer/portainer-ce:latest
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
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
注意,这里我并没有开放宿主机的8000端口供边缘代理通过websocket访问,而是用traefik的443提供,所以后面会有一些需要手动执行的部分。
一般来说,Portainer创建Edge Agent以后会给你一串类似下面的命令,用于在边缘主机上执行
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/lib/volumes:/var/lib/docker/volumes \
-v /:/host \
-v portainer_agent_data:/data \
--restart always \
-e EDGE=1 \
-e EDGE_ID=46cef205-1476-451b-9a29-748b8f3aa8e3 \
-e EDGE_KEY=aHR0cHM6Ly9wdC5tb29pbS5jb218cHQubW9vaW0uY29tOjgwMDB8ZDc6ZjE6NjY6ZDQ6MzQ6NTk6NGM6YWY6YWQ6ZjM6ZmE6ZWY6MTI6M2Y6YzM6OTV8OA \
-e EDGE_INSECURE_POLL=1 \
--name portainer_edge_agent \
portainer/agent:2.14.1
首先要注意-v /var/lib/volumes:/var/lib/docker/volumes这里,如果你修改过docker的路径,那么要改为对应的,其次就是
EDGE_KEY=aHR0cHM6Ly9wdC5tb29pbS5jb218cHQubW9vaW0uY29tOjgwMDB8ZDc6ZjE6NjY6ZDQ6MzQ6NTk6NGM6YWY6YWQ6ZjM6ZmE6ZWY6MTI6M2Y6YzM6OTV8OA
这里需要修改,EDGE_KEY经过base64解码以后得到的应该是类似这样的东西
https://pt.mooim.com|pt.mooim.com:8000|d7:f1:66:d4:34:59:4c:af:ad:f3:fa:ef:12:3f:c3:95|8
这时候需要将内容改为
https://pt.mooim.com|https://edge.mooim.com|d7:f1:66:d4:34:59:4c:af:ad:f3:fa:ef:12:3f:c3:95|8
然后在base64编码并去掉最后的等号=,得到一个base64编码再覆盖回原来的命令,然后去其他的机器上执行就可以了。
这样一来,就不用在Portainer宿主机上开放8000端口,而且websocket走的也是经过tsl加密的wss协议,安全性更有保障了。
最后,来张效果图
PS:吐槽一下,Portainer只能支持单一docker-compose.yml文件部署,但凡带了映射文件的都不能用,希望后续版本可以改进