参考资料
引言
Docker是什么?
Docker镜像是什么?
Docker容器是什么?
Docker镜像和容器之间的关系
我们为什么要使用Docker?
使用Docker
mac安装Docker
Docker初体验
Docker常用命令
总结
百度百科:https://baike.baidu.com/item/Docker/13344470?fr=aladdin#reference-[1]-12232642-wrap
官方资料:https://www.docker.com/resources/what-container
RUNOOB:https://www.runoob.com/docker/macos-docker-install.html
https://www.runoob.com/docker/docker-command-manual.html
事情的起因是这样的,在一个阳光明媚的下午,我正听着歌,喝着奶茶,敲着代码,突然被拉进了一个项目群,被告知我负责的一个web工程要容器化,需要使用Docker,我真是一脸懵逼,就如同出门带着老婆,吃着火锅,唱着歌,突然就被麻匪劫了。没有办法,只能当个师爷,开始学习使用Docker,谨以此篇记录我学习的经验。
在开始学习使用Docker之前,首先要搞清楚Docker是什么?Docker又有什么用?
按照百度百科介绍:“Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。”
这一段话相信很多同学跟我一样,第一次看到的时候想打写这个词条的人,一点都不通俗易懂,后来通过学习发现,这段文档少了一些很重要的概念,比如镜像是什么?容器又是什么?下面就这两个概念进行解答,之后再对这段话进行解释。
不同与常见装机用的系统镜像,Docker镜像本身就是一个完整的可运行的操作系统环境,包含了文件目录和环境配置。Docker镜像只对Docker引擎有用,在Docker下专门有个镜像私有仓库进行镜像管理,镜像可以从远端公共仓库下载,也可以在已有镜像的基础上,创建新镜像。Docker提供一套非常简单方便的机制来自定义镜像。
Docker容器可以看作一个轻量的虚拟机,它具备虚拟机的功能,却比虚拟机更加灵活。Docker镜像在Docker引擎中启动,每一次启动都会生成一个Docker容器,一个镜像可以生成多个容器,容器与容器之间相互独立。Docker容器具有标准性(同一Docker容器可以在任何装有Docker的系统运行)、轻量性(Docker容器和操作系统共用一个内核)、安全性(应用在容器中更加安全,Docker提供了很强的隔离功能)的特点。而且Docker引擎提供了丰富的方法来管理容器。
镜像启动后生成容器,容器是镜像实例化后的产物,容器也可以通过Docker引擎反过来生成镜像,不过这种一般在调试时使用,镜像如何生成在后文中会详细说到。
整清楚了这两个概念,再回到一开始的问题,什么是Docker,我们在百度百科的基础上,对其进行解释,Docker 是一个开源的应用容器引擎,开发者可以通过Docker引擎打包他们的应用以及依赖包到一个可移植的Docker镜像中,然后将镜像发布到任何流行的 Linux或Windows 机器上,只要机器上装有Docker,就可以启动镜像,生成Docker容器。容器是完全使用沙箱机制,相互之间相互独立,如同两台不同的虚拟机一般。不知道小伙伴有没有一种豁然开朗的感觉,如果还有疑问,先不要着急,可以先存疑,在实践中慢慢了解,学习。
搞懂了Docker是什么,那它又有什么用?相信和他人协作工作过的人都有过类似的经历,当我们提交了某些代码,同事突然来找你说代码有问题,这时候一般都会回怼回去,这在我电脑上跑的好好的,怎么到你那就不行了,肯定是你环境有问题,你再看看!
日常学习和工作中,我们有时候会被莫名其妙的环境问题搞得焦头烂额,特别是在当乙方的时候,当你想在甲方的主机装个gcc包,都要求爷爷告奶奶走一堆流程,最崩溃的是装完一个之后发现又缺少了新的包,又要走一堆重复的流程!Docker则完美的解决了刚刚的问题,我们预先在本机生成一个可执行的Docker镜像,镜像里面包括我们的应用程序和它所依赖的环境,啥都不用改扔到任何一台装有Docker引擎的主机,都可以直接运行。极大的方便了项目的发布和迁移。
纸上得来终觉浅,绝知此事要躬行。说完理论知识,总要去实践一番,这样才算学会了。下面就开始我的实操流水账了,其中会有一些错误案例供大家嘲笑,希望大家嘴下留情。
因为windows系统使用Docker比较麻烦,因此这里我在mac环境下进行操作。
#打开终端 通过命令安装Docker
brew cask install docker
安装成功后,会在上方的菜单中生成一个小鲸鱼的图标,启动成功如图所示。
启动Docker后,打开终端,从公共仓库中拉取一个busybox镜像,控制台命令如下。
➜ ~ pull busybox
Using default tag: latest
latest: Pulling from library/busybox
bdbbaa22dec6: Pull complete
Digest: sha256:6915be4043561d64e0ab0f8f098dc2ac48e077fe23f488ac24b665166898115a
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 6d5fcfe5ff17 9 days ago 1.22MB
Docker镜像busybox虽然只有1.22MB,但它提供了精简的Unix工具集,因此在这里使用该镜像来玩Docker。
#使用交互模式启动busybox,并进入生成的容器
➜ ~ docker run -it busybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # echo "hello world"
hello world
可以看到我们通过docker run -it busybox进入容器中,并在容器中执行echo "hello world"输出hello world(程序猿的习惯?)。然后可以再启动一个终端,通过命令docker ps查看所有启动着的容器,如果要看所有容器,可以通过docker ps -a查看。
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0a425b1f5dce busybox "sh" 30 seconds ago Up 29 seconds intelligent_solomon
#镜像0a425b1f5dce通过docker stop 0a425b1f5dce命令停止后
➜ ~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0a425b1f5dce busybox "sh" 6 minutes ago Exited (0) 5 minutes ago intelligent_solomon
至此初次使用Docker就划一段落了,总的来说Docker对开发者还是非常友好的,接下来就要学以致用,将web工程容器化了。
Docker常用命令在RUNOOB都有介绍,这里就不一一搬运了!
初次学习Docker,越学习越觉得设计出Docker的人真是太吊了。以前只会使用虚拟机的我看到Docker仿佛打开了新世界的大门,Docker真的比虚拟机方便管理太多了。继续努力学习吧,向大神靠齐,希望有朝一日可以望其项背。
最后,Docker、镜像、容器就了解的差不多了,终于可以开始干活了,当时因为觉得Dockerfile太麻烦当时就没有细看,直接抄家伙开干,这也为之后的重复返工埋下了伏笔,因为篇幅关系,本篇不讲Docker镜像生成相关内容,欲知后事如何,请听下回分解。