电子产业一站式赋能平台

PCB联盟网

搜索
查看: 1956|回复: 0
收起左侧

理解Docker容器并畅玩docker

[复制链接]

2607

主题

2607

帖子

7472

积分

高级会员

Rank: 5Rank: 5

积分
7472
发表于 2020-11-26 15:56:26 | 显示全部楼层 |阅读模式
理解Docker容器并畅玩docker,   
本帖最后由 死龙 于 2020-11-13 08:12 编辑



为什么我特别喜欢用Docker,以至于办公电脑,家里电脑,笔记本上,树莓派上都装了Docker。因为以下几点原因:



命令行!命令行!命令行!玩docker,简单几句命令就够了。

Docker容器响应迅速,执行迅速,回忆一下VM启动要多久?

最佳的试验场所,想怎么玩怎么玩,rm -RF /* 根本不是大问题。主机上删掉容器后,一个命令又满血恢复。

跟主机文件夹同步完全没有障碍,不需要考虑设置问题。

Remote - Containers插件实现远程编辑,VScode编辑容器内文件,终端运行容器内终端,完美。

--------------------------------------------------------------------------------------



Docker服务安装和启用的必要条件。

建议操作系统选择win10专业版

以下以win10专业版为例子,

检查硬件是否支持虚拟化功能,若显示未启用,请在BIOS中开启虚拟化功能,并安装hyper v服务



20190620102223442.png (80.42 KB, 下载次数: 0)

下载附件  保存到相册  

2020-11-12 15:43 上传

hyper v软件功能已安装





20190620102612789.png (44.7 KB, 下载次数: 0)

下载附件  保存到相册  

2020-11-12 15:43 上传



如果在以上前提下仍无法运行Docker,CMD命令行中执行以下命令,开启对应服务



  • bcdedit /set hypervisorlaunchtype auto

复制代码

--------------------------------------------------------------------------------------

1、如何从虚拟机的角度,理解docker命令,畅玩docker容器

首先,Docker镜像就是运行容器的基础镜像,可以把它理解成无盘系统的ISO文件。

其次,Docker容器可以理解成独立的虚拟机。你可以在主机上使用同一个镜像创建多个同时运行的容器,而每个容器之间是互相独立的(例如你在容器A上清空了系统,完全不影响其他容器的正常运作)。



这样描述,还是不大明白,我们可以实际操作一下。先打开两个命令行,在其中一个命令行执行以下命令:



  • docker run -it --name a1_rm alpine

复制代码 命令解析:使用alpine镜像为模板,以交互模式(-it参数)运行一个名称为   
a1_rm   的容器(也就是虚拟机) ,并进入容器中 。在容器中我们可以随意执行任何命令,建议大家先不要这么快执行   rm -rf /* 命令,不要这么快就搞死它。



-----------

然后我们在另一个命令行中执行另一个命令



  • docker run -it --name a2 alpine

复制代码 另一个被命名为   
a2  的容器就创建好了,在容器中也可以执行各种命令。



------------

接下来我们回到之前的命令行,给   
a1_rm   容器的软件执行死刑,也就是广大软件开发者最喜欢开的玩笑,删库跑路。执行命令



  • rm -rf /*

复制代码 这下好了,
a1_rm   这个容器已经完蛋了,除了   exit   退出命令正常以外,其他命令都执行不了了。但是   
a2 容器里还是可以很正常的执行各种命令。

那我们就输入   exit   退出容器吧,此时容器因为交互模式结束,会进入停机状态。我们试试看重启   
a1_rm   容器,看看还有没有救。输入命令



  • docker start a1_rm

复制代码 命令解析:启动a1_rm这个容器

会出现以下提示,无法找到   /bin/bash 命令(该命令为默认登陆shell),所以没办法启动容器,好了,这个容器已经完蛋了。



docker start.png (143.5 KB, 下载次数: 0)

下载附件  保存到相册  

2020-11-12 16:24 上传



现在只能通过命令删掉这个   
a1_rm   容器。



  • docker rm a1_rm

复制代码 命令解析:删掉a1_rm这个容器

---------

假如我们现在又想以   
alpine   镜像为模板,重新创建   
a1_rm   容器呢?还是运行之前的命令



  • docker run -it --name a1_rm alpine

复制代码 哈哈,
a1_rm   又满血复活了,是不是很棒?



-------------

此外,如果容器已经在运行中,我们想进入容器内,那就执行以下命令即可



  • docker attach a1_rm

复制代码 命令解析:进入名称为   
a1_rm  的容器中



--------------------------------------------------------------------------------------

接下来再说一下挂载主机文件,可以通过   -v   命令将本地目录挂载到容器指定目录,示范代码如下:



  • docker run -it --name a1 -v “d:/code:/home/code“   \

复制代码 命令解析:以   
walker2048/hm_build 为镜像模板,交互形式运行   
a1   容器,并将
d 盘的   
code 目录挂载到   
容器(a1) 的   
home/code   目录上。命令中单独打的斜杠   
\   是告诉   
bash 这是跨行命令(
如果是使用cmd或者powershell请自行删除该斜杠 )。
-v 命令后面跟着 主机目录绝对路径 和 容器的绝对路径 ,用   :   符号隔开

-----------

假如我想挂载两个文件夹怎么办?



  • docker run -it --name a1 -v “d:/code:/home/code“   \
      
  • -v “d:/gcc:/opt/gcc“  walker2048/hm_build

复制代码 这样就可以了呀,需要挂载几个目录,就在创建容器时直接用   -v   参数设置好就行了。



这样理解挂载是不是很简单,已经挂载上去的目录,可以理解成实际目录文件。在容器中修改里面的内容(同时主机内容变更),在主机修改对应内容(容器中的内容也会变更)。



--------------------------------------------------------------------------------------

有些同学觉得,这有什么大不了的,我用VM一样可以很舒服啊。但是请大家考虑一下实际应用:真正做嵌入式开发的朋友,不可能只使用鸿蒙系统,有可能还需要使用厂商模组的SDK,或者AliOS-Things。那同一时间内使用2个以上不同的嵌入式系统平台,VM之类的虚拟机怎么玩?python2和python3的兼容和环境问题很容易让你反复重装系统。但是Docker完全可以随时开启多个厂商的环境供你使用,另外你也可以轻松在容器里安装和删除软件,有问题可以随时删掉容器重来。



最后说一下dockerfile,有些朋友想自定义镜像,想针对自己使用的情况打造最适合自己的镜像。docker也比VM之类的常规虚拟机强多了,一个dockerfile就写完,想装啥软件装啥,还可以添加注释。生成镜像的速度也远比VM安装一整套系统快得多,常规镜像2分钟左右就搞定。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表