Docker入门流程(创建容器到构建镜像)

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/osrelease;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/nvidiadocker.list](https://nvidia.github.io/nvidiadocker/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环境变量

之后就是正常操作了…

猜你喜欢

转载自blog.csdn.net/qq_43377917/article/details/131745891
今日推荐