Docker镜像的分层结构介绍以及镜像的创建(docker commit与dockerfile)

1.Docker镜像的分层结构介绍:

(1)docker镜像:

Docker镜像是一个只读的Docker容器模板,含有启动Docker容器所需的文件系统结构及其内容,因此是启动一个Docker容器的基础。Docker镜像的文件内容以及一些运行Docker容器的配置文件组成了Docker容器的静态文件系统运行环境–rootfs。可以这么理解,Docker镜像是Docker容器的静态视角,Docker容器是Docker镜像的运行状态

(2)docker镜像的分层结构:
在这里插入图片描述
在这里插入图片描述

2.Docker commit镜像的创建:

在这里插入图片描述
创建容器,以ubuntu为例
(1)导入镜像,创建容器并运行

[root@server1 ~]# docker load -i ubuntu.tar  ##添加镜像
[root@server1 ~]# docker images  ##查看拉取的镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
game2048            latest              19299002fdbe        2 years ago         55.5MB
ubuntu              latest              07c86167cdc4        3 years ago         188MB
rhel7               latest              0a3eb3fde7fd        5 years ago      
[root@server1 ~]# docker run -it --name vm2 ubuntu     ##创建并运行容器 -it:以交互式方式打开
root@a4aca5fcecc3:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@a4aca5fcecc3:/# uname -r
3.10.0-862.el7.x86_64       ##与宿主机内核版本一致
root@a4aca5fcecc3:/#     
root@a4aca5fcecc3:/# touch file{1..10}
root@a4aca5fcecc3:/# ls
bin   etc     file2  file5  file8  lib    mnt   root  srv  usr
boot  file1   file3  file6  file9  lib64  opt   run   sys  var
dev   file10  file4  file7  home   media  proc  sbin  tmp
root@a4aca5fcecc3:/# exit
exit
[root@server1 ~]# docker rm vm2     ##删除此容器,此时容器内创建的文件均没有保存
vm2

删除容器vm2,重新用ubuntu镜像创建并运行容器时,之前创建的文件消失,因为上次的操作全部写在容器层,镜像层的内容只读。当上次的容器释放之后,写在容器层的内容也会随之消失。
在这里插入图片描述

(2)使用docker commit保存修改后的镜像为新镜像
先修改镜像

[root@server1 ~]# docker run -it --name vm2 ubuntu
root@8e0d11ca1b95:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@8e0d11ca1b95:/# touch file{1..10}
root@8e0d11ca1b95:/# ls
bin   etc     file2  file5  file8  lib    mnt   root  srv  usr
boot  file1   file3  file6  file9  lib64  opt   run   sys  var
dev   file10  file4  file7  home   media  proc  sbin  tmp
root@8e0d11ca1b95:/# exit
exit

在这里插入图片描述
使用docker commit保存修改后的镜像为新镜像

[root@server1 ~]# docker commit vm2 ubuntu:v      ##将此容器重新打包为一个镜像
sha256:593a662c6eedf8afc483f305ff9369ee9c8bddd8c71fca0718178d2895d1ea0d
[root@server1 ~]# docker images
REPOSITORY                      TAG                        IMAGE ID            CREATED             SIZE
ubuntu                          v                          593a662c6eed        14 seconds ago      188MB
[root@server1 ~]# docker rm vm2      ##删除创建的容器
vm2
[root@server1 ~]# docker run -it --name vm2 ubuntu:v      ##运行此容器
root@306c2ef91b50:/# ls      ##创建的文件依然存在
bin   etc     file2  file5  file8  lib    mnt   root  srv  usr
boot  file1   file3  file6  file9  lib64  opt   run   sys  var
dev   file10  file4  file7  home   media  proc  sbin  tmp
root@306c2ef91b50:/# exit
exit

使用容器创建镜像。容器就是在镜像层的最上方存在一个可写的容器层。将容器打包镜像,就是将该可写的容器层,变成一个只读的镜像层,和下层的所有镜像层一起作为新镜像的镜像层。

(3)查看v镜像的构造历史

