登陆

极彩登录网址-Docker三大中心组件:镜像、容器与库房,你了解多少呢?

admin 2019-10-29 144人围观 ,发现0个评论

镜像(Image),容器(Container),库房(Repository)是咱们常说的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的联系:

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极彩登录网址-Docker三大中心组件:镜像、容器与库房,你了解多少呢? 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镜像名由库房名和标签组成,但有时分咱们会看到库房名和标签皆为的镜像,咱们称为这种镜像为虚悬镜像,飞行员如下图所示:

虚悬镜像一般是当咱们运用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)来完结的,如下图所示:

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三大中心组件:镜像、容器与库房,你了解多少呢?,如:

$ docker ps -a

有时分,咱们只想查到容器的id,能够用下面的指令:

$ docker ps -aq

履行成果

f4f184f5ffb9
f7d970e7d4c极彩登录网址-Docker三大中心组件:镜像、容器与库房,你了解多少呢?e

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三大中心组件:镜像、容器与库房,你了解多少呢?,便是Docker官方供给的一个库房服务器,不过其实有时分咱们不太需求过分区别这两个概念。

3.1 公共库房

公共库房一般是指Docker Hub,前面咱们现已屡次介绍怎么从Docker Hub获取镜像,除了获取镜像外,咱们也能够将自己构建的镜像存放到Docker Hub,这样,他人也能够运用咱们构建的镜像。

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

注册好了之后,能够在本地运用指令登录到Dokcer Hub了,进程如下

# 在指令行中输入
$ docker login

在输入账号密码登录到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能够简略轻松地创立或删去容器,镜像与容器的联系,就好像面向目标编程中的类与目标的联系,而库房则是存储和分发镜像的当地。

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

请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP