龙空技术网

docker(2):仓库、镜像、容器

老王的日志 47

前言:

此刻同学们对“url各部分的含义”大概比较讲究,朋友们都需要分析一些“url各部分的含义”的相关文章。那么小编在网摘上网罗了一些对于“url各部分的含义””的相关资讯,希望小伙伴们能喜欢,大家一起来学习一下吧!

前文说过,如果想要用docker运行一个程序,则必须先获取到这个程序的镜像,比如,如果我想要运行一个nginx容器,就必须先有一个nginx镜像,我们可以基于同一个nginx镜像,启动多个nginx容器,就好比基于同一套nginx模板,启动了多个nginx服务一样,此处我们也可以类比着“虚拟机”去理解,程序镜像就好比虚拟机的“模板机镜像”,我们可以通过“模板机镜像”快速的创建出可运行的“虚拟机(虚拟机容器)”,docker也差不多,只不过docker是通过“程序镜像”创建出可运行的“程序容器”,最终对外提供服务,镜像是磁盘中的文件,基于镜像创建出容器,运行的容器就是内存中的进程。

现在我们就来动动手,下载一个镜像,并运行第一个docker容器吧。

在docker主机上运行如下命令,即可从docker hub仓库拉取一个别人制作好的镜像到本地。

docker pull docker.io/library/nginx:latest

如上所示,docker pull命令就是用来拉取镜像到本地的,从哪里拉取镜像呢?就是从下面这个url拉取。

docker.io/library/nginx:latest

那么我们来看一下这个url各个部分代表的含义,如下图所示,我们把这个url分成4个部分去理解

第1部分:代表从哪个仓库服务中心下载镜像,docker.io就是官方的仓库服务中心(其实就是docker hub,官方的仓库服务器),这个仓库服务器中有很多组织,也有很多个人,每个组织或者个人都可以在这个仓库服务器创建仓库,然后把镜像存放在仓库中,前文说过,docker hub的官网地址是registry.hub.docker.com,这个地址是方便我们从web页面查找镜像使用的,使用命令行从docker hub拉取镜像时,默认使用的是docker.io这个地址。除了docker官方的docker hub,还有一些其他仓库服务器,我们也可以自建仓库服务器,当使用其他仓库服务器或者自建仓库服务器时,要把第1部分改为对应的域名或IP,如果我们就是想要从官方的docker hub下载镜像,上图中的第1部分可以不写,当省略第1部分时,默认就是使用docker.io这个仓库服务器的,仓库服务或者仓库服务中心的英文原文是registry,简单来说,第1部分就是registry的地址。

第2部分:代表组织或者个人的“命名空间”,命名空间是什么意思呢?举个例子,我们每个人都可以docker hub上注册自己的账号,然后使用自己的账号在docker hub上创建仓库,比如,我在docker hub上的账号id是zsythink,那么我就可以在docker hubzsythink命名空间下创建仓库,如果我创建了一个名为nginx的仓库,那么我就可以通过如下url,获取到这个nginx仓库中的镜像

docker.io/zsythink/nginx

同理,如果你在docker hub上的id是zhangsan,你也创建了一个名为nginx的仓库,那么你就可以通过下面这个url获取仓库中的镜像

docker.io/zhangsan/nginx

当然,你也可以创建出多个仓库,比如再创建一个名为redis的仓库,专门用来存放redis镜像,那么你就可以通过如下url来获取这个redis仓库中的镜像

docker.io/zhangsan/redis

聪明如你一定看出来了,上例中的nginx或者redis,才是真正的仓库名,也就是我们要说的第3部分,第2部分命名空间是用来区分组织或者个人创建出的仓库的,每个人都在自己的命名空间下创建仓库,即使仓库名重复,也可以看出是由不同的人创建出的仓库,命名空间可以代表个人,也可以代表一个组织,比如,“技术菜责任有限公司”的“jenkins”镜像仓库可能就长成下面这个样子

docker.io/jishucai/jenkins

图例中的第2部分是library,这个命名空间比较特殊,library是专门给上游软件提供商官方使用的命名空间,比如,nginx官方(或者说nginx组织)的nginx的仓库,并不会使用docker.io/nginx/nginx,而是会使用docker.io/library/nginx,同理,redis官方的redis仓库,也不会使用docker.io/redis/redis,而是会使用docker.io/library/redis,官方仓库中的镜像被称之为官方镜像,docker有一个专门的团队,负责审核和发布官方镜像,这个团队会与软件提供商、社区以及安全专家合作,共同维护这些官方仓库中的镜像,官方镜像的更多内容,可以参考如下链接,当我们想要从官方仓库下载镜像时,是可以省略library的,比如,我想要直接从docker hubnginx官方仓库中下载镜像,可以直接使用docker pull nginx命令,此命令等效于docker pull docker.io/library/nginx,需要注意,只有官方仓库可以省略(即只有library可以省略),其他组织或者个人的命名空间不能省略。

第3部分:代表仓库名,在介绍第2部分时,我们已经描述的比较清楚了,我们可以在自己的命名空间下创建很多仓库,比如nginx仓库、redis仓库等,nginx仓库专门用来存放nginx镜像,redis仓库专门用来存放redis镜像,创建仓库时,我们可以选择是否公开仓库,如果不公开,只有通过认证后,才能够获取仓库中的镜像,仓库的英文原文为repository,简单来说,第3部分就是repository的名字。

