以下是這支 docker run
指令中各參數的詳細說明,以助你理解每個選項的用途和效果。
參數 | 說明 |
---|
xhost +local:docker | 允許本地使用者 docker (本地 UNIX domain)存取 X11 伺服器,以便容器內的 GUI(如 Gazebo、RViz)能顯示到本機螢幕。 |
docker run | 啟動並執行一個新的容器。 |
-it | 結合 -i (保持標準輸入開啟)與 -t (分配虛擬終端機),使你可以在容器中進行互動式操作。 |
-d | 以「背景模式」(detached)執行容器,命令執行後立即回到主機終端。 |
--name ros2dev | 為容器指定名稱 ros2dev ,方便後續透過名稱管理(如 docker stop ros2dev 、docker logs ros2dev )。 |
--restart=always | 容器異常退出或 Docker 重啟後,自動重啟此容器,確保長期穩定運行。 |
--gpus all | 將主機上所有 GPU 都分配給此容器,允許容器內做 GPU 加速運算(需 Docker 19.03+ 與 NVIDIA Container Toolkit)。 |
--net=host | 使用 主機網路模式,容器與主機共用網路堆疊,無 NAT,延遲更低,適合 ROS2 DDS 多播與網路通訊。 |
--privileged | 賦予容器幾乎等同於主機的「特權」權限,才能存取低階裝置、修改網路設定等(如使用 --device 時通常搭配)。 |
--env DISPLAY=$DISPLAY | 將主機的 DISPLAY 環境變數傳入容器,告訴容器 GUI 應該輸出到哪個 X11 顯示伺服器。 |
--env QT_X11_NO_MITSHM=1 | 解決 Qt 應用(如 RViz)在 X11 上使用共享記憶體時可能的顯示錯誤。 |
--volume /tmp/.X11-unix:/tmp/.X11-unix:rw | 將主機的 X11 socket(Unix domain)掛載到容器,使容器內程式能透過該 Socket 與 X 伺服器溝通,rw 表示可讀寫。 |
--volume $(pwd)/ros2_data:/home/ubuntu/data | 將當前工作目錄下的 ros2_data 資料夾映射到容器內 /home/ubuntu/data ,用於持久化地圖、日誌或其他資料。 |
--device /dev/ttyACM0:/dev/ttyACM0 | 將主機的 USB 裝置(例如 Arduino、micro:bit 之類的 Serial 裝置)映射進容器,供容器內驅動程式或節點存取。 |
--device /dev/ttyUSB0:/dev/ttyUSB0 | 類似上條,映射另一個 USB Serial 設備(如 IMU、LiDAR 透過 USB 連線)。 |
ros2_humble_gz_rviz_gpu/20250704 | 要執行的 Docker 映像名稱及 Tag(版本標記),通常會標示 ROS 版本、包含的軟體與建立日期。 |
bash -c "source /opt/ros/humble/setup.bash && bash" | 容器啟動後執行的命令:先 source ROS 2 環境設定,然後開啟一個互動式 bash,讓你馬上能夠使用 ROS2 指令。 |
💡 小技巧
-
顯示 GUI:需先在主機執行 xhost +local:docker
,並將 /tmp/.X11-unix
與 DISPLAY
傳入容器。
-
持久化資料:使用 --volume $(pwd)/ros2_data:/home/ubuntu/data
,即使重建或刪除容器,資料仍保留在主機。
-
多設備:--device
可以多次指定,用於連接多種實體硬體(USB、串口、GPU)。
-
自動重啟:--restart=always
保證服務長期在線,適合開發板或長期測試。
-
網路模式:--net=host
避免 ROS2 DDS 的多播發不出的問題,但在跨主機部署時需注意安全性。
這樣的設定能讓你在容器內 完整模擬(Gazebo)、可視化(RViz)以及與實體硬體串接(IMU、Arduino、LiDAR)時,都擁有接近原生的體驗。
=================================================
以下是這份 docker‑compose.yml
主要欄位的功能與建議設定,幫你釐清每個參數的意義與用途:
各參數說明
-
version: "3.8"
定義 Compose 檔案的語法版本,3.8 支援 deploy.resources
等新功能。
-
services → ros2dev
服務名稱,自訂為 ros2dev
,後面所有設定都套用在這個容器上。
-
build: .
以當前目錄的 Dockerfile
來建置映像。
-
container_name: ros2_humble_gz_gpu
容器啟動後的名稱,方便用 docker ps
、docker logs
、docker exec
等指令操作。
GPU 支援
環境變數
-
NVIDIA_VISIBLE_DEVICES=all
讓容器看得到所有 GPU,或改為 0,1
只顯示指定卡號。
-
NVIDIA_DRIVER_CAPABILITIES=graphics,utility,video,compute
啟用 GPU 的圖形、計算等功能,必須包含 compute
才能跑 CUDA。
-
DISPLAY=${DISPLAY}
傳遞主機的 DISPLAY
,告訴容器 GUI 畫面要輸出到哪個螢幕。
-
QT_X11_NO_MITSHM=1
解決 Qt 應用(如 RViz)在 X11 上的共享記憶體錯誤。
Volume 掛載
網路與權限
-
network_mode: host
容器與主機共用網路堆疊,DDS 多播等通訊可直接發送到本機網路。
-
privileged: true
賦予容器幾乎與主機相同的權限,可存取全部裝置,適合要操作串口、GPIO、USB 等硬體。
-
stdin_open: true (-i)
保持標準輸入開啟,使你可以 docker attach
或 docker exec -it
進行互動。
-
tty: true (-t)
為容器分配虛擬終端機,使輸出排版漂亮。
啟動方式建議
如果你的 Compose 版本不支援 deploy.resources
,可改用:
或在 CLI 加上 GPU 參數:
如此一來,既能在容器中使用 Gazebo、RViz,又能透過 USB、TTY 控制真實硬體,是開發與測試 ROS2 自走車的理想配置。