Docker镜像

Docker镜像简介

什么是Docker镜像?

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

  • 简单来说Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务;一个镜像可以创建多个容器(程序运行在容器中)。
    在这里插入图片描述

    镜像的生成途径

  • Dockerfile

  • 基于容器制作

  • Docker Hub automated builds

Docker镜像层

在这里插入图片描述

典型的Linux文件系统由bootfs和rootfs两部分组成。

  • 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就是各种不同的操作系统发行版,比如:Centos、Ubuntu等等。

这里也解释了为什么虚拟机占用空间非常大通常以G为单位,为什么docker这里才几十上百M?

  • 对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。

    位于下层的镜像称为父镜像(parrent image),最底层的称为基础镜像(base image);
    最上层为“可读写”层,其下的均为“只读”层。

Docker存储驱动

  • AUFS
  • OverlayFS
  • Devicemapper

AUFS
AUFS(AnotherUnionFS)是一种Union FS(联合文件系统),是文件级的存储驱动。AUFS是一个能透明覆盖一个或多个现有文件系统的层状文件系统,把多层合并成文件系统的单层表示。简单来说就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统。这种文件系统可以一层一层地叠加修改文件。无论底下有多少层都是只读的,只有最上层的文件系统是可写的。当需要修改一个文件时,AUFS创建该文件的一个副本,使用CoW(写时复制)将文件从只读层复制到可写层进行修改,结果也保存在可写层。在Docker中,底下的只读层就是image,可写层就是Container。

AUFS文件系统据说有3W行代码,而ext4文件系统却只有4000-5000行左右代码,这些代码是要被整合进内核的,后来AUFS申请要被合并进内核代码的时候,linuz觉得它这代码太过臃肿,于是拒绝了。因此AUFS这个文件系统一直以来就不是linux内核中自有的文件系统,想用AUFS这个文件系统的话,必须自己向内核打补丁并去编译使用它,但redhat系列的操作系统一向以稳定著称,不会干这种出格的事,所以在redhat系列操作系统中使用AUFS并无可能。而ubuntu上的docker默认使用的就是AUFS。

OverlayFS
Overlay是Linux内核3.18后支持的,也是一种Union FS,和AUFS的多层不同的是Overlay只有两层:一个upper文件系统和一个lower文件系统,分别代表Docker的镜像层和容器层。当需要修改一个文件时,使用CoW将文件从只读的lower复制到可写的upper进行修改,结果也保存在upper层。在Docker中,底下的只读层就是image,可写层就是Container。目前最新的OverlayFS为Overlay2。

AUFS和Overlay都是联合文件系统,但AUFS有多层,而Overlay只有两层,所以在做写时复制操作时,如果文件比较大且存在比较低的层,则AUSF会慢一些。而且Overlay并入了linux kernel mainline,AUFS没有。目前AUFS已基本被淘汰。

DeviceMapper
Device mapper是Linux内核2.6.9后支持的,提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略。AUFS和OverlayFS都是文件级存储,而Device mapper是块级存储,所有的操作都是直接对块进行操作,而不是文件。Device mapper驱动会先在块设备上创建一个资源池,然后在资源池上创建一个带有文件系统的基本设备,所有镜像都是这个基本设备的快照,而容器则是镜像的快照。所以在容器里看到文件系统是资源池上基本设备的文件系统的快照,并没有为容器分配空间。当要写入一个新文件时,在容器的镜像内为其分配新的块并写入数据,这个叫用时分配。当要修改已有文件时,再使用CoW为容器快照分配块空间,将要修改的数据复制到在容器快照中新的块里再进行修改。

OverlayFS是文件级存储,Device mapper是块级存储,当文件特别大而修改的内容很小,Overlay不管修改的内容大小都会复制整个文件,对大文件进行修改显然要比小文件要消耗更多的时间,而块级无论是大文件还是小文件都只复制需要修改的块,并不是整个文件,在这种场景下,显然device mapper要快一些。因为块级的是直接访问逻辑盘,适合IO密集的场景。而对于程序内部复杂,大并发但少IO的场景,Overlay的性能相对要强一些。

docker registry

启动容器时,docker daemon会试图从本地获取相关的镜像,本地镜像不存在时,其将从Registry中下载该镜像并保存到本地。

Registry用于保存docker镜像,包括镜像的层次结构和元数据。用户可以自建Registry,亦可使用官方的Docker Hub。

