其他文章:
----------------------------------------------------------------
五、镜像(image)
镜像是一种轻量级的、可执行的独立软件包,用来打包软件运行环境和基础运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码、运行时、库、环境变量、配置文件。
UnionFS联合文件系统
docker pull下载镜像时,可以看到是一层一层下载的。UnionFS是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层一层的叠加,同时可以将不同目录挂载同一个虚拟文件系统下。UnionFS是docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
镜像加载过程
docker的镜像实际是由一层一层的文件系统组成的,这种层级的文件系统就是UnionFS。
bootfs(boot file system)
主要包括bootloader和kernel,bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统,在docker镜像的最底层是bootfs。这一层与我们典型的linux系统是一样的,包括boot加载器和内核。当boot加载完成之后整个内核就在内存中运行了,此时内存的使用权已经由bootfs转交给内核了,此时系统也会卸载bootfs.
rootfs(root file system)
rootfs在bootfs之上,包含的就是典型linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统的发型版,如centos、Ubuntu等。
[root@localhost ~]#
[root@localhost ~]# docker images # centos镜像209M
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 300e315adb2f 4 months ago 209MB
[root@localhost ~]# docker image inspect centos:latest # 查询镜像分层的详细信息
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具、库就可以了,因为底层直接使用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发型版,bootfs基本是一致的,rootfs会有差别,因此不同的发型版可以共用bootfs。
镜像分层
docker pull时就会有6个layer。
Docker镜像默认都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都是镜像层。
我们可以将run起来的容器重新生成一个镜像,做成自己的镜像。
commit镜像
使用官方的tomcat镜像时,启动后不能直接访问,因为官方的tomcat镜像做过相关的处理,镜像中的webapps中没有相关的ROOT目录,所以直接访问404。我们可以在webapps目录中加上相关的文件,让镜像启动后可以直接访问。同时将修改后的容器从新做成一个镜像,并提交到本地的镜像仓库中。
实战:
# commit镜像和git本地提交类似。
docker commit -m="提交的描述信息" -a="作者" 容器id 镜像名称:[TAG]
# 1.查找镜像
[root@localhost ~]# docker search --filter=STARS=1000 tomcat
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementati… 3024 [OK]
[root@localhost ~]#
# 2.获取镜像
[root@localhost ~]# docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
bd8f6a7501cc: Pull complete
44718e6d535d: Pull complete
efe9738af0cb: Pull complete
f37aabde37b8: Pull complete
b87fc504233c: Pull complete
8bf93eef8c9e: Pull complete
8d33b4df10ef: Pull complete
2d77aa1a5442: Pull complete
baa04cc4071d: Pull complete
a3a752513415: Pull complete
Digest: sha256:0509684774ac53d8b152f4a50dd92889218a8633c0feddb4b35d092e55cd215d
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
# 3.启动镜像
[root@localhost ~]# docker run -d -p8086:8080 tomcat
9450e8699b8cc9f8bdf782939cd8bdcd984402cc5e8c77e30f1a3955762bdea6
[root@localhost ~]#
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9450e8699b8c tomcat "catalina.sh run" 5 seconds ago Up 4 seconds 0.0.0.0:8086->8080/tcp, :::8086->8080/tcp charming_jang
[root@localhost ~]#
# 4.在浏览器中访问tomcat 显示404
#http://192.168.1.200:8086/
# 5.进入容器
[root@localhost ~]# docker exec -it 9450e8699b8c /bin/bash
root@9450e8699b8c:/usr/local/tomcat#
root@9450e8699b8c:/usr/local/tomcat# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
root@9450e8699b8c:/usr/local/tomcat#
root@9450e8699b8c:/usr/local/tomcat#
# 6.查看容器中的webapps的目录是空的
root@9450e8699b8c:/usr/local/tomcat# ls webapps
# 7.修改webapps中的文件,让tomcat可以访问
root@9450e8699b8c:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@9450e8699b8c:/usr/local/tomcat#
root@9450e8699b8c:/usr/local/tomcat# ls webapps
ROOT docs examples host-manager manager
root@9450e8699b8c:/usr/local/tomcat#
# 8.在浏览器中再次访问tomcat 显示成功
#http://192.168.1.200:8086/
# 9.退出容器
root@9450e8699b8c:/usr/local/tomcat# exit
exit
[root@localhost ~]#
[root@localhost ~]#
# 10.查看镜像和容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9450e8699b8c tomcat "catalina.sh run" 7 minutes ago Up 7 minutes 0.0.0.0:8086->8080/tcp, :::8086->8080/tcp charming_jang
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest c0e850d7b9bb 7 days ago 667MB
centos latest 300e315adb2f 4 months ago 209MB
[root@localhost ~]#
# 11.将容器提交成新的本地镜像
[root@localhost ~]# docker commit -m="修改webapps" -a="wuxiaolong" 9450e8699b8c tomcat:2.0
sha256:c01bd59511a62e6eab4f6953e6259e14161cb1a115824a705a62f8672731316b
[root@localhost ~]#
# 12.查看提交后的镜像信息
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 2.0 c01bd59511a6 12 seconds ago 672MB
tomcat latest c0e850d7b9bb 7 days ago 667MB
centos latest 300e315adb2f 4 months ago 209MB
[root@localhost ~]#
现在就可以将新的镜像push到远程docker仓库了,或者将镜像发送给其他人直接启动即可。
上面的所有知识都会了,才算是docker入门。