第4部分:代表镜像对应的标签(tag),通常情况下,我们会通过标签对镜像的版本进行区分,比如,nginx仓库中有十个nginx镜像,第一个nginx镜像对应的版本为nginxV1.1,第二个nginx镜像对应的版本为nginxV1.2,那么第一个镜像的tag就是1.1,第二个镜像的tag就是1.2,以此类推,当我们在拉取镜像时,如果没有指定tag,默认会使用”latest”作为tag,也就是图例中第4部分的标签,”latest”表示最新版,当省略标签或者标签为latest时,会从仓库中下载最新版本的镜像,但是今天的最新版可能就是明天的旧版本,所以,在生产环境中,不要使用latest这个tag,或者说,不要省略tag,最好是指定一个明确的版本tag,这样做是为了防止”latest”这个特殊的tag对应的镜像发生了更新。tag和仓库名之间需要用冒号隔开,比如,nginx:1.21表示nginx库中的tag为1.21的镜像。

了解完上述每个部分的含义后,我们再来回顾一下之前下载镜像命令的含义

docker pull docker.io/library/nginx:latest

上述命令表示从docker hubnginx官方仓库中拉取tag为latest的镜像(即从nginx官方仓库中拉取最新版本的nginx镜像),上述命令与如下命令等效。

docker pull nginx

刚才说过,我们可以直接访问registry.hub.docker.com,通过web页面搜索我们想要使用的镜像,现在我们就来看看通过网页是怎么操作的,打开docker hub官网,搜索nginx

搜索结果如下图,可以看到,搜索出了很多包含nginx关键字的仓库,这些nginx仓库由不同的组织或者个人创建,带有”Official Image”标识的仓库就是上文所说的官方仓库,也就是说,下图中的第一条搜索结果就是nginx的官方仓库(即library/nginx,而且展示时省略了library),如果你不信任其他发布者,或者没有特殊要求,应该首选官方仓库使用,毕竟这样更加安全,从下图可以看出,官方仓库中的镜像下载次数和星星的数量也是最多的,不过,话不能说死,其他发布者的仓库中也会有很好用的镜像,但前提是需要确保安全,或者你可以完全信任他。

点击进入nginx官方仓库的详情页,如下图所示,可以看到,页面中提示我们,运行”docker pull nginx”命令,以便拉取这个镜像,详情页中还有多个页签,默认展示的是”Description”页签,其中描述了这个镜像的详细信息,比如镜像的版本标签、使用方法和命令等等,除了”Description”页签,还有”Reviews”页签和”Tags”页签,”Reviews”页签中展示了大家对这个镜像的评价,”Tags”页签中详细的列出的镜像相关的“标签”。

点击上图中的”Tags”页签,可以看到一个镜像列表(或者说可以看到一个tag列表,每个tag对应一个镜像),如下图所示,在每个tag的后面,docker都很贴心的给出了拉取对应镜像的命令,方便我们复制使用,在下载镜像时,我们指定的tag必须是在这个列表里面存在的,否则是无法下载对应的镜像的。

除了通过web页面,我们也可以使用命令行去搜索对应的仓库,以nginx为例,使用docker search nginx命令,即可搜索出包含nginx关键字的仓库,但是使用命令搜索出来的信息可读性和详细程度都不如web页面,最明显的就是使用docker search命令搜索出的结果没有对应的tag信息可以查看,而且docker没有专门的子命令可以搜索远程仓库的tag信息,所以我个人还是比较喜欢使用web页面查看需要下载的镜像,如果想要通过命令行去查看仓库的tag信息,可以安装skopeo命令,通过skopeo inspect命令可以查看到对应仓库的tag列表,或者,在命令行中直接使用curl命令访问如下链接,也可以获得对应仓库的tag信息。

命名空间/仓库名/tags

我已经执行了拉取镜像的命令,也就是说,我本地已经有nginx的镜像可以使用了,我们可以使用docker images命令,查看本地都有哪些镜像

# docker imagesREPOSITORY   TAG       IMAGE ID       CREATED       SIZEnginx        latest    605c77e624dd   5 weeks ago   141MB

如上所示,我的本地目前只有一个镜像,这个镜像来自nginx库,tag为latest,它的镜像ID为605c77e624dd。

执行如下命令,即可基于上面的镜像,运行一个nginx容器

docker run --name nginx-demo -d -p 80:80 nginx:latest

上述命令表示,基于nginx:latest这个镜像,创建一个名为nginx-demo的容器,并启动这个容器,-d表示后台运行这个容器,-p 80:80表示将docker主机的80端口和容器内nginx服务的80端口进行映射,映射后,访问docker主机的80端口,即相当于访问容器内的nginx服务的80端口,我们先不用纠结这些参数的含义,因为这些参数涉及的话题过多,后面的文章我们再详细的讨论,现在只需要能把这个容器运行起来即可,执行上述命令后,查看docker主机的80端口,是已经监听的,访问docker主机的ip地址,就可以看到nginx的默认页面了,如下图

访问到上述页面,就能证明我们的nginx容器已经正常运行了,我们可以使用docker ps命令,查看正在运行中的容器,如下:

# docker psCONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                NAMES55e0b2020fc0   nginx:latest   "/docker-entrypoint.…"   16 minutes ago   Up 16 minutes   0.0.0.0:80->80/tcp   nginx-demo

可以看到,当前只运行了一个容器,容器的ID是55e0b2020fc0,容器使用的镜像是nginx:latest,容器的名称是nginx-demo,我们可以使用docker stop nginx-demo命令和docker start nginx-demo命令来停止或者启动这个容器,动手操作一下吧。

虽然文章啰嗦了很多,但是实际的操作很少,我们只是下载了镜像,然后通过镜像启动了一个容器而已,当然,这只是我们的第一步,剩下的就在之后的文章中讨论吧。

标签: #url各部分的含义