Docker的镜像结构及镜像的创建(commit,Dockerfile构建镜像)

本文介绍了Docker镜像的分层结构,通过docker commit命令创建新镜像,并详细阐述了如何利用Dockerfile构建镜像,包括常用的Dockerfile指令如FROM、MAINTAINER和COPY。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 Docker镜像的介绍

(1)简介

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

(2)镜像的分层结构

1.共享宿主机的内核
2.base镜像提供的是最小的linux发行版
其实就是linux的根/文件系统
3.同一docker主机支持运行多种linux发行版
4.采用分层结构的做大好处是“共享资源”
不同的镜像使用同一个镜像层的时候,文件系统便可以实现资源共享,只需要备份一次,节省空间。

二 docker commit构建新镜像

(1)导入ubuntu的镜像包

docker load -i ubuntu.tar

 

(2)使用镜像开启并运行容器

docker run -it --name vm2 ubuntu

(3)在容器中建立文件,ctrl+d退出

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

两个快捷退出键的区别:
ctrl+d: 直接终止容器的运行。只能通过docker ps -a查看到此容器
ctrl+p+q: 在后台运行此容器,通过docker ps查看到

(4)将容器保存为新的镜像

[root@server1 ~]# docker run -it --name vm2 ubuntu
root@7255139a6a15:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

##重新在容器中建立文件
root@7255139a6a15:/# touch newfile{1..10}
root@7255139a6a15:/# ls
bin   etc   lib64  newfile1   newfile3  newfile6  newfile9  root  srv  usr
boot  home  media  newfile10  newfile4  newfile7  opt       run   sys  var
dev   lib   mnt    newfile2   newfile5  newfile8  proc      sbin  tmp
root@7255139a6a15:/# ls

##保存为新的镜像
[root@server1 ~]# docker commit vm2 ubuntu:v2
sha256:97dcc8db7483e29385ea73d7b880209c9c9ef79868b9f8ca4ffc19b315718c99

[root@server1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              v2                  97dcc8db7483        27 seconds ago      188MB
ubuntu              v1                  516bbbfe0967        About an hour ago   188MB
game2048            latest              19299002fdbe        2 years ago         55.5MB
ubuntu              latest              07c86167cdc4        3 years ago         188MB

新镜像创建的容器保存上一容器建立的文件。

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

以上例子中镜像ubuntu:v2 是在ubuntu镜像打开容器的基础上生成的。查看他们的镜像分层。

ubuntu:v2 是在ubuntu镜像基础上多添加了一层。

三 Dockerfile 创建镜像

根据Dockerfile中的内容,通过使用docker bulid指令,自动创建镜像,也是基于docker commit的层层构建得出。Dockerfile文件名称,是docker默认的,在u不特殊指定的情况下,一般都是从该文件中读取创建信息。并且在创建的过程中,docker会将该文件所在目录中的所有内容发送给docker引擎。所以建创建一个空来目录来存放Dockerfile文件。
实验准备:清除上一实验的容器与镜像

    (1)导入rhel7的镜像包

[root@server1 ~]# docker load -i rhel7.tar 

 

 (2)创建空目录,Dockerfile文件以及westos.repo文件

1.建立docker目录
[root@server1 ~]# mkdir /docker
[root@server1 ~]# cd /docker/

2.创建westos.repo文件
[root@server1 docker]# vim westos.repo
[root@server1 docker]# cat westos.repo
[rhel]
name=rhel7.3
baseurl=http://172.25.60.250/westos
gpgcheck=0

3.创建Dockerfile文件
[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat Dockerfile 
FROM rhel7
COPY westos.repo /etc/yum.repos.d/westos.repo
RUN rpmdb --rebuilddb && yum install -y httpd
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

(3)使用Dockerfile文件构建http服务的镜像

[root@server1 docker]# docker build -t rhel7:v1 .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM rhel7
 ---> 0a3eb3fde7fd
Step 2/4 : COPY westos.repo /etc/yum.repos.d/westos.repo
 ---> c036b5519337
Step 3/4 : RUN rpmdb --rebuilddb && yum install -y httpd
 ---> Running in ae43a051d93c

 

可以发现建立成功的提示后面有一个码 5632320b0b51,这个码就是rhel7镜像v1的码。

(4)查看新建镜像的分层

(4)用新建的镜像建立一个容器vm1并将httpd首页文件所在的目录挂载到httpd的默认发布目录下,做一个端口映射:

[root@server1 docker]# docker run -d --name vm1 -p 80:80 -v /docker/web/:/var/www/html rhel7:v1
f9f92cd6829a4ad5e8d5bcd8cc92475bdcefa6aca70846c87aa89485f5e2d38a
[root@server1 docker]# vim web/index.html
[root@server1 docker]# cat web/index.html
Docker!

访问server1IP 可以直接读取http发布页面

修改容器中的发布页面信息,访问页面刷新后实时更新。

四 dockerfile常用的指令

1.

1 、FROM:
用于指定base镜像,本地不存在会从远程仓库进行下载

2、MAINTAINER
MAINTAINER:设置镜像的作者,如用户邮箱等(不是必须的)

3、COPY
把文件从build context复制到镜像
支持两种形式:COPY src dest和COPY [" src" ,"dest "]
src必须指定build context中的文件或目录
dest为容器中的路径

1 、FROM:
用于指定base镜像,本地不存在会从远程仓库进行下载

2、MAINTAINER
MAINTAINER:设置镜像的作者,如用户邮箱等(不是必须的)

3、COPY
把文件从build context复制到镜像
支持两种形式:COPY src dest和COPY [" src" ,"dest "]
src必须指定build context中的文件或目录
dest为容器中的路径

4 、ADD

用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可自动下载URL并拷贝到镜像
DD html.tar /var/www ##解压
ADD http://ip/html.tar /var/www ##下载

5 EXPOSE
如果容器中运行应用服务,则可以包服务端口暴露出去

[root@toto6 docker]# vim Dockerfile
FROM rhel7
Add backup.tar.gz /mnt
EXPOSE 80

6 、VOLUME
声明数据卷,通常指定应用数据挂载点VOLUME [ “/var/www/html”] :该路径为容器中的路径。如果路径不存在,启动容器的时候会自动创建。
一般VOLUME指定挂载点,没有此路径就会新建路径。在运行docker宿主机上,可以根据命令docker inspect 容器名的具体信息,可以查看封装容器,声明的数据卷,Source会存在此容器目录挂接到本地_data目录。由于自动挂载的路径很长,不太方便记,也可以在运行的时候指定挂载路径

VOLUME ["/data"] # 声明数据卷
docker run -it --name vm3 -v /opt/data:/data ubuntu:v1 ##:前为物理机挂载目录,:后为docker挂载目录

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

8 、RUN
RUN 在容器中运行命令并创建新的镜像层,常用于安装软件包:每个run 都会多一层

9 、ENV:
设置环境变量,变量可以被后续的指令使用

10 、CMD 与 ENTRYPOINT

设置容器启动后执行的命令,但是CMD会被docker run 后面的命令覆盖,但ENTRYPOINT不会
Dockerfile中只能指定一个ENTRYPOINT,如果指定过多则只有最后一个有效
docke run后面的参数可以传递给ENTRYPOINT指令当作参数;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值