[root@server1 ~]# docker history ubuntu:v
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
593a662c6eed        6 minutes ago       /bin/bash                                       29B                 
07c86167cdc4        3 years ago         /bin/sh -c #(nop) CMD ["/bin/bash"]             0B                  
<missing>           3 years ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$…   1.9kB               
<missing>           3 years ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/poli…   195kB               
<missing>           3 years ago         /bin/sh -c #(nop) ADD file:b9504126dc5590898…   188MB               

在这里插入图片描述

3.Dockerfile实现镜像的封装

(1) 简单镜像的构建

mkdir docker
cd docker/
vim Dockerfile    #创建一个Dockerfile
FROM ubuntu
RUN touch file{1..10}
docker build -t ubuntu:v1 .    #构建镜像
docker history ubuntu:v1    #查看镜像的分层结构

备注:在镜像构建时,由于构建镜像会拉取该目录下的所有数据,所以不要直接在根目录下进行构建
(2)Dockerfile中常用命令

(1)FROM:指定base镜像,如果本地不存在会从远程仓库下载

(2)MAINTAINER:设置镜像的作者,比如用户邮箱等

(3)COPY:把文件从build context复制到镜像,支持两种形式:COPY src dest 和 COPY [“src”, “dest”],src必须指定build context中的文件或目录

(4)ADD:用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可以自动下载URL并拷贝到镜像

(5)ENV:设置环境变量,变量可以被后续的指令使用

(6)EXPOSE:如果容器中运行应用服务,可以把服务端口暴露出去

(7)VOLUME:申明数据卷,通常指定的是应用的数据挂在点

(8)WORKDIR:为RUN、CMD、ENTRYPOINT、ADD和COPY指令设置镜像中的当前工作目录,如果目录不存在会自动创建。

(9)RUN:在容器中运行命令并创建新的镜像层,常用于安装软件包

(10)CMD 与 ENTRYPOINT:这两个指令都是用于设置容器启动后执行的命令,但CMD会被docker run后面的命令行覆盖,而ENTRYPOINT不会被忽略,一定会被执行。 docker run后面的参数可以传递给ENTRYPOINT指令当作参数。 Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效。

(3)Dockerfile封装httpd

vim /docker/Dockerfile 
FROM rhel7
COPY dvd.repo /etc/yum.repos.d/
RUN rpmdb --rebuilddb && yum install -y httpd
EXPOSE 80
VOLUME ["/var/www/html"]
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

在这里插入图片描述
构建镜像

docker build -t rhel7:apache .
docker history rhel7:apache 
docker images

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查看新生成的镜像分层结构:
能清楚的看到每一层镜像进行的操作,使用者可以对镜像进行审计

在这里插入图片描述
编写默认发布文件,测试镜像是否封装成功

docker run -d --name vm1 rhel7:apache 
docker ps             #查看进程,容器属于一种特殊的进程
docker inspect vm1    #查看容器详细信息(挂载信息、ip等)
[root@server1 docker]# cd /var/lib/docker/volumes/
[root@server1 volumes]# vim index.html
[root@server1 volumes]# cat index.html
this is httpd image
curl 172.17.0.2

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

指定volume的挂载点:使用volume参数,系统会自动的为我们挂接一个物理内存到宿主机上,这个挂载点是随意的,我们可以根据自己的需求手动的设置挂载点位置。prune只删除没有使用的卷或镜像等资源,因此我们首先需要将使用该卷的容器删除,然后删除卷。

docker rm -f vm1
docker volume ls    #查看卷
docker volume prune    #删除所有未使用的卷

在这里插入图片描述

[root@server1 _data]# docker run -d --name vm1 -v /webdata:/var/www/html -p 80:80 rhel7:apache     #创建容器并运行,-v手动指定挂载点,
a23d9d6c763a4ca25ce9d7569d2bc6bc346f883b2094ecedb54b13b1606955dc
[root@server1 _data]# cd /webdata/
[root@server1 webdata]# vim index.html
[root@server1 webdata]# cat index.html 
good luck!!

浏览器访问:172.25.33.1

备注:必须在做端口映射之前,保证80端口没有被占用
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值