使用Portainer部署Docker容器實踐

湯青松發表於2021-04-10

一、背景

最近在使用rancher2.5.5部署Redis主從複製的時候,發現rancher會產生很多iptables的規則,這些規則導致我們在部署了rancher的機器上無法使用Redis的主從複製功能,因為我對rancher和k8s的瞭解也僅限於瞭解網路架構和使用,對底層並不深入,短期內無法解決這個網路衝突的問題;

因此我將rancher管理docker的模式換成使用protainer的方式,這個portainer相對來說更加輕量級,在搭建過程中也使用了幾個小時學習,現在講整個過程儘量復原給大家一些參考。

二、操作步驟

  1. 安裝Portiner
  2. 管理節點
  3. 部署容器

三、安裝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也是一個初探,更加細節的還需要各位孜孜不倦的進行探索。


關於作者

作者:湯青松

微信:songboy8888

日期:2021-04-10

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章