Docker镜像是什么?
镜像是一种轻量级、可执行的独立软件包,用于打包软件运行环境和基于运行环境开发的软件。它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
UnionFS(联合文件系统)
UnionFS是一种分层、轻量级且高性能的文件系统。它支持将文件系统的修改作为一次提交逐层叠加,并可以将不同目录挂载到同一个虚拟文件系统中。Union文件系统是Docker镜像的基础。镜像可以通过分层继承,基于基础镜像制作各种具体的应用镜像。
{% note red ‘fas fa-fan’ simple%}
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统。联合加载会将各层文件系统叠加起来,最终的文件系统将包含所有底层的文件和目录。
{% endnote %}
Docker镜像加载原理:
Docker镜像实际上由一层一层的文件系统组成,这种层级的文件系统称为UnionFS。bootfs(引导文件系统)是镜像的最底层,包含引导加载器和内核。rootfs(根文件系统)在bootfs之上,包含标准目录和文件,如/dev、/proc、/bin、/etc等。不同的操作系统发行版就是通过rootfs来实现的。
[dw@dk ~]$ sudo docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
d960726af2be: Pull complete
e8d62473a22d: Pull complete
8962bc0fad55: Pull complete
65d943ee54c1: Pull complete
da20b77f10ac: Pull complete
8669a096f083: Pull complete
e0c0a5e9ce88: Pull complete
f7f46169d747: Pull complete
42d8171e56e6: Pull complete
774078a3f8bb: Pull complete
Digest: sha256:71703331e3e7f8581f2a8206a612dbeedfbc7bb8caeee972eadca1cc4a72e6b1
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
[dw@dk ~]$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest c43a65faae57 2 weeks ago 667MB
hello-world latest d1165f221234 2 months ago 13.3kB
{% note default simple %}
平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里只有200M?
{% endnote %}
{% note primary simple %}
这是因为对于一个精简的操作系统,rootfs可以很小,只需要包括最基本的命令、工具和程序库即可。底层直接使用宿主机的内核,只需要提供rootfs即可。不同的Linux发行版可以共享相同的bootfs,而rootfs会有所差异。
{% endnote %}
分层的镜像:
Docker镜像采用分层结构的最大好处是共享资源。如果多个镜像都是从相同的基础镜像构建而来,那么宿主机只需保存一份基础镜像,内存中也只需加载一份基础镜像,就可以为所有容器提供服务。镜像的每一层都可以被共享。
镜像的特点:
{% note warning simple %}
Docker镜像都是只读的。当容器启动时,会在镜像顶部加载一个新的可写层,称为”容器层”,而镜像层位于”容器层”之下。
{% endnote %}
Docker镜像commit操作:
使用Docker commit命令可以将容器副本提交为一个新的镜像。
Docker commit命令示例:
docker commit -m="提交的容器描述信息" -a="作者信息" 容器ID 要创建的目标镜像名:[标签名]
#启动tomcat容器
[root@aaa ~]# docker run -it -p 8888:8080 tomcat
{% note default simple %}
可能存在tomcat访问不到,详情请参考下述解释:
{% endnote %}
运行Docker的tomcat镜像报错”docker: IPv4 forwarding is disabled. Networking will not work.”。
解决方法:
网络无法通信是因为IPv4转发被禁用了,只需开启即可。
开启转发配置:
- 编辑/etc/sysctl.conf文件:
vim /etc/sysctl.conf
- 添加以下配置:
net.ipv4.ip_forward=1
- 保存并退出:
:wq!
- 重启网络服务使配置生效:
systemctl restart network
- 检查是否成功:
sysctl net.ipv4.ip_forward
如果返回”net.ipv4.ip_forward = 1″表示成功。
- 重启Docker服务:
sudo systemctl start docker
- 查看运行过的容器:
sudo docker ps -a
- 设置MySQL容器开机启动:
sudo docker update mysql --restart=always
如果没有异常,表示成功。
参考链接:blog.csdn.net/qq_42355392/article/details/110626807
#不停止退出容器
CTRL+P+Q
# 查看tomcat容器id
[root@aaa ~]# docker ps
# 进入容器命令行终端
[root@aaa ~]# docker exec -it ff197cf9b09d /bin/bash
访问宿主机端口8888时出现404错误。
这是因为新版本的tomcat的webapps文件夹中没有相应的文件,需要将文件移动到正确的位置。
解决方法:
- 退出容器。
- 进入容器。
- 将原本应该放在webapps供外部访问的文件移动到webapps文件夹中。
{% note success simple %}
至此,可能会遇到的问题案例分析完成。如果有其他情况,请自行查阅相关资源。
{% endnote %}
[dw@dk ~]$ sudo docker exec -it 2a966607e3c3 /bin/bash
root@2a966607e3c3:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps-back
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@2a966607e3c3:/usr/local/tomcat# cd webapps
root@2a966607e3c3:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
root@2a966607e3c3:/usr/local/tomcat/webapps# rm -rf docs
root@2a966607e3c3:/usr/local/tomcat/webapps# ls
ROOT examples host-manager manager
root@2a966607e3c3:/usr/local/tomcat/webapps#
[dw@dk ~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a966607e3c3 tomcat "catalina.sh run" 17 hours ago Up 17 hours 0.0.0.0:8888->8080/tcp, :::8888->8080/tcp compassionate_leakey
[dw@dk ~]$ sudo docker commit -a="hj" -m="tomcat without docs" 2a966607e3c3 atguigu/mytomcat:1.2
sha256:3195c86b506685864b393d2d3490c98250354ba0d8fbe8af55fe794d0024b020
[dw@dk ~]$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
atguigu/mytomcat 1.2 3195c86b5066 7 seconds ago 669MB
tomcat latest c43a65faae57 3 weeks ago 667MB
centos latest 300e315adb2f 6 months ago 209MB
[dw@dk ~]$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
atguigu/mytomcat 1.2 3195c86b5066 3 minutes ago 669MB
tomcat latest c43a65faae57 3 weeks ago 667MB
centos latest 300e315adb2f 6 months ago 209MB
[dw@dk ~]$ sudo docker run -it atguigu/mytomcat # 可以发现不加版本号会默认找latest版本
Unable to find image 'atguigu/mytomcat:latest' locally
[dw@dk ~]$ sudo docker run -it -p 7777:8080 atguigu/mytomcat:1.2
访问应用的web页面:
通过访问虚拟机Docker暴露的8888端口,可以访问到tomcat的web页面。
[dw@dk ~]$ sudo docker run -it -p 7788:8080 tomcat
访问atguigu/mytomcat:1.2的应用,可以看到页面正常显示。
运行原始镜像tomcat。
总结:
之前是通过镜像生成容器实例,现在可以根据当前运行的容器实例状态生成新的镜像。类似于Java中的反射,通过实例可以获取类的信息。通过镜像可以得到我们自定义的容器。
上一篇:Docker的常用命令
下一篇预告:Docker容器数据卷