您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

Docker三大核心组件:镜像、容器与仓库,你了解多少呢?

时间:2019-09-09 09:42:35  来源:  作者:

镜像(Image),容器(Container),仓库(Repository)是我们常说的Docker的三大组件,在这篇文章中,我们就来一起详细地探索一番吧。

Docker三大核心组件:镜像、容器与仓库,你了解多少呢?

 

01 镜像(Image)

什么是Docker镜像?

简单地理解,Docker镜像就是一个linux的文件系统(Root FileSystem),这个文件系统里面包含可以运行在Linux内核的程序以及相应的数据。

谈到这里,我们可能需要先补充一点与Linux操作系统相关的知识:

一般而言, Linux分为两个部分:Linux内核(Linux Kernel)与用户空间,而真正的Linux操作系统,是指Linux内核,我们常用的Ubuntu,centos等操作系统其实是不同厂商在Linux内核基础上添加自己的软件与工具集(tools)形成的发布版本(Linux Distribution)。

因此,我们也可以把镜像看成是上面所说的用户空间,当Docker通过镜像创建一个容器时,就是将镜像定义好的用户空间作为独立隔离的进程运行在宿主机的Linux内核之上。

这里要强调一下镜像的两个特征:

  1. 镜像是分层(Layer)的:即一个镜像可以多个中间层组成,多个镜像可以共享同一中间层,我们也可以通过在镜像添加多一层来生成一个新的镜像。
  2. 镜像是只读的(read-only):镜像在构建完成之后,便不可以再修改,而上面我们所说的添加一层构建新的镜像,这中间实际是通过创建一个临时的容器,在容器上增加或删除文件,从而形成新的镜像,因为容器是可以动态改变的。

通过下面的示意图,我可以更好地理解Docker镜像与Linux的关系:

Docker三大核心组件:镜像、容器与仓库,你了解多少呢?

 

1.1 操作镜像的命令

Docker中与镜像操作相关的命令都在docker image这条子命令下,通过docker image --help这条命令,可以看到docker image子命令的详细文档,如下:

Usage: docker image COMMAND
Manage images
Commands:
 build Build an image from a Dockerfile(构建镜像的命令)
 history Show the history of an image(显示镜像构建历史过程)
 import Import the contents from a tarball to create a filesystem image(导入一个由容器导出的镜像)
 inspect Display detailed information on one or more images(显示一个镜像的详细信息)
 load Load an image from a tar archive or STDIN(从一个文件或标准输入流中导入镜像)
 ls List images(查看镜像列表)
 prune Remove unused images(删除虚悬镜像)
 pull Pull an image or a repository from a registry(从仓库拉取镜像)
 push Push an image or a repository to a registry(推送镜像到仓库)
 rm Remove one or more images(删除镜像)
 save Save one or more images to a tar archive (streamed to STDOUT by default)(保存镜像到文件)
 tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE(给镜像打标签)

1.2 获取镜像

在安装了Docker之后,我们本地并没有任何镜像,当然我们可以自己构建,不过更方便还是从Docker官方提供的仓库服务Docker Hub上拉取官方或第三方已经构建好的镜像。

拉取镜像可以使用docker image pull,其格式如下:

docker image pull [OPTIONS] NAME[:TAG|@DIGEST]

当然,docker image pull有更简洁的用法:如:

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

要拉取镜像,需要指定Docker Registry的URL和端口号,默认是Docker Hub,另外还需要指定仓库名和标签,仓库名和标签唯一确定一个镜像,而标签是可能省略,如果省略,则默认使用latest作为标签名,而仓库名则由作者名和软件名组成。

所以,在省略了那么参数后,比如我们想拉取centos镜像,可以使用下面简单的命令从Docker Hub上拉到:

$ docker pull centos

1.3 查看本地镜像

通过上面的方法我们将镜像拉取到了本地,那要如何查看本地有哪些镜像呢?通过下面的命令我们可以查看本地的全部镜像:

$ docker image ls

当然Docker提供了更简洁的写法,如下:

$ docker images

1.3.1 虚悬镜像

我们知道Docker镜像名由仓库名和标签组成,但有时候我们会看到仓库名和标签皆为<none>的镜像,我们称为这种镜像为虚悬镜像,如下图所示:

Docker三大核心组件:镜像、容器与仓库,你了解多少呢?

 

