Docker最新简单易懂使用教程

对Docker的理解

我相信看到这篇文章的同学肯定不需要我大讲特讲docker的基本原理,大家一定在概念方面都有了一定的了解,如果还有一些些小模糊的话,看看能不能通过我对于docker在学习过程中的一些理解上的小转变来提供一些帮助。

  1. 都说docker容器类似于虚拟机,这句话直接让我把容器跟系统挂钩了,因为一般使用虚拟机是为了使用特定的操作系统,比如linux。后来我发现不能这样理解,容器跟虚拟机类似的地方只在于底层结构的一些特征(不细说),而在使用上不尽相同,容器更在我看来更类似于软件,比如我可以用docker直接运行mysql的镜像,来获取mysql容器,这与从官网下载mysql安装包安装,并启动mysql程序功能是一样的,而docker更简单,不需要安装。所以,我对容器在使用层面的理解可以大概归纳为:不依赖宿主机,拥有独立运行环境的可执行程序

  2. 关于项目发布镜像的理解,最初也是很奇怪的项目,也归咎于上面提到的虚拟机对比,初期项目如果打了镜像,使用容器运行后,如果需要修改,我始终想直接修改容器,因为我默认他是一个系统,按照以往的开发经验,肯定是去系统中重新发布的…可是不是这样的,项目发布的镜像,其实可以单纯理解成jar包或者war包,而启动的容器可以理解为一次性的程序,如果出了bug或者需要更新,简单的将容器和镜像删除,使用最新镜像启动即可,类比使用war包发布后台工程,难道不是每次替换新的war包吗?谁会去直接修改有问题的war包?

Docker,可以说是一个终端命令行的虚拟机,但更准确的说法,其实应该是一个虚拟环境。比如,你想要在PC上无缝使用Linux么?那么虚拟机并不是你唯一的出路,你还有Docker!我更愿意称Docker为一个容器,当然这只是Docker的一个狭义解释,Docker不止是一个容器。Docker包含3个重要概念:

  • 一个,是镜像(Image),镜像是静态的、可以被用户互相分享的文件。我们玩过双系统和虚拟机的人都知道,首先你需要一个.iso镜像,才能安装系统。Docker中的镜像也是这个东西,镜像是静态的,你不能对他操作,只能pull别人的镜像或者push自己的镜像。

  • 还有一个,是容器(Container),前面说过,镜像是静态不可操作的,只能被分享和下载,那什么是能被操作的呢?就是容器里!容器可以理解为镜像的动态状态,也就是我们虚拟机中系统装好后的状态,其实这么说是不对的,容器最符合的描述应该是Linux的iso文件的Live CD模式,比如我们玩双系统时都进入过Live CD模式,不安装系统而直接进入系统,很神奇是吧,Docker的容器就是这个概念,只不过更加轻量更加迅速便捷。但是Live CD的害处就是你关机后作出的修改安装的软件全部gg,容器也是一样,一旦被直接推出,之前安装的gcc啊vim啊啥的就会全部gg掉。如果要保存修改,就需要将当前容器封装成一个新的镜像,这样下次启动这个新的镜像后之前作出的修改还都在。

  • 最后,是仓库(Repository)。各位在前面看到我写的pull和push什么的,有没有晕?不知道各位对于git熟悉不熟悉,Docker中的仓库很像git的代码仓库,你可以pull自己之前push到自己仓库的镜像到本地,也可以pull别人push到公共仓库的镜像到自己本地。说白了就是百度云盘,你可以上传(push)自己做好环境的Docker上去,也可以下载(pull)自己云端的镜像到本地。同时,我们知道百度云最大的特点就是分享(你懂的嘿嘿嘿),类比Docker,如果你得到百度云分享链接(别人的镜像名字、标签和别人的用户名),你还可以下载(pull)别人分享的镜像到自己的本地,别人也可以下载(pull)你的镜像,因为Docker仓库都是公共的。当然,每个免费用户有一个名额把自己的一个镜像设为私有,也就是禁止被分享给别人,类比百度云上你自己保存的而没有被生成分享链接的小姐姐。

有了上面理解方面的转变,后面学习特别是使用起来,就清晰狠多了。

