本文章內容係以參考技術文件為基礎,經由人工智慧(AI)技術進行改寫及重整,旨在提供讀者更清晰易懂之內容呈現。如有任何技術細節上的疑義或需進一步確認,建議讀者參考原始技術文件或與相關技術人員聯繫。
嘿!各位夥伴,不論你是第一線衝鋒陷陣的 AE 和業務,還是對 Advantech 技術充滿好奇的潛在客戶,今天我們要來聊一個讓軟體部署變得像「打包行李」一樣簡單的技術——Docker!
在瞬息萬變的工業物聯網世界裡,我們的硬體平台越來越多元,從邊緣裝置到工業電腦,規格各異。要在這些不同的設備上穩定、快速地部署各種應用程式(尤其是越來越複雜的 AI 應用),常常是個令人頭痛的挑戰。傳統的部署方式可能需要針對每個設備環境進行繁瑣的設定和相依性安裝,耗時又容易出錯。
這時候,Docker 就像一位救星登場了!你可以把 Docker 想像成一個標準化的「貨櫃」。每個貨櫃裡都裝載著應用程式運行所需的一切:程式碼、函式庫、系統工具、設定檔等等。這個貨櫃是獨立且隔離的,無論你在哪裡打開它,裡面的東西都長得一模一樣,運行環境也完全相同。這意味著「在我的機器上可以跑」這句話,終於可以在不同設備上實現了!
Advantech 的工程師們也看到了 Docker 在簡化部署、提高效率方面的巨大潛力。為了驗證這項技術在我們的硬體平台上的可行性與優勢,我們進行了一系列的實驗。接下來,就讓我們一起看看這個「Docker 初體驗」的精彩過程吧!
實驗大解密:一步步打造你的 Docker 環境 #
這次實驗的目標很明確:在 Advantech 的硬體平台上,從零開始搭建一個 Docker 環境,並嘗試運行一個包含多個套件的應用程式,最後將這個環境打包,方便未來快速部署。
第一步:準備基礎環境
首先,我們需要一個最基本的作業系統作為 Docker 容器的基底。想像一下,這就像是為你的貨櫃準備一個最乾淨的地板。我們選擇了廣泛使用的 Ubuntu 22.04 版本。
$ docker pull ubuntu:22.04
這條指令就是告訴 Docker 去下載 Ubuntu 22.04 的映像檔(Image),它是創建容器的模板。
接著,我們啟動一個基於這個映像檔的容器。
$ docker run -it --privileged=true --net=host ubuntu:22.04
這條指令有點長,我們簡單解釋一下:
docker run: 啟動一個新的容器。-it: 讓你能夠以互動模式進入容器的終端機。--privileged=true: 給予容器較高的權限,方便進行一些系統層級的操作(實驗階段常用)。--net=host: 讓容器直接使用主機的網路,而不是獨立的網路空間,這在某些需要直接存取主機網路資源的場景下很有用。ubuntu:22.04: 指定使用哪個映像檔來啟動容器。
有時候,我們可能需要將主機上的某些資料夾掛載到容器中,方便資料交換。這時候會加上 -v 參數:
$ docker run -it --privileged=true --net=host -v /run/media/root-mmcblk2p2:/mnt -e TARGET_DIR=/mnt ubuntu:22.04
這裡的 -v /run/media/root-mmcblk2p2:/mnt 就是將主機上的 /run/media/root-mmcblk2p2 路徑掛載到容器內的 /mnt 路徑。-e TARGET_DIR=/mnt 則是設定一個環境變數。
第二步:優化儲存空間
在嵌入式或工業電腦上,儲存空間的管理很重要。Docker 預設會將容器和映像檔的資料存放在 /var/lib/docker。如果我們想把這些資料存放到更大的磁碟分割區(例如 SD 卡上的 /dev/mmcblk2p2),就需要移動 Docker 的資料根目錄。
首先,停止 Docker 服務:
sudo systemctl stop docker
然後,將現有的 Docker 資料移動到新的位置:
sudo mv /var/lib/docker /run/media/root-mmcblk2p2/docker
接著,修改 Docker 的設定檔,告訴它新的資料位置:
sudo nano /etc/docker/daemon.json
在打開的檔案中,加入或修改以下內容:
{
"data-root": "/run/media/root-mmcblk2p2/docker"
}
設定好新的路徑後,確保 Docker 服務有權限存取這個資料夾:
sudo chown -R root:docker /run/media/root-mmcblk2p2/docker
完成這些步驟後,就可以重新啟動 Docker 服務了。如果之前有啟動的容器,可以使用以下指令重新啟動並進入:
docker start <my_container_id>
docker attach <my_container_id>
(<my_container_id> 是你容器的唯一識別碼,可以用 docker ps -a 查看)
第三步:在容器內安裝所需套件
進入容器後,這個環境就像一個全新的 Ubuntu 系統。我們可以像在一般 Linux 上一樣安裝軟體。
先更新套件列表:
apt-get update
然後安裝一些常用的工具和開發套件:
apt-get install vim git build-essential checkinstall cifs-utils nfs-common software-properties-common strace wget unzip
為了運行特定的應用程式(例如涉及影像處理和 AI 的應用),我們還需要安裝更多函式庫和 Python 套件。
再次更新套件列表(確保能安裝最新版本的套件):
apt-get update
安裝編譯工具、開發函式庫以及 Python 相關套件:
apt update && sudo apt install -y build-essential cmake python3-dev libboost-all-dev libopenblas-dev liblapack-dev libx11-dev xvfb && pip install opencv-python dlib face_recognition numpy python-vlc
這裡我們一次安裝了許多東西,包括編譯程式碼所需的 build-essential 和 cmake,數學運算函式庫 libopenblas-dev, liblapack-dev,以及與圖形顯示相關的 libx11-dev, xvfb。後面的 pip install 則是安裝 Python 的影像處理 (opencv-python)、人臉辨識 (dlib, face_recognition)、數值計算 (numpy) 和影音播放 (python-vlc) 等套件。
如果只需要安裝 Python 套件,可以使用這條指令:
pip install opencv-python dlib face_recognition numpy python-vlc
第四步:準備與測試應用程式
有些應用程式需要圖形介面或顯示輸出,這時候需要設定 DISPLAY 環境變數,讓容器知道要把畫面顯示到哪裡:
export DISPLAY=:0
接著,我們將應用程式的程式碼(例如一個 Python 腳本 play_video_ai.py)複製到容器中。
先暫時退出容器(輸入 exit),回到主機的終端機。使用 docker ps -a 查看容器 ID。
exit
docker ps -a
然後使用 docker cp 指令將主機上的檔案複製到容器內:
docker cp <your_file> <my_container_id>:/home/
(將 <your_file> 替換成你要複製的檔案路徑,<my_container_id> 替換成你的容器 ID)
複製完成後,再次進入容器:
docker start <my_container_id>
docker attach <my_container_id>
現在,我們就可以在容器內運行應用程式進行測試了!
cd ~/video_test/
python3 ./play_video_ai.py
如果一切順利,你應該會看到應用程式的運行結果,例如播放影片或進行影像分析。
這張圖片就是應用程式成功運行的證明!它顯示了在 Docker 容器內,我們成功地運行了一個涉及影像處理的 Python 應用。
成果與應用:打包你的專屬應用貨櫃 #
實驗成功地在 Docker 容器內搭建了複雜的應用環境並順利運行。這證明了 Docker 在 Advantech 硬體上的良好相容性與實用性。但 Docker 的最大優勢在於「可攜性」和「易於部署」。我們已經在一個容器裡把所有需要的東西都設定好了,接下來就是要把這個「黃金環境」打包起來,方便在其他設備上直接使用。
打包成映像檔 (Image)
我們可以將當前這個已經設定好、安裝好套件並經過測試的容器狀態,儲存成一個新的映像檔。想像一下,這就像是把你的貨櫃內容物完全複製一份,做成一個新的模板。
docker commit youthful_hoover my-container-image
(youthful_hoover 是你的容器名稱或 ID,my-container-image 是你為新映像檔取的名字)
儲存與分享映像檔
這個新的映像檔包含了我們所有的設定和套件。我們可以將它儲存成一個單一的檔案,方便傳輸和分享。
docker save -o my-docker-image.tar my-docker-image
這條指令會將 my-container-image 這個映像檔儲存為一個名為 my-docker-image.tar 的壓縮檔案。
現在,這個 .tar 檔案就是你的應用程式「貨櫃」了!你可以透過各種方式將它傳輸到其他 Advantech 設備上:
- 使用 USB 或其他儲存裝置:
cp my-docker-image.tar user@target-machine:/path/to/destination - 使用網路傳輸 (例如 SCP):
scp my-docker-image.tar user@172.22.16.137:/home/
在目標設備上部署
在目標設備上,只需要簡單幾個步驟,就能還原並運行這個應用環境。
首先,載入這個映像檔:
docker load -i /path/to/destination/my-docker-image.tar
載入成功後,你就可以在 Docker 映像檔列表中看到它了:
docker images
最後,從這個映像檔啟動一個新的容器:
docker run -d --name my-container my-docker-image
-d: 讓容器在背景運行。--name my-container: 為這個容器指定一個好記的名字。
你可以使用 docker ps -a 來確認容器是否正在運行。
docker ps -a
瞧!你的應用程式環境就這樣輕鬆地在另一台設備上部署完成了!
結論與未來展望 #
這次 Docker 初體驗實驗,成功地展示了如何利用 Docker 在 Advantech 硬體平台上建立、配置、運行複雜應用,並將其打包以便快速複製部署。這項技術對於簡化工業物聯網和邊緣運算的軟體生命週期管理具有重要意義。
透過 Docker,我們可以:
- 確保環境一致性: 避免「在我的機器上可以跑,到你的機器就不行」的問題。
- 加速部署: 一次打包,隨處運行,大大縮短現場部署和更新的時間。
- 提高效率: 標準化的流程減少了手動配置和除錯的工作量。
- 增強隔離性: 不同應用程式在各自的容器中運行,互不干擾,提高了系統穩定性。
Advantech 始終致力於探索和整合最新的技術,為客戶提供更優質、更便捷的解決方案。這次 Docker 的成功實驗,只是我們在容器化技術領域持續投入研發的一個縮影。未來,我們將繼續深入研究 Docker 及其他容器化技術,目標是提供更多預先配置好的 Docker 映像檔,涵蓋各種常見的工業應用和 AI 推理框架,讓客戶能夠更輕鬆地在 Advantech 平台上開發和部署他們的創新應用。
敬請期待 Advantech 在容器化技術領域帶來更多令人興奮的進展!