虚悬镜像一般是当我们使用docker pull拉取最新镜像时,生成的新的镜像,所以仓库名和标签给了新的镜像,旧的镜像仓库和标签则被取消,成为虚悬镜像。

我们可以使用下面的语句打印所有的虚悬镜像:

$ docker image ls -f dangling=true

一般的虚悬镜像已经没有什么作用了,所以可以清理掉的,下面的命令可以清除所有的虚悬镜像:

$ docker image prune

不过,如果我们想保留一些有用的虚拟镜像时,可以使用docker tag命令重新给镜像起个仓库名和标签:

$ docker tag 621d57f27e93 "test:1.0"

1.4 镜像导出与导入

如果想与别人共享某个镜像,除了从镜像服务仓库中pull镜像和把镜像push到仓库上去之外,其实我们还可以将本地构建好的镜像直接导出并保存为文件发送给别人,如下:

$ docker image save /tmp/test_image.tar.gz

而当你拿到别人导出的镜像文件,你可以使用docker load命令把镜像加载到本地的Docker镜像列表中,如下:

$ docker load < /tmp/test_image.tar.gz

1.5 删除本地镜像

要删除一个或多个本地的镜像,可以使用下面的命令:

docker image rm [option] IMAGE1,IMAGE2,...IMAGEn

也可以使用更简洁的方式,如:

docker rmi [option] IMAGE1,IMAGE2,...IMAGEn

可以使用镜像的长id、镜像短id、镜像摘要以及镜像名称来删除镜像,如下

$ docker rmi f7302e4ab3a8

一般更常用镜像的短id,如:

$ docker rmi f7302

使用镜像的摘要也可以删除镜像,镜像的摘要可以使用下面的命令查询:

$ docker image ls --digests

当然我们想要清除本地全部镜像时,可以使用下面的命令,不过一般不建议使用。

$ docker rmi $(docker images -qa)

另外,一般如果镜像已经被使用来创建容器,使用上面的命令删除会报下面的错误,告诉我们该镜像已经被使用,不允许删除。

Error response from daemon: conflict: unable to remove repository reference "MySQL:5.7" (must force) - container ccd406c07a78 is using its referenced image e1e1680ac726

对于已经被用于创建容器的镜像,删除方法有两种,一种是先把容器删除,再删除镜像,另一种则只需要在删除镜像的命令中跟一个-f参数便可,如:

$ docker rim -f f7302

1.6 使用docker commit构建镜像

上面的例子都是直接使用官方提供的镜像,其实,除了从官方仓库或其他镜像仓库拉取别人构建好的镜像外,我们也可以构建自己的镜像,一般有以下两种构建方式。

使用docker commit命令,我们可以将修改过的容器重新提交为一个镜像,如:

$ docker commit conntaner_id my-hello:1.0

使用这种方式构建的镜像,我们称为黑箱镜像,就是一个黑箱子一样,别人并不知道我们对容器做了哪些修改和操作,所以会对其安全性有所质疑。

所以不推荐使用这种方式构建镜像,下面我们介绍一种更加通用且方便的方式。

1.7 使用Dockerfile构建镜像

一般推荐编写Dockerfile来构建一种镜像,Docker Hub上的镜像都是采用这种方式构建的,采用这种方式的好处就是,我们不用把镜像分发给别人,而只是把Dockerfile和相应需要写入镜像的资料发给别人,别人也能自己构建镜像,安全透明。

1.7.1 编写一个简单的Got程序

package main
import "fmt"
func main(){
 fmt.Println("Hello Go")
}

将Go程序编译为可执行程序,如:

$ go build hello.go

1.7.2 编写Dockerfile文件

下面我们编写一个简单的Dockerfile文件,构建自己的第一个镜像,如下:

# 从一个空白的镜像开始
FROM stratch
ADD hello /
# 执行
CMD /hello

1.7.3 开始构建镜像

编写好Dockerfile文件后,需要使用docker build命令进行构建,docker build命令的格式如下:

$ docker build [OPTIONS] PATH | URL | -
# 注意最后的点(.)表示当前目录,即Dockerfile所在的目录
$ docker build -t "hello-go:1.0" .

上面只是简单演示了使用Dockerfile文件如何构建镜像,关于Dockerfile,还有许多更加深入地用法,我们之后有机再谈。

02 容器(Container)

容器与镜像的关系,就如同面向编程中对象与类之间的关系。

因为容器是通过镜像来创建的,所以必须先有镜像才能创建容器,而生成的容器是一个独立于宿主机的隔离进程,并且有属于容器自己的网络和命名空间。

