Docker(二):镜像管理

一:镜像介绍

简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统
那么镜像从哪里来?
Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像:https://hub.docker.com/

二:UnionFS(联合文件系统)

union文件系统(UnionFS)是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统 下(unite serveral directorires inot a single virtual filesystem)。union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
例如:

[root@t-docker chenzx]# ls dir1
a.txt  b.txt
[root@t-docker chenzx]# ls dir2
c.txt d.txt
# 把dir1和dir2挂载到dir目录下,最终两个目录内容会显示在一个目录下:
[root@t-docker chenzx]# ls dir
a.txt  b.txt    c.txt d.txt

三:Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统称为联合文件系统(unionFS)。
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统, 在docker镜像的最底层就是bootfs 。这一层与我们典型的linux/unix系统是一样的,包含boot加载器和内核。当boot加载完成之后,整个内核就都在内存中了。此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system),在bootfs之上,包含的就是典型的linux系统中的/dev/,/proc,/bin,/etc/等标准目录和文件。rootfs就是各种不同操作系统发行版,比如ubuntu,centos等。
Docker镜像加载原理
ubuntu和centos的内核相同,只是rootfs布局不一样而已。
平时我们安装虚拟机的centos都是好几个G,为什么docker这里才200M?

[root@node01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              9f38484d220f        5 weeks ago         202 MB

对一个精简的os,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以了,因为底层直接用宿主机的kernel,自己只需要提供rootfs就行了。由此可见,对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
docker为什么快,就是因为共有宿主机的内核。
以我们的pull为例,在下载的过程中,我们可以看到docker的镜像好像是在一层一层的下载。

[root@node01 ~]# docker pull tomcat	 # 默认拉取的是tomcat:latest版本,拉取指定版本镜像:tomcat:3.2
Using default tag: latest
Trying to pull repository docker.io/library/tomcat ... 
latest: Pulling from docker.io/library/tomcat
e79bb959ec00: Pull complete 
d4b7902036fe: Pull complete 
1b2a72d4e030: Pull complete 
de423484a946: Pull complete 
ceaac3b844f7: Pull complete 
88f01b722a52: Pull complete 
c23be56a9ac1: Pull complete 
d852ffd6d31f: Pull complete 
11775a3d792d: Pull complete 
13fdd17462ac: Pull complete 
2092995a1e54: Pull complete 
Digest: sha256:6cb1b64fa315eab22803c7cde8408b91dedba8fbf5f01d4def96d95f79344a17
Status: Downloaded newer image for docker.io/tomcat:latest

好了,有了上面分层的概念后,我们思考一个问题,为什么tomcat的镜像比centos镜像还大?

[root@t-docker chenzx]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat              latest              690cb3b9c7d1        7 days ago          463MB
centos              latest              5182e96772bf        3 weeks ago         200MB

这是因为Tomcat的镜像是由kernel、centos、jdk8、tomcat组成,所以比centos镜像大。
Docker镜像的原理
为什么docker镜像要采用这种分层结构呢? 一句话, 分层最大的好处是:共享资源 。
比如,有多个镜像都是从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
镜像的特点: 镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层被称为容器层,容器层之下的层都是镜像层。

四:镜像管理命令

Docker镜像管理命令

4.1 搜索镜像

[root@node01 ~]# docker search centos
INDEX       NAME                                         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/centos                             	The official build of CentOS.                   				5306      [OK]       
docker.io   docker.io/ansible/centos7-ansible            	Ansible on Centos7                              			121                  [OK]
docker.io   docker.io/jdeathe/centos-ssh                 	CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x...   				107                  [OK]
docker.io   docker.io/consol/centos-xfce-vnc             	Centos container with "headless" VNC sessi...   				85                   [OK]
docker.io   docker.io/imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              			54                   [OK]
……………………………………………….

搜索点赞数超过30的tomcat镜像:

[root@node01 ~]# docker search -s 30 tomcat			# -s stars 搜索点赞数超过30的tomcat镜像
Flag --stars has been deprecated, use --filter=stars=3 instead
INDEX       NAME                                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/tomcat                     		Apache Tomcat is an open source implementa...   			2352      [OK]       
docker.io   docker.io/tomee                      		Apache TomEE is an all-Apache Java EE cert...   			65        [OK]       
docker.io   docker.io/dordoka/tomcat             		Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 ba...   			53                   	[OK]
docker.io   docker.io/davidcaste/alpine-tomcat   		Apache Tomcat 7/8 using Oracle Java 7/8 wi...   			34                   	[OK]

4.2 拉取镜像

[root@node01 ~]# docker pull tomcat	# 默认拉取的是tomcat:latest版本,拉取指定版本镜像:tomcat:3.2
Using default tag: latest
Trying to pull repository docker.io/library/tomcat ... 
latest: Pulling from docker.io/library/tomcat
...................................................

显示本机已有的镜像:

[root@node01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/tomcat    	latest              	5a069ba3df4d        		10 days ago         465 MB

显示完整的IMAGE信息:

[root@node01 ~]# docker image ls --no-trunc
REPOSITORY          TAG                 IMAGE ID                                                                  CREATED             SIZE
docker.io/nginx     1.14-alpine         sha256:8a2fb25a19f5dc1528b7a3fabe8b3145ff57fe10e4f1edac6c718a3cf4aa4b73   			7 days ago          		16 MB
docker.io/busybox   latest              sha256:af2f74c517aac1d26793a6ed05ff45b299a037e1a9eefeae5eacda133e70a825   		2 weeks ago         		1.2 MB

删除docker镜像:

docker rmi -f tomcat
docker rmi -f nginx tomcat hello-world				# 删除多个镜像
docker rmi -f $(docker images -qa)					# 删除全部镜像

4.3 镜像的commit操作

docker commit:表示提交容器副本使之成为一个新的镜像 。假设我们在docker中运行了一个Tomcat容器,我们在tomcat容器中做了一些我们自定义的修改,然后我们这个修改的tomcat容器进行commit,这样我们就形成了一个 新的自定义镜像 。

命令格式: docker commit -m="提交的描述信息" -a="作者"  容器id  要创建的目标镜像名:[标签名]

1:首先从hub上下载tomcat镜像到本地并成功运行

[root@t-docker chenzx]# docker images tomcat
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat              latest              690cb3b9c7d1        7 days ago          463MB

2:运行tomcat容器

[root@t-docker chenzx]# docker run -it -p 8888:8080 tomcat
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /docker-java-home/jre
30-Aug-2018 08:37:01.728 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
30-Aug-2018 08:37:01.736 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
30-Aug-2018 08:37:01.739 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 555 ms
[root@t-docker chenzx]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
5c83a1f3aea4        	tomcat              	"catalina.sh run"   			8 minutes ago       Up 8 minutes        0.0.0.0:8888->8080/tcp   quirky_zhukovsky

3:删除上一步镜像生成的tomcat容器中的某些文档

[root@t-docker chenzx]# docker exec -it 54a817e3ce05 /bin/bash	# 进入tomcat容器
root@54a817e3ce05:/usr/local/tomcat# cd webapps/
root@54a817e3ce05:/usr/local/tomcat/webapps# ls -l
total 4
drwxr-x---  3 root root  306 Aug 23 00:47 ROOT
drwxr-x--- 14 root root 4096 Aug 23 00:47 docs
drwxr-x---  6 root root   83 Aug 23 00:47 examples
drwxr-x---  5 root root   87 Aug 23 00:47 host-manager
drwxr-x---  5 root root  103 Aug 23 00:47 manager
root@54a817e3ce05:/usr/local/tomcat/webapps# rm -rf docs/
root@54a817e3ce05:/usr/local/tomcat/webapps# ls -l
total 0
drwxr-x--- 3 root root 306 Aug 23 00:47 ROOT
drwxr-x--- 6 root root  83 Aug 23 00:47 examples
drwxr-x--- 5 root root  87 Aug 23 00:47 host-manager
drwxr-x--- 5 root root 103 Aug 23 00:47 manager

4:通过上一步,当前的Tomcat运行实例是一个没有文档内容doc目录的容器,以它为模板,commit一个没有doc的tomcat新镜像chenzx/tomcat02,chenzx就是自己取的命名空间

[root@t-docker chenzx]# docker commit -a='xiaoxin' -m='del tomcat docs' 54a817e3ce05 chenzx/tomcat02:1.2	# -a作者;-m标准信息
sha256:24c3d89d4d043e4fb97f0cf4f3b94bcf96b5600a062fc8de4e39a7763d20badf
[root@t-docker chenzx]# docker images	# 查看刚刚commit的镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
chenzx/tomcat02     	1.2                 	24c3d89d4d04        	7 seconds ago       463MB
tomcat              	latest              	690cb3b9c7d1        		7 days ago          463MB

5:把正在运行的容器全部删除

docker rm -f $(docker ps -q)

6:以刚刚commit的tomcat镜像生成一个新的容器

docker run -it -P chenzx/tomcat02:1.2
[root@t-docker chenzx]# docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                     NAMES
c6c68b224e84        chenzx/tomcat02:1.2   	"catalina.sh run"   		24 seconds ago      Up 24 seconds       0.0.0.0:32770->8080/tcp   awesome_sammet

此时再次访问tomcat时可以看到,我们用自定义的jtomcat1.2镜像,生成的容器里面没有doc目录
以守护式方式启动tomcat容器(-d参数)

[root@t-docker chenzx]# docker run -d -p 6666:8080 tomcat
23b4ec6f24b854f682631c5a9b6bcfc0c685dbec46d1867faea4b534f5791452
[root@t-docker chenzx]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
23b4ec6f24b8        tomcat              	"catalina.sh run"   			5 seconds ago       Up 4 seconds        0.0.0.0:6666->8080/tcp   flamboyant_almeida

五:镜像的备份与加载

这里所说的镜像的备份是将镜像打成tar包,当然也可以使用自建的镜像仓库

docker save jdk:1.8 -o ./jdk.tar	# 将镜像打成tar包,-o后面指定镜像的保存路径
docker load -i jdk.tar				# 加载镜像
发布了45 篇原创文章 · 获赞 3 · 访问量 1537

猜你喜欢

转载自blog.csdn.net/pcn01/article/details/102956331