|
理解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 容器的软件执行死刑,也就是广大软件开发者最喜欢开的玩笑,删库跑路。执行命令
复制代码 这下好了,
a1_rm 这个容器已经完蛋了,除了 exit 退出命令正常以外,其他命令都执行不了了。但是
a2 容器里还是可以很正常的执行各种命令。
那我们就输入 exit 退出容器吧,此时容器因为交互模式结束,会进入停机状态。我们试试看重启
a1_rm 容器,看看还有没有救。输入命令
复制代码 命令解析:启动a1_rm这个容器
会出现以下提示,无法找到 /bin/bash 命令(该命令为默认登陆shell),所以没办法启动容器,好了,这个容器已经完蛋了。
docker start.png (143.5 KB, 下载次数: 0)
下载附件 保存到相册
2020-11-12 16:24 上传
现在只能通过命令删掉这个
a1_rm 容器。
复制代码 命令解析:删掉a1_rm这个容器
---------
假如我们现在又想以
alpine 镜像为模板,重新创建
a1_rm 容器呢?还是运行之前的命令
- docker run -it --name a1_rm alpine
复制代码 哈哈,
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分钟左右就搞定。 |
|