docker registry的分类:

  • Sponsor Registry:第三方的Registry,供客户和Docker社区使用
  • Mirror Registry:第三方的Registry,只让客户使用
  • Vendor Registry:由发布docker镜像的供应商提供的registry
  • Private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry

docker registry的组成:

  • Repository
    • 由某特定的docker镜像的所有迭代版本组成的镜像仓库
    • 一个Registry中可以存在多个Repository
      • Repository可分为“顶层仓库”和“用户仓库”
      • 用户仓库名称格式为“用户名/仓库名”
    • 每个仓库可包含多个Tag(标签),每个标签对应一个镜像
  • Index
    • 维护用户帐户、镜像的检验以及公共命名空间的信息
    • 相当于为Registry提供了一个完成用户认证等功能的检索接口

Docker Registry中的镜像通常由开发人员制作,而后推送至“公共”或“私有”Registry上保存,供其他人员使用,例如“部署”到生产环境。
在这里插入图片描述

docker镜像的获取

# docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>

镜像的生成

镜像的生成途径:

  • Dockerfile
  • 基于容器制作
  • Docker Hub automated builds
    在这里插入图片描述

基于容器制作镜像

拉取一个centos镜像

[root@localhost ~]# docker pull centos
Using default tag: latest

latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
centos       latest    5d0da3dc9764   2 months ago   231MB


基于centos镜像生成一个容器

[root@localhost ~]# docker run --name centos -it centos /bin/bash
[root@d46e5d7f7e13 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@d46e5d7f7e13 /]# cd /root
[root@d46e5d7f7e13 ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ make wget

[root@d46e5d7f7e13 ~]# useradd -r -M -s /sbin/nologin nginx
[root@d46e5d7f7e13 ~]# mkdir -p /var/log/nginx
[root@d46e5d7f7e13 ~]# chown -R nginx.nginx /var/log/nginx

[root@d46e5d7f7e13 ~]# wget http://nginx.org/download/nginx-1.21.3.tar.gz
[root@d46e5d7f7e13 ~]# tar xf nginx-1.21.3.tar.gz
 
[root@d46e5d7f7e13 ~]# cd nginx-1.21.3
[root@d46e5d7f7e13 nginx-1.21.3]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log
[root@d46e5d7f7e13 nginx-1.21.3]# make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install


[root@d46e5d7f7e13 ~]# echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf


[root@d46e5d7f7e13 ~]# rm -rf nginx-1.21.3
[root@d46e5d7f7e13 ~]# rm -rf nginx-1.21.3.tar.gz 
[ctrl]+q+p退出容器
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                               NAMES
d46e5d7f7e13   centos         "/bin/bash"              58 minutes ago   Up 57 minutes                           

基于编译好nginx的centos容器生成镜像

[root@localhost ~]# docker commit -a "911949711@qq.com" -m "nginx startup"  -c 'CMD ["/usr/local/nginx/sbin/nginx"]' centos jiejiehao/nginx:v1.21.3
[root@localhost ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED             SIZE
jiejiehao/nginx          v1.21.3   45b37144299c   37 minutes ago      521MB
centos                   latest    5d0da3dc9764   2 months ago        231MB

使用新的nginx镜像生成容器

[root@localhost ~]# docker run -d --name nginx04 -p80:80 jiejiehao/nginx:v1.21.3
973643ab67195e25a0e3518ae0fabab40be4470efccdeed466d089cc8f630e8c
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE                     COMMAND                  CREATED         STATUS         PORTS                               NAMES
973643ab6719   jiejiehao/nginx:v1.21.3   "/usr/local/nginx/sb…"   3 seconds ago   Up 2 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx04
d46e5d7f7e13   centos                    "/bin/bash"              2 hours ago     Up 2 hours                                         centos

本地访问测试

在这里插入图片描述

上传镜像

[root@localhost ~]# docker pull jiejiehao/nginx:v1.21.3
v1.21.3: Pulling from jiejiehao/nginx
a1d0c7532777: Already exists 
56c9540faf35: Already exists 
v1.21.3: Pulling from jiejiehao/nginx
a1d0c7532777: Already exists 
56c9540faf35: Already exists 
Digest: sha256:a47742914ab4bcfa72d3e4a30dad4ea06aa6bf807e3d205be79f3ff9d592b950
Status: Downloaded newer image for jiejiehao/nginx:v1.21.3
docker.io/jiejiehao/nginx:v1.21.3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值