我们前面介绍过,镜像由多个中间层(layer)组成,生成的镜像是只读的,但容器却是可读可写的,这是因为容器是在镜像上面添一层读写层(writer/read layer)来实现的,如下图所示:

Docker三大核心组件:镜像、容器与仓库,你了解多少呢?

 

2.1 操作容器的相关命令

Usage: docker container COMMAND
Manage containers
Commands:
 attach Attach local standard input, output, and error streams to a runnin g container
 commit Create a new image from a container's changes(把容器保存为镜像)
 cp Copy files/folders between a container and the local filesystem
 create Create a new container(创建一个新的容器)
 diff Inspect changes to files or directories on a container's filesyste m
 exec Run a command in a running container(在一个运行的容器中执行命令)
 export Export a container's filesystem as a tar archive
 inspect Display detailed information on one or more containers
 kill Kill one or more running containers(杀死一个或多个正在运行的容器)
 logs Fetch the logs of a container
 ls List containers(显示本地容器列表)
 pause Pause all processes within one or more containers
 port List port mAppings or a specific mapping for the container
 prune Remove all stopped containers
 rename Rename a container(重命名容器)
 restart Restart one or more containers(重启一个或多个容器)
 rm Remove one or more containers(删除一个或多个容器)
 run Run a command in a new container(运行一个新的容器)
 start Start one or more stopped containers
 stats Display a live stream of container(s) resource usage statistics
 stop Stop one or more running containers(停止一个或多个容器)
 top Display the running processes of a container
 unpause Unpause all processes within one or more containers
 update Update configuration of one or more containers
 wait Block until one or more containers stop, then print their exit codes

2.2 启动容器

启动容器有几种不同的方式,最常用的方法是使用docker run命令可以通过镜像创建一个容器,如:

# /bin/bash表示运行容器后要执行的命令
$ docker run -it centos /bin/bash

docker run命令有一些比较常用的参数,比如容器是一种提供服务的守护进程,那么通常需要开放端口供外部访问,如:

$ docker run -p 80:80 Nginx

也可以为容器指定一个名称,如:

$ docker run -p 80:80 --name webserver nginx

另外一种则是使用docker start命令重新启动已经停止运行的容器,如:

# container_id表示容器的id
$ docker start container_id

而对于正在运行的容器,也可以通过docker restart命令重新启动,如:

# container_id表示容器的id
$ docker restart container_id

2.3 查看本地容器列表

运行容器后,我们可以通过下面的命令查看本地所有容器:

$ docker container ls

不过docker container ls也简洁的写法:

$ docker ps

上面命令执行结果如下:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f4f184f5ffb9 redis:latest "docker-entrypoint.s…" 6 seconds ago Up 4 seconds 0.0.0.0:6379->6379/tcp myredis
f7d970e7d4ce mysql:5.7 "docker-entrypoint.s…" 7 seconds ago Up 5 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp docker-mysql

上面的命令只会显示正在运行的容器,如果要显示全部容器,包含退出执行的,可以加参数-a,如:

$ docker ps -a

有时候,我们只想查到容器的id,可以用下面的命令:

$ docker ps -aq

执行结果

f4f184f5ffb9
f7d970e7d4ce

2.4 停止容器

对于已经不需要的容器,可以使用docker stop命令停止其运行,如:

$ docker stop container_id1,container_id2...

批量停止容器,如:

$ docker stop $(docker ps -qa)

2.5 容器的三种运行模式

概括而言,Docker容器大体上有三种运行模式,如下:

2.5.1 运行后退出

下面语句创建的容器,在运行后会退出。

$ docker run centos echo "hellowrold"

2.5.2 常驻内存,就是守护进程的模式

如果容器中运行一个守护进程,则容器会一直处于运行状态,如:

$ docker run -d -p 80:80 nginx

2.5.3 交互式

我们也可以在运行容器时,直接与容器交互。

$ docker run -it centos /bin/bash

2.6 删除容器

$ docker container rm container_id

删除容器的命令也有简洁的写法,如下:

$ docker rm container_id

也可以像上面批量停止容器一样,我们也可以批量删除容器,如:

$ docker rm $(docker ps -qa)

2.7 进入容器

对于正在运行的容器,我们也可以通过docker exec命令再次进入容器,如:

$ docker exec -it f4f184f5ffb9 /bin/bash

需要指定容器的id或name,上面的命令我们用的是id。

