Wiki
Docker命令學習
約 8 分鐘閱讀
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
1.參考文件
https://www.runoob.com/docker/docker-tutorial.html
2.常用命令
常用的標紅了,偶爾用的標綠了,其他了解就行。
| 命令 | 描述 | 示例 |
|---|---|---|
| docker run | 建立並啟動一個新的容器。 | docker run -it ubuntu bash |
| docker build | 通過指定的 Dockerfile 建立一個新的映象。 | docker build -t myimage . |
| docker pull | 從 Docker 倉庫拉取映象。 | docker pull ubuntu |
| docker push | 將本地映象推送到 Docker 倉庫。 | docker push myimage |
| docker stop | 停止一個正在執行的容器。 | docker stop container_id |
| docker start | 啟動一個已經存在的容器。 | docker start container_id |
| docker restart | 重新啟動容器。 | docker restart container_id |
| docker ps | 列出當前正在執行的容器。 | docker ps |
| docker rm | 刪除一個或多個停止的容器。 | docker rm container_id |
| docker exec | 在一個正在執行的容器中執行命令。 | docker exec -it container_id bash |
| docker logs | 檢視容器的日誌輸出。 | docker logs container_id |
| docker images | 列出本地所有映象。 | docker images |
| docker rmi | 刪除一個或多個映象。 | docker rmi myimage |
| docker network | 管理 Docker 網路。 | docker network ls |
| docker volume | 管理 Docker 資料卷。 | docker volume ls |
| docker-compose up | 啟動 docker-compose.yml 中定義的所有服務。 | docker-compose up |
| docker-compose down | 停止並移除 docker-compose.yml 中定義的所有服務及其相關資源。 | docker-compose down |
| docker info | 顯示 Docker 系統的詳細資訊。 | docker info |
| docker stats | 檢視正在執行的容器的即時資源使用情況(CPU、記憶體等)。 | docker stats |
| docker inspect | 檢視容器或映象的詳細資訊(JSON 格式)。 | docker inspect container_id |
| docker save | 將一個映象儲存為 tar 檔案。 | docker save -o myimage.tar myimage |
| docker load | 從 tar 檔案中載入映象。 | docker load -i myimage.tar |
| docker tag | 為映象新增標籤(tag)。 | docker tag myimage myimage:v1 |
| docker buildx build | 使用 Buildx 構建多架構映象。 | docker buildx build -t myimage . |
| docker buildx create | 建立一個新的 Buildx 構建例項。 | docker buildx create --use |
| docker buildx ls | 列出所有可用的 Buildx 構建例項。 | docker buildx ls |
| docker buildx use | 設定當前的 Buildx 構建例項。 | docker buildx use mybuilder |
| docker buildx bake | 使用 Bake 檔案批次構建映象。 | docker buildx bake -f bake.hcl |
| docker buildx build --push | 構建映象並推送到映象倉庫。 | docker buildx build --push -t myimage . |
| docker buildx build --platform | 構建映象併為多個平臺生成支援。 | docker buildx build --platform linux/amd64,linux/arm64 -t myimage . |
2.1.run命令的引數(非常重要)
| 引數/配置 | 功能說明 | 重要性與參考依據 |
|---|---|---|
| --name=ros_jazzy_opencv411_cuda128_cudnn971_noble | 指定容器名稱,便於後續管理 | 替代隨機生成的容器名。 |
| --gpus all | 允許容器訪問宿主機所有GPU資源,需NVIDIA驅動支援 | 用於CUDA加速等GPU依賴任務。 |
| -e NVIDIA_DRIVER_CAPABILITIES=all | 啟用NVIDIA驅動的全部功能(如CUDA、圖形渲染) | 確保容器內GPU功能完整67。 |
| -dit | 組合引數:- -d:後臺執行容器(Detached模式)- -i:保持標準輸入(STDIN)開放- -t:分配偽終端(TTY) | 允許容器在後臺執行並支援互動操作。 |
| --privileged | 賦予容器完全主機許可權(可訪問裝置、核心模組等) | 用於需要直接操作硬體的場景(如訪問USB裝置),但存在安全風險。 |
| --net=host | 共享宿主機網路名稱空間(容器使用宿主機IP和埠) | 簡化網路配置,無NAT,這樣的話,網路效率更高,區域網裝置更容易發現。 |
| --group-add audio--group-add video--group-add dialout | 將容器使用者加入宿主機使用者組:- audio:音訊裝置訪問- video:影片裝置訪問- dialout:序列埠裝置訪問 | 避免許可權問題(如避免無法呼叫攝像頭、麥克風)。 |
| -e DISPLAY=$DISPLAY-e XAUTHORITY=/home/tungchiahui/.Xauthority-e WAYLAND_DISPLAY-e XDG_RUNTIME_DIR-e QT_QPA_PLATFORM=xcb | 配置圖形顯示環境:- 繫結宿主機顯示介面(X11或Wayland)- 設定GUI應用渲染後端 | 支援容器內執行圖形介面應用(如OpenCV視覺化)。 |
| -v /tmp/.X11-unix:/tmp/.X11-unix:rw-v /dev/dri:/dev/dri | 掛載宿主機圖形裝置:- X11套接字目錄- 直接渲染管理器(DRI)裝置 | 實現容器內圖形顯示。 |
| -v $HOME/.Xauthority:/home/tungchiahui/.Xauthority:ro | 掛載X11認證檔案(只讀) | 確保容器有權連線宿主機顯示服務。 |
| -v /run/user/1000/wayland-0-v /run/user/1000 | 掛載Wayland顯示協議相關目錄 | 支援Wayland協議的圖形顯示。 |
| --ulimit nofile=1024:524288 | 設定程序**最大可開啟檔案數(nofile)**的方式,用於控制容器或程序執行時的檔案控制代碼數量限制。--ulimit <限制類型>=<軟限制>:<硬限制> | 如果預設限制太小,可能會出現 "too many open files" 的錯誤。所以在容器執行或系統服務啟動時,需要調大這個值。--ulimit nofile=4096:65536 |
| -v /home/tungchiahui:/home/tungchiahui | 掛載宿主機使用者目錄到容器內同名路徑 | 實現宿主機與容器間檔案共享(如程式碼、資料持久化)。 |
| -w /home/tungchiahui | 設定容器啟動後的預設工作目錄 | 直接進入專案路徑,方便執行命令2324。 |
| tungchiahui/ros-opencv:jazzy-411-cuda128-cudnn971-noble | 映象名稱指定映象及標籤,包含:- ROS 2 Jazzy- OpenCV 4.11- CUDA 12.8- cuDNN 9.7.1 | 提供預配置的深度學習與機器人開發環境。 |
我已經寫好了一個非常完備的執行命令了,你直接用我的就可以.
下方這條命令一定要在普通使用者下執行,不要在root使用者下執行,其實加不加sudo加不加sudo -E都無所謂。
使用者已經被加到docker組了,不用sudo也行跑,其次,sudo執行的話,你的$HOME變數也不會變,更何況加上-E的話,這樣你的$HOME更不可能變了。
sudo docker run --name=ros_opencv_cuda \
--gpus all \
-e NVIDIA_DRIVER_CAPABILITIES=all \
-e DISPLAY=$DISPLAY \
-dit \
--privileged \
--net=host \
--group-add audio \
--group-add video \
--group-add dialout \
-e XAUTHORITY=$HOME/.Xauthority \
-e WAYLAND_DISPLAY=$WAYLAND_DISPLAY \
-e XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR \
-e QT_QPA_PLATFORM=xcb \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
-v /dev/dri:/dev/dri \
-v $HOME/.Xauthority:$HOME/.Xauthority:ro \
-v /run/user/$(id -u)/wayland-0:/run/user/$(id -u)/wayland-0 \
-v /run/user/$(id -u):/run/user/$(id -u) \
-v $HOME:$HOME \
-w $HOME \
tungchiahui/ros-opencv:humble-411-cuda128-cudnn970-jammy
你需要自己手動修改的內容:
-
NVIDIA_DRIVER_CAPABILITIES=all--gpus all沒有輝達顯示卡請註釋。 -
--name後面請自己為容器起名。
-
最後一行倉庫名稱請你自己找對應的映象填上。
-
ROS1在Fedora發行版下會爆記憶體,需要新增上下面這個引數,如果你不是Fedora和ROS1,請不要加。(現在其實也很少用ROS1了,ROS1已經逐步淘汰了)
--ulimit nofile=1024:524288 \
- 如果想用當前使用者登陸容器,可以加上下面這幾條,但非常非常不建議.
--user $(id -u):$(id -g) \
-v /etc/passwd:/etc/passwd:ro \
-v /etc/group:/etc/group:ro \