构建镜像的2种方式


构建镜像主要有两种方式:
使用docker commit命令从运行中的容器提交为镜像;
使用docker build命令从 Dockerfile 构建镜像。

1、使用commit提交镜像

docker commit #提交容器,类似于vm的快照
docker commit -m=“提交的描述信息” -a=“作者” 容器id 目标镜像名及版本

#下载Tomcat镜像
docker pull tomcat
#启动容器,建立端口映射
docker run -it -p 8080:8080 tomcat
#进入容器内部
docker exec -it a53e2eeec596 /bin/bash
#增加网页文件到tomcat主目录
cp -r webapps.dist/* webapps
#浏览器访问
192.168.45.228080
#commit保存自己更改后的容器为一个镜像
docker commit -m="add webapps app" -a="vera"  a53e2eeec596 tomcat02

步骤:
1、启动一个默认的tomcat
2、发现这个是默认的,无webapps应用,官方镜像是默认没文件的
3、拷贝进去webapps文件
4、通过commit提交一个镜像

通过对比显然使用Dockerfile的docker build更好。docker commit的缺点如下:
需要在容器内操作麻烦,效率低。
这一点也是最重要的,其他人或者过一段时间后自己也不知道这个镜像是怎么做出来的,但是使用Dockerfile构建的镜像,我们看到是执行了apt-get install命令。

2、Dockerfile构建镜像

Dockerfile 是一个包含了用户所有构建命令的文本。通过docker build命令可以从 Dockerfile 生成镜像。
使用 Dockerfile 构建镜像具有以下特性:
Dockerfile 的每一行命令都会生成一个独立的镜像层,并且拥有唯一的 ID
Dockerfile 的命令是完全透明的,通过查看 Dockerfile 的内容,就可以知道镜像是如何一步步构建的
Dockerfile 是纯文本的,方便跟随代码一起存放在代码仓库并做版本管理

我们先学习下 Dockerfile 常用的指令:
在这里插入图片描述

#ADD使用范围过于广泛,一般使用COPY
写一个 Dockerfile:

#mkdir -p /home/dockerfile/
#vim dockerfile2

FROM centos:7
 
COPY nginx.repo /etc/yum.repos.d/nginx.repo
 
RUN yum install -y nginx
 
EXPOSE 80
 
ENV HOST=mynginx
 
CMD ["nginx","-g","daemon off;"]

第一行表示我要基于 centos:7 这个镜像来构建自定义镜像。这里需要注意,每个 Dockerfile 的第一行除了注释都必须以 FROM 开头。
第二行表示拷贝本地文件 nginx.repo 文件到容器内的 /etc/yum.repos.d 目录下。这里拷贝 nginx.repo 文件是为了添加 nginx 的安装源。
第三行表示在容器内运行yum install -y nginx命令,安装 nginx 服务到容器内,执行完第三行命令,容器内的 nginx 已经安装完成。
第四行声明容器内业务(nginx)使用 80 端口对外提供服务。
第五行定义容器启动时的环境变量 HOST=mynginx,容器启动后可以获取到环境变量 HOST 的值为 mynginx。
第六行定义容器的启动命令,命令格式为 json 数组。这里设置了容器的启动命令为 nginx ,并且添加了 nginx 的启动参数 -g ‘daemon off;’ ,使得 nginx 以前台的方式启动。
#保存退出

docker build -f /home/dockerfile/dockerfile2 -t nginx:v2 .
docker images
REPOSITORY    TAG    IMAGE ID       CREATED             SIZE
nginx         v2     91cac23a6cb8   41 seconds ago      209 MB

Dockerfile 的每一行命令,都生成了一个镜像层。
分层的结构使得 Docker 镜像非常轻量,每一层根据镜像的内容都有一个唯一的 ID 值,当不同的镜像之间有相同的镜像层时,便可以实现不同的镜像之间共享镜像层的效果。Docker 镜像是静态的分层管理的文件组合,镜像底层的实现依赖于联合文件系统(UnionFS)。
到此,相信你已经对 Docker 镜像这一核心概念有了较深的了解,并熟悉了 Docker 镜像的常用操作(拉取、查看、“重命名”、删除和构建自定义镜像)及底层实现原理。
镜像操作命令:
拉取镜像,使用 docker pull 命令拉取远程仓库的镜像到本地 ;
重命名镜像,使用 docker tag 命令“重命名”镜像 ;
查看镜像,使用 docker image ls 或 docker images 命令查看本地已经存在的镜像;
删除镜像,使用 docker rmi 命令删除无用镜像 ;
构建镜像,构建镜像有两种方式。第一种方式是使用 docker build 命令基于 Dockerfile 构建镜像,也是我比较推荐的镜像构建方式;第二种方式是使用 docker commit 命令基于已经运行的容器提交为镜像。

总结镜像的实现原理

镜像是由一系列的镜像层(layer )组成,每一层代表了镜像构建过程中的一次提交,当我们需要修改镜像内的某个文件时,只需要在当前镜像层的基础上新建一个镜像层,并且只存放修改过的文件内容。分层结构使得镜像间共享镜像层变得非常简单和方便。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值