2.8 导出容器为镜像

$ docker export -o ./image.tar.gz f4f184f5ffb9

将容器导出后,我们可以另外一台有安装Docker的电脑中将文件包导入成为镜像,如:

$ docker import image.tar.gz

上面讲的是容器的概念和一些常用的命令,关于容器,还可以设置数据卷和网络空间,这些我们有机会后面再谈。

03 仓库(Repository)

仓库(Repository)是集中存储镜像的地方,这里有个概念要区分一下,那就是仓库与仓库服务器(Registry)是两回事,像我们上面说的Docker Hub,就是Docker官方提供的一个仓库服务器,不过其实有时候我们不太需要太过区分这两个概念。

3.1 公共仓库

公共仓库一般是指Docker Hub,前面我们已经多次介绍如何从Docker Hub获取镜像,除了获取镜像外,我们也可以将自己构建的镜像存放到Docker Hub,这样,别人也可以使用我们构建的镜像。

不过要将镜像上传到Docker Hub,必须先在Docker的官方网站上注册一个账号,注册界面如下,按要求填写必要的信息就可以注册了,很简单的。

Docker三大核心组件:镜像、容器与仓库,你了解多少呢?

 

注册好了之后,可以在本地使用命令登录到Dokcer Hub了,过程如下

# 在命令行中输入
$ docker login
Docker三大核心组件:镜像、容器与仓库,你了解多少呢?

 

在输入账号密码登录到Docker Hub之后,便可以使用docker push命令把镜像推送到Docker Hub。

$ docker push test:1.0

3.2 私有仓库

有时候自己部门内部有一些镜像要共享时,如果直接导出镜像拿给别人又比较麻烦,使用像Docker Hub这样的公共仓库又不是很方便,这时候我们可以自己搭建属于自己的私有仓库服务,用于存储和分布我们的镜像。

Docker官方提供了registry这个镜像,可以用于搭建私有仓库服务,我们把镜像拉到本地之后,用下面命令创建该镜像的容器便可以搭建一个仓库服务,如下:

$ docker run -d -p 5000:5000 --restart=always --name registry registry

假设我们把一台IP为192.168.0.100的服务器作为仓库服务,并运行上面的语句,那么我们可以下面的语句重新构建上面的镜像,如:

$ docker build -t "192.168.0.100/hello-go:1.0" .

然后使用下面的语句推送到自己的私有仓库服务器:

$ docker push 192.168.0.100/hello-word:1.0

原文链接:https://juejin.im/post/5d57c1b5f265da03dc076ba6#heading-2

04 小结

镜像是静态的概念,构建完成之后便不能再修改,而容器则是一个动态的概念,使用Docker可以简单轻松地创建或删除容器,镜像与容器的关系,就如同面向对象编程中的类与对象的关系,而仓库则是存储和分发镜像的地方。

看完后如果觉得有所收获,就请转发一下点个赞再走呗~



