文章目录
Docker入门流程(创建容器到构建镜像)
平时我们经常会遇到在自己电脑上运行的代码,在别人的电脑上运行就出现莫名其妙的问题,这种大多是因为代码”水土不服“,不同电脑的软件版本和依赖库不同,Docker的使用可以很好地解决这个问题。简单来说,Docker可以把代码和代码运行的环境一把打包,构建一个容器,你可以在这个容器里面运行代码。另外注意一点,虚拟机也可以用Docker。
一、Docker的安装和操作命令
1、Docker简介、安装与镜像加速器
Docker是开源的应用程序容器引擎,环境打包可移植,不同容器相互隔离,目的是解决软件的跨环境迁移问题。Docker的安装网上有很多教程,可以参考这个链接,里面也有一些介绍,可能需要科学上网。
Docker有三个基本概念,仓库,容器和镜像。具体详细内容很好搜到,上述链接也有。简单来说,①镜像(Image),镜像可以看成一个独立的最小文件系统,比如Ubuntu:18.04,镜像名称Ubuntu,冒号后面的是tag版本号。②容器(Container),容器是很久镜像构建的,一个很好的比喻是镜像看成定义好的类,容器看成根据类实例化的对象。③仓库可以看出很多镜像的储存库,有官方的docker hub仓库,也有公司、私人建立的,一般我们拉取镜像不设置镜像拉取地址,都会默认从官方拉取,和换源安装软件的道理一样。
通常我们拉取官方镜像比较慢,甚至很慢,所以一般都会配置镜像加速器,有网易、阿里、中科大等各种加速器,你也可以配置多个,拿阿里加速器举例,搜索阿里云,注册登录,在控制台搜索容器镜像服务,左边的镜像工具打开会看到镜像加速器,根据提示完成配置。
2、Docker操作命令
①Docker服务相关命令:
服务相关命令用的频率会比较少,稍微了解下,设置开机自启docker就好。
systemctl start docker #启动docker
systemctl stop docker #停止docker
systemctl restart docker #重启docker
systemctl status docker #查看状态
systemctl enable docker #开机自启docker
②Docker的镜像相关命令
镜像的命令用的多的主要是查看,拉取和删除镜像。
docker images #查看镜像
docker images -q #查看镜像id
docker search name #网上搜索镜像,可以搜好再拉取
docker pull redis:5.0 #拉取镜像例子
docker rmi resdis:5.0 /image id #删除镜像例子
docker rmi `docker images -q` #删除所有镜像
③Docker的容器相关命令
拉取完镜像之后,需要根据镜像去创建容器,容器有两种状态,一种运行up,一种退出exit,在创建容器时需要知道一些参数说明。
如果创建使用-t则直接进入这个容器,如果是-d创建的,
docker ps
可以看到这个容器在运行,之后需要
docker exec -it
并加上
/bin/bash
进入这个容器。之后便是在容器里面操作或者删除容器。
docker ps #查看正在运行的容器
docker ps -a # 查看所有容器,up 运行 exit退出
docker run -it --name=c1 centos:7 /bin/bash # (bash 交互式的shell,默认也是这个)交互式的
docker run -id --name=c2 centos:7 #守护容器 后台运行需要
docker exec -it c2 /bin/bash #进入这个容器 ,需要bash 守护容器进入exit不会关闭,需要stop
docker stop c1 #停止一个容器
docker start c1 #开启一个容器
docker rm c1 #不能删除正在运行的容器
docker inspect c1 #查看容器信息
二、数据卷和镜像构造
1、数据卷配置
Docker中产生的一些实验数据结果会随着容器的删除而消失,这个时候就需要挂载数据卷。
一个容器可以挂载多个数据卷,数据卷就是宿主机的一个目录。本质就是:容器挂载一个外部数据卷,修改和产生的数据放在数据卷里,双方会同步映射,这样的话容器产生的数据可以放在宿主机的目录下,容器间也可以交换数据。容器删除了,数据卷内容还在。
另外还可以配置数据卷容器,让其他容器映射这个数据卷容器,用的不太多。
比如:
docker run -it --name=c1 -v ~/data:/root/data centos:7 /bin/bash #左边宿主机目录:右边容器目录
挂载多个就多个-v,容器加root,相当于~根目录,相当于一个映射文件夹,但是数据卷的内容不会随着容器的删除而消失
#配置数据卷容器
docker run -it --name=c3 -v /volume centos:7
容器内部创建一个volume目录,对应宿主机目录下的一个文件,可以通过docker inspect 查看mounts
docker run -it --name=c1 --volumes-from c3 centos:7
c1 下也会创建一个volume目录,都是相互映射的,对应宿主机目录下的一个文件
2、镜像构建概念
构建镜像前,了解一些概念。linux的文件系统是由bootfs和rootfs组成的,简答来说,不同linux的发行版的bootfs相同,rootfs不同,windows和linux的bootfs不同。镜像可以看成一个文件系统,是一层一层堆叠的,在构建容器是会使用宿主机的bootfs,因此windos和linux的镜像不能互用。镜像的最底层也就是boofs,第二层就是rootfs,比如ubuntu,centos等。后面可以继续堆叠,注意上一层是在下一层的基础上进行叠加。一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像当从一个镜像后动容器时,,Docker会在最顶层加载一个读写文件系统作为容器,所以一些层数高的镜像size会比较大。
1.Docker镜像本质是什么?
答:是一个分层文件系统。
2.Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?。
答:Centos的iso镜像文件包含bootfs和rootfs,而docker的certos镜像复用操作系统的bootfs,只有rootfs和其他镜像层
3.Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?
答:由于docker中镜像是分层的,tomat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小500多MB
3、镜像构建方法
①根据容器构建镜像
主流是dockerfile创建镜像,这个利用commit命令将容器转为镜像,镜像压缩save,传输再load镜像,根据镜像去创建容器。
docker commit contanier_id mya:1.0 # 容器id 和自定义的镜像名称
docker images
docker save -o aa.tar mya:1.0 #将镜像保存为压缩包,可以给别人
docker load -i aa.tar #别人拿到了load一下就可以导入镜像了
docker images
docker run -it --name=myaa mya:1.0 bash #根据镜像创建容器
②根据dockerfile去创建容器
Dockerfile 是一个文本文件,包含了一条条的指令,每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像。一般遇到具体命令就去搜一搜,网上很多dockerfile的关键字。参考链接2,几个关键的:
FROM 基础镜像
ADD 会解压缩
WORKDIR 进入容器停留的目录
CMD 启动容器的时候运行 (一般有的默认/bin/bash)
RUN 启动容器前运
之后在已有镜像上去下载 安装一些东西,build为一个自己的镜像
docker build -f dockerfile -t myimg:1.0 . 会加一个. 跟目录有关
3、Docker compose和私有仓库
这个简单说下,实际应用过程中,不止一个容器,如何管理多个容器,根据镜像去创建容器,此时需要docker compose按照一定的规则批量管理多个容器。编写docker-compos.yml 管理构建多个容器,启动的命令 就是 docker-compose up。(在有docker-compose.yml文件下运行docker-compose up (加-d 后台守护运行)),开启多个运行的容器。
私有仓库里面可以放一些自己的镜像,具体网上很多,这边提个概念。搭建私人仓库,可以上传自己的镜像,拉取自己的镜像。大概流程是下载了一个私人仓库镜像,根据这个镜像建立了一个私人仓库容器,其实就是加了一个ip地址和端口号。
三、Docker中搭建ROS容器
这个是和自己的研究有关,做一个完整的记录。
1、拉取镜像,构建容器
sudo docker pull osrf/ros:melodic-desktop-full
,参考链接3,比较全。
如果是包含ros-core的镜像,大概是400M,如果包含rviz,gazebo等全套的destktop-full版本,大概是5G左右,占据的空间还是很可观的。
之后可以参考下图构建容器,利用-v挂载数据卷,设置共享显示的目的是:容器里运行如rviz的可视化界面会在宿主机上显示看到。
宿主机开启xhost, 使能宿主机接收其他客户端的显示需求 运行 xhost +
docker创建容器时参数设置xserver挂载地址即可
-e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix
运行完之后容器显示的rviz可以在宿主机上显示,这些都是固定命令
-v /tmp/.X11-unix:/tmp/.X11-unix # 挂载本地显示服务端口到容器中
-e DISPLAY=unix$DISPLAY # 修改环境变量DISPLAY
-e GDK_SCALE # 与显示效果相关的环境变量
-e GDK_DPI_SCALE # 同上
一般挂载一个代码目录,一个数据生成目录,这样开启数据卷和显示设置之后,创建并进入容器,可以在宿主机修改文件和代码,自动映射到容器内。
有个注意点是容器内产生的数据会在root用户下,这个时候可以使用
sudo chmod -R 777 文件目录
去修改权限,使用
sudo chown -R 用户名 文件目录
去修改所有者
2、可能错误和注意
错误:
no such file or directory): exec: “nvidia-container-runtime”:
executable file not found in $PATH: : unknown.安装nvidia-docker
策略
curl https://get.docker.com | sh && sudo systemctl --now enable dockerdistribution=
( . / e t c / o s − r e l e a s e ; e c h o (. /etc/os-release;echo (./etc/os−release;echoID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L [https://nvidia.github.io/nvidia-docker/
d i s t r i b u t i o n / n v i d i a − d o c k e r . l i s t ] ( h t t p s : / / n v i d i a . g i t h u b . i o / n v i d i a − d o c k e r / distribution/nvidia-docker.list](https://nvidia.github.io/nvidia-docker/ distribution/nvidia−docker.list](https://nvidia.github.io/nvidia−docker/distribution/nvidia-docker.list) | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo -E apt-get update
sudo -E apt-get install -y nvidia-docker2
对于ros镜像创建的容器,有一个ros_entrypoint.sh文件,为了保证容器内可以正常运行 ros 环境,需要在根目录下执行:
source ros_entrypoint.sh,本质就是source环境变量
之后就是正常操作了…
版权归原作者 finegx 所有, 如有侵权,请联系我们删除。