[文章]理解Docker容器并畅玩docker

阅读量0
0
3
`

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

命令行!命令行!命令行!玩docker,简单几句命令就够了。
Docker容器响应迅速,执行迅速,回忆一下VM启动要多久?
最佳的试验场所,想怎么玩怎么玩,rm -rf /* 根本不是大问题。主机上删掉容器后,一个命令又满血恢复。
跟主机文件夹同步完全没有障碍,不需要考虑设置问题。
Remote - Containers插件实现远程编辑,VScode编辑容器内文件,终端运行容器内终端,完美。
--------------------------------------------------------------------------------------

Docker服务安装和启用的必要条件。
建议操作系统选择win10专业版
以下以win10专业版为例子,
检查硬件是否支持虚拟化功能,若显示未启用,请在BIOS中开启虚拟化功能,并安装hyper v服务
20190620102223442.png

hyper v软件功能已安装

20190620102612789.png


如果在以上前提下仍无法运行Docker,CMD命令行中执行以下命令,开启对应服务
  1. bcdedit /set hypervisorlaunchtype auto
复制代码

--------------------------------------------------------------------------------------
1、如何从虚拟机的角度,理解docker命令,畅玩docker容器
首先,Docker镜像就是运行容器的基础镜像,可以把它理解成无盘系统的ISO文件。
其次,Docker容器可以理解成独立的虚拟机。你可以在主机上使用同一个镜像创建多个同时运行的容器,而每个容器之间是互相独立的(例如你在容器A上清空了系统,完全不影响其他容器的正常运作)。

这样描述,还是不大明白,我们可以实际操作一下。先打开两个命令行,在其中一个命令行执行以下命令:
  1. docker run -it --name a1_rm alpine
复制代码
命令解析:使用alpine镜像为模板,以交互模式(-it参数)运行一个名称为  a1_rm  的容器(也就是虚拟机),并进入容器中。在容器中我们可以随意执行任何命令,建议大家先不要这么快执行  rm -rf /* 命令,不要这么快就搞死它。

-----------
然后我们在另一个命令行中执行另一个命令
  1. docker run -it --name a2 alpine
复制代码
另一个被命名为  a2  的容器就创建好了,在容器中也可以执行各种命令。

------------
接下来我们回到之前的命令行,给  a1_rm  容器的软件执行死刑,也就是广大软件开发者最喜欢开的玩笑,删库跑路。执行命令
  1. rm -rf /*
复制代码
这下好了,a1_rm  这个容器已经完蛋了,除了  exit  退出命令正常以外,其他命令都执行不了了。但是  a2 容器里还是可以很正常的执行各种命令。
那我们就输入  exit  退出容器吧,此时容器因为交互模式结束,会进入停机状态。我们试试看重启  a1_rm  容器,看看还有没有救。输入命令
  1. docker start a1_rm
复制代码
命令解析:启动a1_rm这个容器
会出现以下提示,无法找到  /bin/bash 命令(该命令为默认登陆shell),所以没办法启动容器,好了,这个容器已经完蛋了。


现在只能通过命令删掉这个  a1_rm  容器。
  1. docker rm a1_rm
复制代码
命令解析:删掉a1_rm这个容器
---------
假如我们现在又想以  alpine  镜像为模板,重新创建  a1_rm  容器呢?还是运行之前的命令
  1. docker run -it --name a1_rm alpine
复制代码
哈哈,a1_rm  又满血复活了,是不是很棒?

-------------
此外,如果容器已经在运行中,我们想进入容器内,那就执行以下命令即可
  1. docker attach a1_rm
复制代码
命令解析:进入名称为  a1_rm  的容器中

--------------------------------------------------------------------------------------
接下来再说一下挂载主机文件,可以通过  -v  命令将本地目录挂载到容器指定目录,示范代码如下:
  1. docker run -it --name a1 -v "d:/code:/home/code"   
复制代码
命令解析:以  walker2048/hm_build 为镜像模板,交互形式运行  a1  容器,并将 d 盘的  code 目录挂载到  容器(a1)的  home/code  目录上。命令中单独打的斜杠    是告诉  bash 这是跨行命令(如果是使用cmd或者powershell请自行删除该斜杠)。-v 命令后面跟着主机目录绝对路径容器的绝对路径,用  :  符号隔开
-----------
假如我想挂载两个文件夹怎么办?
  1. docker run -it --name a1 -v "d:/code:/home/code"   
  2. -v "d:/gcc:/opt/gcc"  walker2048/hm_build
复制代码
这样就可以了呀,需要挂载几个目录,就在创建容器时直接用  -v  参数设置好就行了。

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

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

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




`
docker start.png

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友