Tags:Docker   点击:()  评论:()
声明:本站部分内容来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除,谢谢。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
前言这篇文章的内容在大概2周前就已经完成了,但是因为个人懒惰,所以一直没有进行总结和更新记录,大大的罪过啊,今天怎么也要开始重新梳理笔记了,接下来进入正题吧!之前的博文记录...【详细内容】
2020-08-12   Docker  点击:(1)  评论:(0)  加入收藏
一、思考01 什么是docker image镜像? docker image:◆ 是“样板车”, 不能正常行驶◆ 是一个包含了运行容器的各种资源的文件系统◆ 给image镜像添加各种参数, 可以生成一个...【详细内容】
2020-08-10   Docker  点击:(1)  评论:(0)  加入收藏
Docker 有不少好用的图形化管理客户端,可以简化我们的工作,提供效率。Portainer下面介绍5个比较流行的 Docker 客户端工具。Portainer 是一个轻量级的管理 UI ,可让你轻松管理...【详细内容】
2020-08-10   Docker  点击:(0)  评论:(0)  加入收藏
Docker让开发者可以打包应用程序及依赖包到可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。许多开发者关心如何在Docker容器中实现软件加密及授...【详细内容】
2020-08-07   Docker  点击:(0)  评论:(0)  加入收藏
安装dockerwindows系统,参考 docker官方文档Mac系统,参考 docker官方文档构建自定义ODOO镜像标准ODOO镜像可能不包含特别的python模块,或者Linux工具,此时需要 自定义 Odoo镜像...【详细内容】
2020-08-06   Docker  点击:(0)  评论:(0)  加入收藏
1 前言了解Docker容器的运行环境非常重要,我们把应用放在容器里执行,环境变量会直接影响程序的执行效果。所以我们要知道容器内部的环境变量,也要知道如何改变这些环境变量。2...【详细内容】
2020-08-05   Docker  点击:(1)  评论:(0)  加入收藏
制作Docker image 有两种方式:1. 使用 Docker container,直接构建容器,再导出成 image 使用2. 是使用 Dockerfile,将所有动作写在文件中,再 build 成 image。Dockerfile 的方式...【详细内容】
2020-08-03   Docker  点击:(2)  评论:(0)  加入收藏
Docker 虽好用,但面对强大的集群,成千上万的容器,突然感觉不香了。...【详细内容】
2020-07-30   Docker  点击:(5)  评论:(0)  加入收藏
1、 什么是Jenkins Jenkins的前身是Hudson Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。2 Jenkins安装准备工作 机器环...【详细内容】
2020-07-29   Docker  点击:(1)  评论:(0)  加入收藏
https://www.isolves.com/it/rj/czxt/windows/2020-07-28/25782.html实现目的:windows 10下安装docker,布置nginx+php5.6运行环境,布置多个docker实现负载均衡,实现成功,存在缺点...【详细内容】
2020-07-29   Docker  点击:(7)  评论:(0)  加入收藏
我们在上一章中创建了Docker File。现在是时候构建Docker File了。可以使用以下命令构建Docker文件-docker build 让我们进一步了解此命令。码头工人该方法允许用户构建自己...【详细内容】
2020-07-19   Docker  点击:(3)  评论:(0)  加入收藏
前言Docker 社区已经创建了许多开源工具,它们能帮我们处理各种用例。作者在本文中推荐了 5 款认为最有用的 Docker 工具,分别是 Watchtower(自动更新 Docker 容器)、docker-gc(...【详细内容】
2020-07-18   Docker  点击:(3)  评论:(0)  加入收藏
Docker常用命令集合给大家介绍一些常用的Docker命令,对你有帮助的同学建议收藏作为一个查询手册哦。Docker容器的一些命令按功能分类大致如下:Docker环境信息 info、version...【详细内容】
2020-07-08   Docker  点击:(4)  评论:(0)  加入收藏
有时候docker 镜像仓库中下载的镜像并不能满足我们的需求时,我们需要基于现有的镜像进行更改,构建符合自己的镜像构建自己镜像的方式有两种: 一、从已经创建的容器中更新镜...【详细内容】
2020-07-07   Docker  点击:(4)  评论:(0)  加入收藏
1 前言从没想到Docker也有可视化的工具,因为它的命令还是非常清晰简单的。无聊搜了一下,原来已经有很多Docker可视化工具了。如DockerUI、Shipyard、Rancher、Portainer等。查...【详细内容】
2020-07-07   Docker  点击:(3)  评论:(0)  加入收藏
部署服务失败时报错信息:network with name XXX already exists。出现这样情况的原因是docker容器已经未被使用或已不存在但其网络还存在,当你再用同样的服务名字命名当前部署...【详细内容】
2020-07-02   Docker  点击:(8)  评论:(0)  加入收藏
通过VS Code和Docker扩展成为Docker高级用户。> Photo by Michał Parzuchowski on Unsplash 您可以使用选择的语言来实施服务。 现在,您想将其容器化并在本地对其进行测试,然...【详细内容】
2020-07-01   Docker  点击:(2)  评论:(0)  加入收藏
一、功能说明容器在当今的云计算中极为重要,是构建微服务的重要组成部分。而一个微服务如果由多个容器,比如nginx+php+mysql,单个容器分开管理会非常麻烦 。目前华为云、阿里...【详细内容】
2020-06-19   Docker  点击:(2)  评论:(0)  加入收藏
Docker是一个用于开发、交付、运行应用程序的开放平台。利用Docker可以快速交付,测试和部署代码。所以值得我们学习下。...【详细内容】
2020-06-12   Docker  点击:(2)  评论:(0)  加入收藏
日志是服务运行过程中的一个关键环节,借助日志,我们可以排查定位问题,也可以借助集中化的日志管理平台(如ELK)来做一些必要的数据统计分析。在Docker环境中,日志的采集比传统环境...【详细内容】
2020-06-07   Docker  点击:(1)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条