Docker的使用

废话不多说,docker的核心功能一定是启动镜像,也就是run命令,下面我们以nginx为例,介绍如何使用docker启动镜像

打开终端,执行如下命令:

终端会输出:

并且光标会在最后一行闪烁,意味着命令再继续,这是镜像启动的容器已经在运行中了,使用 ctrl+c 则会停止运行,如果想要使容器在后台运行,可以在命令中加入 -d :

终端会输出启动的容器id:

众所周知nginx默认端口为80,我们在浏览器访问 http://localhost 测试一下,可以看到访问失败了,这是为什么呢?原因是容器类似于虚拟机,有自己的网络环境,80只是容器开放的端口,并不是本地宿主机的端口,所以我们无法通过宿主机的端口去访问容器。如果想要访问成功,则需要将容器开放端口,映射到本地宿主机端口,再通过映射的宿主机端口访问。

我们启动命令中加上 -p 容器开放端口 来映射端口

然后使用如下命令查看正在运行的容器

终端输出:

可以看到正在运行的容器有两个,观察PORTS可以看到,一个是映射了端口的 0.0.0.0:32768->80/tcp ,而另一个之前启动的是没有映射端口的80/tcp 。

那我们用查到的映射端口再来访问一次试试看 http://localhost:32768 ,


可以看到,访问成功了。

但是映射的端口是随机的,总不能每次启动后都要先查询一下宿主机的端口才能访问吧,太麻烦。我们可以使用 -p 宿主机端口:容器端口 的方式指定要映射的宿主机端口

查询一下:

可以看到有三台容器正在运行,最新的容器映射了宿主机的80端口,我们再来访问 http://localhost 测试一下,成功!

我们现在启动了三个容器,但是只需要一个,要停止容器运行,可以使用:

通过容器的id停止,也可以:

通过容器的命名来停止。我们在查询领命中添加 -a 来查询所有容器,包括停止的:

终端输出:

观察STATUS字段,可以看出多余的容器已经被我们停掉了。如果想要删除容器,同样可以通过容器id和name两种方式,使用如下命令:


再次查询会发现,这两个容器已经不见了。

通过上面的实验,我们可以发现,同一个镜像,我们可以启动任意多个容器,只要机器资源够用。

那么关于镜像的管理,我们可以使用如下命令查询本地镜像

终端输出:

可以看到我们拉下来的nginx镜像。如果想要删除镜像,可以通过镜像名或者镜像id,使用如下指令:

删除前要确保,将通过此镜像启动的容器都删除掉。

这篇文章就介绍这么多,有人可能说,为什么不讲自己怎么创建镜像,怎么不讲创建自己的repository,将镜像push到repository中去,怎么不讲挂载,怎么不讲Dockerfile,怎么不讲compose等等。

PapaMan并不想按照系统的方式按部就班的讲解,况且这只是第一篇,后面会慢慢拓展。我更希望按照我们学习新知识时管用的思维方式,理解方式,来讲解;以快速上手,理解最基本核心功能为目的,掌握了核心再去拓展,你会发现容易很多,要先学会开机,才能上网、看视频、玩游戏不是?希望刚刚入门,或者希望了解docker的同学,看了这篇分享后,已经足够将容器玩的飞起。

你会发现,本地的mysql,redis,等等组件,还需要安装吗?用docker一键启动不就行了?;)


docker run 与docker start的区别

-------

 

 
docker run 只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start 即可。
docker run相当于执行了两步操作:将镜像放入容器中(docker create),然后将容器启动,使之变成运行时容器(docker start)。
 

 

7.png

而docker start的作用是,重新启动已存在的镜像。也就是说,如果使用这个命令,我们必须事先知道这个容器的ID,或者这个容器的名字,我们可以使用docker ps找到这个容器的信息。

owncloud

因为容器的ID是随机码,而容器的名字又是看似无意义的命名,我们可以使用命令

docker rename  old_name new_name

给这个容器命名。这样以后,我们再次启动或停止容器时,就可以直接使用这个名字。

docker [stop] [start]  new_name

而要显示出所有容器,包括没有启动的,可以使用命令

docker ps -a


最后编辑于:2018/09/05作者: admin

发表评论