Docker篇章5:Docker☞镜像

Docker篇章5:Docker☞镜像

  • Docker镜像是轻量级,可执行独立软件包,用来打包软件运行环境和基于运行环境开发的软线,它包含运行某个软件所需的所有内容,包括代码,运行时库,环境变量和配置文件。

1.docker镜像加载原理

  • docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS.
什么是UnionFS:
	UnionFS(联合文件系统),它是一种分层,轻量级并且高性能的文件系统,它支持对文件系统修改作为一次提交来一层层的叠加,同事可以将不同目录挂在到同一个虚拟文件系统下。Union文件系统时Docker镜像的基础,镜像可以通过分层来进行集成,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同事加载多个文件操作系统,但从外面看起来,只看到一个文件系统,联合加载会把各个层文件系统叠加起来,这样最终文件系统会包含所有底层文件和目录

​ bootfs(boot file system) 主要包含bootloader和kernel,bootloader主要时引导加载kernel,linux刚启动时会加载bootfs文件系统,在docker最底层时bootfs,这一层于我们典型Linux系统一样,包含boot加载器和内核。当boot加载完成之后整个内核旧都在内存中,此时内存使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

​ rootfs(root file system) 在boots纸上,包含就是典型Linux系统中 /dev, /etc,/proc,/bin等标准目录和文件,rootfs就是各种不同操作系统发性版,比如Ubuntu,CentOS等。

​ 平时我们安装虚拟机CentOS都是好几个G,为什么docker这里才200M左右?

	对于一个精简OS,rootfs可以很小,只需要包括最基本命令,工具和程序库就可以了,因为底层直接用主机的kernel,自己只需要提供rootfs就行,由此可见对于不同linux发性版本,bootfs基本是一致的,rootfs会由差额因此不同发性版可以公用bootfs
  • 分层镜像效果图如下,它就好像花卷一样:

2.为什么docker镜像采用这种分层结构

  • 最大好处就是共享资源,比如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也需加载一份base镜像,就可以为所有容器服务了,而且镜像每一层都可以被共享。(好比如一个镜像第一次下载很慢,但是第二次下载很快,因它内部有缓存,可以共享资源)

  • 特点:docker镜像都是只读,当容器启动时,一个新的可写层被加载到镜像顶部,这一层通常被称作容器层,容器层之下都叫镜像层。

3.简单示例:

  • docker拉取tomcat

    docker pull tomcat
    
  • 启动容器

    #启动tomcat 从外部访问端口8888 映射内部端口8080
    docker run -it -p 8888:8080 tomcat
    
  • 此时如果浏览器访问为404页面

先关闭防火墙

# 查看防火墙状态
service firewalld status
# 关闭防火墙
systemctl stop firewalld.service
# 禁止防火墙开机启动
systemctl disable firewalld.service
# 启动docker
systemctl start docker
# 重启docker
systemctl restart docker

进入tomcat 容器内

docker exec it 启动tomcat容器的容器ID /bin/bash

在tomcat目录执行

cp -r /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps/

此时访问页面主机IP:8888成功:

  • 对当前容器内的tomcat 修改,然后形成自定义镜像
docker commit -a='xjk' -m='no change' 容器id project/tomcat:1.12
  • 然后启动自己构建镜像的tomcat容器
# docker run -it -p 外部访问端口:tomcat端口默认8080 [REPOSITORY:TAG]
docker run -it -p 7777:8080 project/tomcat:1.12
# 后台启动 -d

此时访问7777端口也是OK的。

原文地址:https://www.cnblogs.com/xujunkai/p/13031373.html