当前位置: 首页 > Linux

进入docker的世界

时间:2023-04-06 11:31:53 Linux

最近学习MachineLearning,发现很多人都在用docker。我以前听说过,但我觉得这与我无关。但是现在发现docker就是这么方便的东西,可以跨平台运行(不管是什么版本的linux,甚至是mac和windows)。所以这里写一篇文章记录下学习心得。参考:DockerCompleteGuide参考:Gitbook-Docker——从入门到实践,别提那些难懂的名词。用简单的英语来说:Docker是一个LinuxLiveCD系统。和USB系统一样,它有完整的系统文件目录和程序。.我们可以在这个与外界隔绝的便携式系统中自由读写,但每次进入它时,它都会恢复到原来的状态,就好像什么都没发生过一样。我们可以自定义这个小系统默认安装什么软件,就像自定义LiveCD或者WinPE一样。一旦定制,它是不可变的并且非常稳定。刚开始理解Docker的逻辑比较混乱,比较难理解,感觉大家都说太复杂了。后来才发现,它的运行逻辑其实很简单。其实你可以把Docker当成电脑上安装Linux系统时的LiveCD,或者当Windows用USB安装系统时当成WinPE。这将使它更容易理解。回想一下,当你在PC或虚拟机上安装Linux系统时,总会有一个LiveCD选项。即不安装任何东西直接进入系统,所有工具都可以使用,所有软件都可以安装,所有配置也可以更改。只是重启之后,所有修改的地方都会恢复到原来的状态。每个指南都会提到这三个基本概念:ImageImage相当于系统光盘的ISO镜像文件,是只读的。可以直接在图像中无障碍的进行各种操作,感觉就像进入了_LiveCD_系统。只是退出时所有操作都会消失,下次进入图像时,还是和最初一样。Container容器就像是给“ISO文件”加了一层可读写的外衣。所有的改变都会保存在Container中,但是图片还是图片,不会改变。就像你可以随意换衣服,但你的身体是不会改变的。WarehouseRepo泛指Dockerhub,和Github一样是一个网站,只不过它收集的不是代码,而是各种镜像。您可以随意上传和下载各大厂商或个人制作的图片。安装DockerDocker分为CE和EE两个版本,一个是社区免费的,一个是商业付费的。参考官方:关于DockerCE在Ubuntu上安装Docker。参考官方安装步骤:GetDockerCEforUbuntu准备工作:#安装SSL相关,让apt通过HTTPS下载:sudoapt-getinstallapt-transport-httpsca-certificatescurlsoftware-properties-common#添加docker的GPGkeycurl-fsSLhttps://download.docker.com/linux/ubuntu/gpg|sudoapt-keyadd-#检查密钥是否匹配(9DC858229FC7DD38854AE2D88D81803C0EBFCD88)sudoapt-keyfingerprint0EBFCD88#Adddockeraptdownloadsourcesudoadd-apt-repository"deb[arch=amd64]https://download.docker.com/linux/ubuntu$(lsb_release-cs)stable"#Updatesourcesudoapt-getupdate安装docker:$sudoapt-getinstalldocker-ce卸载Docker:$sudoapt-getremovedockerdocker-enginedocker.io在Mac上安装Docker直接下载应用程序:在RaspberryPi上安装DockerRaspberryPi基于ARM架构,与PC不同。所以有些docker镜像即使可以在树莓派上制作出来,也无法在其他PC上运行。反之,其他PC上的docker镜像无法在树莓派上运行。如果需要找树莓派的专用镜像,可以在Dockerhub上搜索ARM或者Rpi找到。有一个叫Hypriot的仓库,出过很多树莓派的docker,大家可以参考一下。在RaspberryPi上安装Docker最困难的部分是正确选择源并添加GPG密钥以查找和下载适当版本的Docker。这个过程非常繁琐,很难有统一的解决方案。另外:官方一键安装版已过期。必须手动完成。参考另一篇笔记:在树莓派上安装Docker运行Docker【Imageuploadingoutsidethesite...(image-e81557-1548159126389)】CreateaContainercontainerfromtheImageimage:#CreateanewContainercontainer(ifthereisanimage本地,直接Createfromit,如果没有,从网上下载)#进入doke的shell-t,即进入一个虚拟系统,有自己的/root文件系统结构$dockerrun-it:#例如:$dockerrun-itjekyll/jekyll:latestbash#为容器指定一个名称(而不是仅仅通过ID来引用它)$dockerrun-it--name查看现有的:#查看现有的镜像$dockerimages#查看创建的容器$dockercontainerls-a运行一个现有的容器:#先启动容器$dockercontainerstart#运行(挂载)容器,然后进入挂载后自动容器中的shell$dockerattach#或完成一句话(--attach)$dockerstart-adeleteexisting:#deleteimage$dockerrm#deletecontainer$dockerrm不需要sudo来执行docker。为了执行docker而不是每次都输入sudo,我们需要为docker创建一个用户组并赋予权限:#创建docker用户组sudogroupadddocker#将当前用户添加到docker用户组sudogpasswd-a$USERdocker#更新当前用户组变化(不需要注销重新登录)newgrpdocker挂载宿主机host上的文件夹我们肯定不会满足于docker只访问我们自己小世界里的文件系统(没有数据),所以有必要允许它访问外部主机上的一些文件夹。比如我有一个docker,是用来做下载机的,那我一定要让它把下载的东西保存到我的宿主机上,不然就白下载了。参考:Docker学习---挂载本地目录在docker命令中指定挂载文件夹运行镜像(使用-v参数):$dockerrun-it-v:ubuntu64/bin/bash#或者作为只读挂载(:ro)$dockerrun-it-v::roubuntu64/bin/bash注意挂载的两边都必须是绝对路径。将Docker中的端口映射到宿主机上的端口如果Docker运行着Nginx等web服务,里面有一个网站,那么就必须把“虚拟机”中的端口映射到外面才能看到web页面正常。运行docker命令时指定映射,比如将内部80端口映射到外部8888端口,命令如下:$dockerrun--namewebserver-d-p80:8888nginx然后访问在主机上浏览器http://localhost:8888,就可以看到nginx中的网页了。Docker镜像保存更改,直接在镜像上所做的更改在退出时将全部消失。但是我们经常需要保存这些更改。Docker保存这些更改的机制是生成另一个只读映像。(-_-!)虽然看起来很正常,但这样不太好。但实际上,这很好!Docker镜像其实很小,所以生成另一个镜像并不费力。而且这种机制保证了每一张图片都不能随意修改,极大的避免了混乱。Docker保存变更的方式有两种:dockercommit:和gitcommit一样,每次变更都作为commit提交,可以追溯历史Dockerfile:这是一个从头构建镜像的配置文件,把地方你想改变(比如安装一个程序)写成一个bash命令,把它添加到Dockerfile中,它会按照你的要求执行所有的命令,然后生成一个新的镜像。Commit可以回溯历史,但改变的是对外的黑匣子。Dockerfile确实清楚地说明了所做的更改。所以一般情况下,正式的镜像构建都是使用Dockerfile。《dockercommit》将改变的Container保存为镜像参考:使用commit理解镜像形成dockercommit命令,可以将容器的存储层保存为镜像。也就是说,在原有镜像的基础上,增加容器的存储层,形成新的镜像。当我们将来运行这个新图像时,我们将拥有原始容器的最后文件更改。谨慎使用dockercommit:由于命令的执行,很多文件被更改或添加。这只是最简单的操作。如果是安装软件包,编译构建,会增加很多不相关的内容。如果不仔细清理,图像会非常臃肿。另外,使用dockercommit意味着对镜像的所有操作都是黑盒操作,生成的镜像也称为黑盒镜像。无从知晓。而且,就连制作镜像的人,过了一会也记不清到底做了什么。虽然dockerdiff可能会提供一些线索,但它远不能保证图像的一致性。这个黑盒镜像的维护是非常痛苦的。而且,回顾前面提到的镜像中使用的分层存储的概念,除了当前层,之前的每一层都不会改变。也就是说,任何修改的结果只在当前图层上标注,添加、修改而不改变上一层。如果使用dockercommit创建一个镜像,之后再修改,每次修改都会让镜像更加臃肿,被删除的上层不会丢失,会一直跟在镜像后面,即使根本无法访问。这会使图像更加臃肿。