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 Agent
Endpoints菜單 》 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 portainer_edge_agent 獲取到的錯誤信息排查, 官方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
流水理魚 發布!