因为在工控机上ubuntu环境下,在ROS下运行算法,依赖的基础库可能经常和其他同事的依赖库有冲突,常常是别人用完之后我再运行就缺库了。因此想到用docker来解决此问题,用docker拉取一个ubuntu 18.04的镜像然后在里面装各种库,装坏了只要用之前留有的备份镜像就可以迅速恢复运行环境,我的各种算法就在这个docker镜像里跑。相当于用docker封装了一个我的工程的独立运行环境,无论带到哪台ubuntu计算机上(前提装有docker),我只要将我的镜像文件拷贝过去就可以立刻跑起来。

docker比虚拟机更好用,独立运行的最小系统,将自己的运行环境与主机隔绝开来,但是又可以共享主机的IP和端口进行通讯。

先介绍一下我对镜像和容器的理解,我理解镜像image就是一个模板,docker load加载镜像image后,可以从这个镜像image运行多个这个模板的实例即容器container,我们进入容器container后进行各种修改操作又需要commit提交到模板镜像image上,这样模板就可以保存我们在容器container中进行的更改。

 docker各概念之间关系框图

下面介绍一些使用docker的高频命令:

所有docker命令都不能在容器container里,要在一般的宿主机终端中!

docker 镜像image在同一台电脑上只要先load加载一次(远程docker 仓库pull的可以不用load,本地tar文件需要先load),再run运行一次,下次可以直接attach连接到相应容器container,无需再加载运行。

1.拉取ubuntu系统镜像

sudo docker pull ubuntu:18.04

//18.04为版本号,可按自己需求选择相应版本

2.初次运行ubuntu docker镜像

sudo docker run -it ubuntu:18.04

//运行此最小系统,然后就可以在里面sudo apt-get install .... 安装各种需要的库了

//从docker远程仓库直接pull的镜像可以直接run,可以从.tar文件load后再run

3.加载.tar本地镜像文件

sudo docker load -i ‘路径/XXX.tar’

//小技巧 输完load -i后直接将.tar文件鼠标左键按住拖入终端也可以

sudo docker images

//加载完镜像后,用sudo docker images看看镜像Image是否被加载进来了

 

4.以host模式运行docker镜像

sudo docker run -it --net=host 镜像仓库名:镜像标签

//例如运行 sudo docker run -it --net=host ubuntu:18.04 bash加载图片中最后一个镜像,

//ubuntu就是这个镜像的仓库名REPOSITORY,18.04就是该镜像的标签代表版本

// --net=host使用host模式和宿主机共用IP端口,既能够独立运行又能和主机上的其他进程

//正常通讯

4.1将宿主机的某个文件夹挂载到docker镜像中的特定路径

sudo docker run -it -v 宿主机路径:映射路径 --net=host 镜像仓库名:镜像标签 bash

//通常需要将自己的程序工程文件放入docker中运行,但是docker容器里通常又没有vscode

//记事本等可视化界面,程序想debug非常麻烦,Debug完后还需要拷贝到容器里。可以之间//将主机上的工程文件挂载为docker容器里的对应路径,这样在宿主机对文件进行更改,

// docker 容器里也随着更改。就比较方便

//例如我想运行镜像ubuntu:18.04实例化为一个容器,然后将我宿主机 /home/Project1映射//为docker 容器内的 /home/Project_test路径,执行以下命令

sudo docke run -it -v /home/Project1:/home/Project_test --net=host ubuntu:18.04 bash

4.2 查看从镜像加载的容器列表

sudo docker ps -a

 

 

5.提交在docker镜像中的更改

sudo docker commit -a “你的提交注释” containerID  镜像仓库名:版本号

//如 sudo docker commit -a “wujiangzhu” e34626772 ubuntu_myenv:v0

//将当前我正在运行的容器e34626772 提交到ubuntu_myenv:v0

6.将镜像导出到tar本地文件

sudo docker save -o 要保存成的文件名.tar 镜像仓库:标签

 

// 如将图中的镜像ubuntu:18.04导出为myenv.tar,执行以下命令

// sudo docker save -o myenv.tar ubuntu:18.04,这样你就能在当前终端的路径下看到myenv.tar,

// 这时就可以用移动硬盘拷贝到工控机或者是其他你需要的设备上了,这个.tar文件就是封// 装了我这个ubuntu小系统,包含我配置的算法依赖的各种库

7.宿主机和docker容器互相之间文件拷贝

//有时候工程会有一些输出数据文件等需要从docker容器中拷贝出来

//从宿主机拷贝docker容器内

sudo docker cp 宿主机文件路径 容器名:容器内路径

//从docker 容器拷贝到宿主机

sudo docker cp 容器名:容器内路径 宿主机文件路径

//查看docker容器的名称

sudo docker ps 查看所有正在运行的容器的信息,最后一列为name

sudo docker ps -a 查看所有容器的信息,最后一列为name如下图

8.启动,停止, 进入docker容器

sudo docker start 容器id   //id 用docker ps -a查看

sudo docker stop 容器id

sudo docker attach 容器ID

9.删除宿主机上加载的容器,镜像

为了节省存储和内存空间,需要定期删除不用的镜像和容器,指令如下:

sudo docker rmi 镜像id   //镜像id用sudo docker images查看

sudo docker rm 容器id //容器id用sudo docker ps -a查看

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