一、背景
最近在使用rancher2.5.5部署Redis主從複製的時候,發現rancher會產生很多iptables的規則,這些規則導致我們在部署了rancher的機器上無法使用Redis的主從複製功能,因為我對rancher和k8s的了解也僅限於了解網路架構和使用,對底層並不深入,短期內無法解決這個網路衝突的問題;
因此我將rancher管理docker的模式換成使用protainer的方式,這個portainer相對來說更加輕量級,在搭建過程中也使用了幾個小時學習,現在講整個過程盡量複原給大家一些參考。
二、操作步驟
- 安裝Portiner
- 管理節點
- 部署容器
三、安裝Portiner
安裝Portiner的方式有很多種,但我一向喜歡使用最簡單的方法來完成所需要做的事情,因此這裡我將使用docker的方式來搭建它。
3.1 docker部署
docker部署的方式非常簡單,只需要執行簡單的運行容器命令即可,命令如下所示。
docker run -d \
-p 9000:9000 \
-p 8000:8000 \
–restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /opt/docker/portainer-ce/data:/data \
–name portainer-ce portainer/portainer-ce
命令中映射了物理機的8000埠和9000埠到容器中的8000埠以及9000埠,同時將宿主機的docker通信文件/var/run/docker.sock
也映射到了容器中,另外為了持久化部署,還將目錄 /opt/docker/portainer-ce/data
映射到了容器的/data
目錄下,命令執行完成之後,返回結果資訊如下圖所示
在上圖中可以看到已經成功運行了一個docker容器,接下來我需要驗證服務是否正常運行,使用瀏覽器訪問URLhttp://127.0.0.1:9000/
地址,結果如下所示
在上圖中可以看到Portainer系統已經能夠訪問, 說明成功系統安裝成功了。
3.2 節點初始化
現在我需要設置管理員的賬號密碼,這裡我簡單填寫密碼和確認密碼之後,點擊Create user
按鈕即可創建管理員帳戶。
管理員帳戶設置完成之後,需要進行初始化,如下圖所示
在上圖中有三個選項,我選擇使用Portainer管理本地docker 程式,點擊Connect
按鈕,即可完成初始化操作。
3.3 功能初探
完成初始化操作之後,就可以進入Portainer的工作介面,如下圖所示
在上圖找那個可以看到Portainer系統中已經有一個local
的本地節點,我們可以點擊它進入節點的管理,如下圖所示
在上圖中可以看到Portainer系統列出了local
節點的 Stack、容器資訊、鏡像資訊、磁碟資訊、網路資訊等等,這裡我隨意點擊Containers
區塊,就可以看到容器列表,如下圖所示
在上圖中可以看到容器列表中存在兩個容器,以及容器的運行狀態,也可以對這些容器進行控制。
四、管理節點
現在已經對本地docker可以進行控制,但是我並不滿足於此,我需要對其他機器也進行控制。
4.1 開始添加節點
在Portainer系統中,有一個endpoints
的菜單,在這個菜單當中可以添加多個節點,如下圖所示
在上圖中可以看到,已經有一個local
的節點,在列表上方有一個Add endpoint
按鈕,點擊按鈕后就可以來到添加節點的詳情頁,如下圖所示
在上圖中可以看到有5個選項,這裡我選擇最簡單的一種方式,使用Docker API
進行控制。
4.2 開放API控制
這種方法需要在節點的docker啟動 程式中添加參數,因此我需要先登錄到節點 伺服器中去,ssh登登錄 伺服器的命令如下所示
ssh root@xxx.xxx.xxx.xxx
命令執行完畢之後,返回如下圖所示
在上圖中可以看到已經進入節點所在的 伺服器,接著需要編輯docker啟動的配置文件,命令如下所示
vim /usr/lib/systemd/system/docker.service
命令執行之後,就可以在vim編輯介面修改配置,如下圖所示
將開啟遠程訪問程式碼加入到docker的啟動命令行中,程式碼如下所示
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
將程式碼複製到 /usr/bin/dockerd
程式後面,如下圖所示
保存配置文件之後,需要重啟docker服務,重啟docker的命令如下所示
systemctl daemon-reload && systemctl restart docker
重啟docker之後,一切正常的話就完成了
4.3 驗證埠狀態
查看docker的配置資訊,命令如下所示
docker info
命令執行之後,返回的資訊如下圖所示
在上圖中可以看到docker給了一個warning的警告提示,告知我開啟遠程訪問會存在安全風險,這裡暫時不理會它,不過出現這個提示說明確實是開啟了遠程訪問的功能
另外可以查看通過開放埠,來驗證開啟是否成功,命令如下所示
netstat -ntl
命令執行完畢之後,會返回當前主機的埠開放情況,如下圖所示
在上圖中可以看到2375
埠已經被開啟成功, 說明節點本身開啟docker是OK了;
但是Portainer通過ip訪問此節點的時候,要考慮網路中的防火牆是否會阻擋此埠,這裡可以使用nmap
工具來探測節點的埠是否可以被訪問,現在我回到Portainer系統的命令終端,並使用nmap工具進行探測,命令如下所示
nmap -p 2375 xxx.xxx.xxx.xxx
命令執行之後,會返回2375是否處於開啟的情況,執行結果如下圖所示
在上圖中可以看到節點的2375
埠是開啟的,並且可以進行連接。
4.4 完成添加節點
接下來回到瀏覽器窗口,如下圖所示
在上圖所示的網頁中,將節點的IP地址和埠通過URL形式填寫進去,然後點擊Add endpodint
按鈕,即可將節點增加進去,添加成功會有相應的提示,如下圖所示
在上圖中可以看到Portainer系統提示添加節點已經成功,並且節點列表可以看到此節點了。
五、部署容器
添加節點完成之後,我準備在遠程節點中部署我的容器;
5.1 部署單個容器
回到Portainer主頁,在主頁可以看到剛才添加的節點資訊,如下圖所示
在上圖中選擇剛才添加的節點,然後進入容器菜單選項,可以看到此節點的容器列表,,如下圖所示
在上圖所示頁面的列表上方有一個Add container
按鈕,點擊此按鈕后就會調整到添加容器詳情頁
在上圖所示的頁面中,需要將docker鏡像地址填寫進去,這裡我隨意選舉了一個nginx鏡像,並且將主機的8888埠映射到了容器的80埠,提交這些資訊之後,Portainer系統會告知你容器運行是否成功,如下圖所示
在上圖中可以看到容器已經運行成功,並且跳轉到了容器列表中,接下來我們可以訪問此節點對應的8888埠,來驗證服務是否可用.
打開瀏覽器,然後在地址欄中填入URLhttp://xxx.xxx.xxx.xxx:8888/
,訪問之後返回的結果如下圖所示
在上圖中可以看到nginx
服務已經成功運行了;
5.2 部署 docker-compose
除了在容器列表頁部署容器之外,Portainer系統還支持使用docker-compose的方式進行部署,在Portainer系統中叫做stacks
,在菜單欄中選擇此項,可以進入docker-compose服務的列表,如下圖所示
在列表的上方有一個Add stack
按鈕,點擊此按鈕,就可以添加docker-compose
服務,如下圖所示
在上圖所示的頁面中,會要求我填寫docker-compose的資訊,這裡我準備了一個Redis服務的docker-compose
的配置,配置程式碼如下所示
version: ‘3.5’
services:
redis:
image: “redis:latest”
container_name: redis_test
command: redis-server
ports:
– “16379:16379”
降配置填到頁面的后,進行提交Portainer就會在對應節點部署剛才的docker-compose
服務,如下圖所示
部署成功之後,可以在stacks列表中看到剛才部署的服務,你還可以點擊列表中的服務名稱,進入詳情頁進行查看和修改,如下圖所示
在上圖中可以看到此服務具體運行了什麼容器,也可以終止或刪除該容器。
本文對Portainer也是一個初探,更加細節的還需要各位孜孜不倦的進行探索。