五、Docker:镜像(image)

本文介绍了Docker镜像的概念,包括其分层结构、UnionFS以及镜像加载过程。通过实例展示了如何从官方镜像启动容器,发现并解决Tomcat无法直接访问的问题,然后通过修改容器内容并提交为新的镜像,实现对Docker容器的定制。最后,讨论了如何将新镜像推送到远程仓库或分享给他人。
摘要由CSDN通过智能技术生成
其他文章:

一、Docker:概述

二、Docker:安装

三、Docker:命令

四、Docker:可视化管理

五、Docker:镜像(image)

六、Docker:数据卷

七、Docker:DockerFile

八、Docker:Docker网络原理

九、Docker:IDEA整合Docker

----------------------------------------------------------------

五、镜像(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。

镜像分层

image-20210506164104805

docker pull时就会有6个layer。

Docker镜像默认都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!

这一层就是我们通常说的容器层,容器之下的都是镜像层。

image-20210506164639259

我们可以将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入门。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值