1. 单机运行的Docker
容器化部署是现在进行时,开源应用大多数支持容器化部署在少量机器的场景下往往采用docker cli 和 docker-compose管理,进行“单机式管理”机器稍多点会采用Docker Swarm群集的方式,毕竟k8s稍重如果有更多的机器情况下一般会采用k8s的方式在个人、创业公司、小团队的场景下我们往往在多个云、家里、vps上拥有少量虚拟机服务器,这些服务器上都运行了docker实例虽然我们也可以用公网vpn、zerotier等方式打通各个地域的机器形成一个内网,从而构建“群集”,但实际情况是没那么多带宽,从而无法“负载均衡”,所以实际的实际还是独立使用受限制于公网带宽很小,只能独立使用我们也拥有一些4G移动流量接入这种EDGE边缘场景的情况,这些IoT上也运行着Docker实例那么这些NAT内网环境下的Docker实例,公网IP环境下的Docker实例,是否能集中管理?当然可以,用Portainer就挺方便
2. 用Portainer作为Docker实例管理平台实战步骤
2.1 主节点-Portainer server主控安装
选一个7x24小时且有公网IP的节点运行Portainer server主控
docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v /data/appdata/portainer:/data portainer/portainer
9000端口为web管理界面端口8000端口为Agent接入端口这2个端口公网IP防火墙都必须放行
浏览器打开web管理界面http://Portainer server主控公网IP:9000
初次访问设置一个密码,设置密码后需要选择连接docker的方式选第一个Local 然后点击Connect默认进入Home菜单,点击这个Local本地docker实例进入其他管理
2.2 配置https nginx代理(可选)
如果不配置https可跳过本节http://你的公网IP:9000 默认没有https不安全规划一个域名用于https访问例如https://portainer.iamle.com用nginx作为接入反向代理到 http://portainerip:9000下面为示例nginx portainer配置(其中包含需要的websocket proxy)
# portainer.iamle.com.conf
map $http_upgrade $connection_upgrade {
default Upgrade;
'' close;
}
upstream portainer {
server 127.0.0.1:9000;
}
server {
listen 80;
server_name portainer.iamle.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name portainer.iamle.com;
ssl_certificate ssl/iamle.com.cer;
ssl_certificate_key ssl/iamle.com.key;
#ssl_session_cache shared:SSL:10m;
#ssl_session_timeout 10m;
#ssl_session_tickets off;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5:!EXPORT56:!EXP;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Request-Id $request_id;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 60m;
proxy_send_timeout 60m;
proxy_http_version 1.1;
proxy_pass http://portainer;
break;
}
error_log /data/logs/portainer.iamle.com-error.log;
access_log /data/logs/portainer.iamle.com.log access;
}
2.3 主节点-配置一个在NAT内网Agent客户端
前面我们已经配置好一个具有公网IP的Portainer管理控制节点那么现在把内网(NAT、IoT)、公有云、vps等运行的Docker实例来接入控制节点管理
一图胜千言,官方介绍图图中这个Portainer管理了2个内网的Agent其中一个是个Swarm群集,另外一个是个单机
Portainer server上增加一个Edge AgentEndpoints菜单 》 Add endpoint 》 Edge Agent
Name:为自定义Portainer server URL:默认为当前Portainer server ip (如果用nginx配置了https可以使用https不加端口号)》 Add endpoint
增加端点后出现
部署客户端agent 有2种选择 Standalone 和 Swarm如果已经组过Swarm那么选Swarm,默认就是Standalone先点击 “Copy command” 复制命令,在Agent客户端去执行Public IP: 如果有可以设置,这样在以后部署了docker容器暴露的端口可以自动生成url
2.4 被管理节点-需要被管理的Docker实例客户端机
在被管理的客户端终端上执行(内网(NAT、IOT)、公网环境都可以,只要能连接上我们的Portainer server)本例内网1台ip为 192.168.0.8的机器
docker run -d -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker/volumes:/var/lib/docker/volumes -v /:/host --restart always -e EDGE=1 -e EDGE_ID=6ad0f1ff-6fea-4710-97e2-513ef1066fd8 -e CAP_HOST_MANAGEMENT=1 -p 8000:80 -v portainer_agent_data:/data --name portainer_edge_agent portainer/agent:1.5.1
访问 http://192.168.0.8:8000(如果有公网ip用公网ip)打开后会有个输入框输入上一步获得的Join token点击Submit 出现 Agent setup OK. You can close this page. 代表完成agent接入
回到 Portainer server管理界面等待上线
点击 iamle-lan-01 等待几秒钟
这样我们就可以管理多个docker实例了
3. 贴士
- 如果agent运行不起来,无限重启
需要根据docker logs portaineredgeagent 获取到的错误信息排查, 官方github issue是个好去处
另外发现2019年10月19日16:55:01 pull 下来的portainer/agent:latest 也运行不起来 改为 portainer/agent:1.5.1正常 - Stacks粘贴docker-compose.yml进来后一直报version版本不对
目前只支持version 2 改为2即可
4. 参考
Portainer Edge Agent 官方发布Portainer内网边缘节点配置说明书PDF
流水理鱼 发布!