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
流水理魚 釋出!