標題以ros的docker鏡像為例,探討docker鏡像的使用(待完善)
1. docker介紹(以ros工程距離)
(1)個人理解:docker就是一個容器,主要的作用就是將環境打包好,方便在遷移板子的時候一行指令導入原來的開發環境。讓用戶專心代碼開發,而不是重復的安裝環境。
(2)注意:docker環境的遷移,是需要平臺架構一致的情況下,才可以進行對應的遷移,如果架構不同則需要重新搭建環境。舉個例子:在x86上面安裝的ros的docker鏡像,如果切換一臺x86電腦進行開發則可以將原有的環境一鍵加載到新的電腦里面; 如果是在arm架構(jetson、rk等的ubutnu下)開發,只能遷移到新的arm架構的板子上。
2. docker安裝
docker安裝其實很簡單,按照官網教程一步一步安裝即可,也可以參考csdn上面的相關連接(放在文末)。
3. docker配置
為什么需要進行配置,是因國內網絡訪問不到docker hub鏡像網站。這個網站上存放著很多官方的docker鏡像,方便用戶在基礎上進行開發。然后用戶直接docker pull 鏡像名
的時候會出錯,所以需要對此進行配置。
配置的原理大致就是需要寫入一些國內的鏡像源,然后進行docker等服務的重新啟動即可。
(1)首先確定自己的可以正常聯網
ping www.baidu.com
(2)檢查Docker服務狀態
systemctl status docker
沒問題就ctrl+c退出即可。
(3)創建daemon.json文件
sudo mkdir -p /etc/docker
sudo touch /etc/docker/daemon.json
sudo gedit /etc/docker/daemon.json
上面的命令,依次是創建文件夾,創建json文件,編輯json文件(個人習慣喜歡gedit,如果用的話需要 sudo apt-get install gedit
進行安裝,也可以用其他的編輯器)
然后將下面的內容粘貼進去,保存并退出。(下面的鏈接可能會存在更新,后期可能是需要進行修改的)
{"registry-mirrors" : ["https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://dockerproxy.com",
"https://gst6rzl9.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"http://mirrors.ustc.edu.cn/",
"https://mirrors.tuna.tsinghua.edu.cn/",
"http://mirrors.sohu.com/"
],"insecure-registries" : ["registry.docker-cn.com","docker.mirrors.ustc.edu.cn"],
"debug": true,
"experimental": false
}
填寫好之后,需要對daemon的服務進行重啟
sudo systemctl daemon-reload
然后對docker 進行重啟
sudo systemctl restart docker
然后看看配置好了嗎
docker info
4. ros的docker鏡像拉取、查看、進入及配置等操作
(1)鏡像拉取
以ros鏡像為例,打開docker hub網站搜索ros,并查看對應的指令,以下面的照片為例,輸入指令
docker pull ros:melodic
因為經過了上面步驟的配置,這個步驟只要你網絡正常正常的情況下都是可以pull成功的。
(2)鏡像信息查看
然后運行下面的指令查看所有鏡像的相關信息。
docker images
出現如下信息,鏡像 tag,id,創建時間和大小等。
其實還有一個指令docker ps
也可以查看鏡像的容器的信息,這個是需要鏡像運行時查看的,這個后面會用到。
(3)進入鏡像
為了方便進入鏡像,本文提供一個sh文件,方便進入,再次進入鏡像以及相關的配置等
如果是初次進入鏡像,使用下面的命令行即可。
docker run -it --rm \--net=host \--privileged \--env="DISPLAY=$DISPLAY" \--env="QT_X11_NO_MITSHM=1" \--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \--device /dev/dri \--device /dev/video0 \--volume="$HOME/ros_ws:/root/ros_ws" \--name ros_melodic \arm64v8/ros:melodic
參數 | 說明 |
---|---|
--net=host | 使用主機網絡,方便 ROS 多節點通信 |
--privileged | 授權容器訪問所有硬件設備(例如 USB、CAN) |
--env="DISPLAY=$DISPLAY" | 將主機的 GUI 顯示傳遞給容器 |
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" | X11 的 socket 共享 |
--device /dev/dri | GPU 渲染支持(RK3588 支持 OpenGL) |
--device /dev/video0 | 攝像頭(可根據你實際設備更改) |
--volume="$HOME/ros_ws:/root/ros_ws" | 文件掛載,把你的工作區同步進容器中 |
二次進行鏡像
docker exec -it ros_melodic bash
5. 更新docker鏡像的操作
為什么需要更新docker鏡像的操作呢?是因為隨著開發的深入,環境是不斷的變化的,這個時候是需要對docker的鏡像進行更新的(即將新的環境也打包到鏡像內)。
對鏡像進行更新,需要保持進入鏡像的操作,如果退出了鏡像則剛剛安裝的環境需要重新進行安裝哦!
(1)在保持一個命令行是在鏡像內,然后把需要的環境安裝好之后。
(2)另開一個命令行窗口docker images
查看當前鏡像的大小。
然后使用docker ps
查看鏡像的容器的id(此id和docker images顯示的id一般是不一樣的)。
(3)然后對鏡像進行更新
docker commit <容器ID或名字> <新鏡像名>:<tag>
一般情況下 <新鏡像名>:是已經進入這個鏡像的名稱和tag,這相當于對這個進行覆蓋
(4)然后查看是否更新
docker images
查看剛剛進入的環境的size是否變大,如果變大就是說明環境已經更新了,下次在進入該環境就有了這次安裝的一些包.
6.導出和導入docker等的操作
為什么需要導入和導出,是為了跨設備部署一樣的環境
一般重新部署環境有兩種方法,方法1:一個是在docker hub(可以自己上傳鏡像的)上進行拉取鏡像,方法2:另一個是docker load -i tar文件(適合不想把鏡像開源的個人和企業)。
以第2種方法為例,首先有一個完整的docker鏡像,我現在將docker 鏡像打包成tar壓縮包
docker save -o <保存路徑/文件名.tar> <鏡像名>:<tag>
然后跨設備環境部署時,在裝好docker后的同平臺下,我將tar拷貝到主機上,然后運行下面的指令,即可導入此前建好的環境
docker load -i <鏡像tar路徑>
這樣就可以完整對docker進行使用了。
一下是寫此博客參考的鏈接,侵權刪。
ubuntu安裝docker的csdn教程
ubuntu安裝docker 的官網教程
配置docker的daemon.json參考的教程