Docker镜像

Base镜像

linux操作系统由内核空间和用户空间组成。
不同linux发行版本的区别主要就是rootfs。
比如 ubuntu 14.04使用upstart 管理服务,apt管理软件包,而centos7 使用systemd和yum。这些都是用户空间上的区别
,linux kernel差别不大。
所以docker可以同时支持多种linux镜像,模拟出多种操作系统环境。即上层提供各自的rootfs,底层共用docker host的kernel。
说明:容器运行只能使用host的kernel,并且不能修改。所有容器共用host的kernel,在容器中没办法对kernel升级。如果
容器对kernel版本有要求,建议使用虚拟机。

为什么docker镜像采用分层结构呢?

最大的一个好处:共享资源,比如:有多个镜像都从相同的base镜像构建而来,那么docker host只需在磁盘上保存一份base镜像,同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
可写的容器层:
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层",容器层之下的都叫镜像层。
所有对容器的改动-无论是添加,删除,还是修改文件都只会发生在容器层中。
注解:只有容器层是可写的,容器层下面的所有镜像层都是只读的。
镜像层数量可能很多,所有镜像层会联合在一起组成一个统一文件系统。如果不同层中有一个相同路径的文件,比如/a, 上层的/a会覆盖下层的/a,也就是说用户只能访问到上层中的文件/a。在容器层中,用户看到的是一个叠加之后的文件系统。
1.添加文件
在容器中创建文件时,新文件被添加到容器层中
2.读取文件
在容器中读取某个文件时,docker会从上往下依次在各镜像层中查找此文件,一旦查到,打开并读入内存。
3.修改文件
在容器中修改已存在的文件时,docker会从上往下依次在各镜像层中查找此文件,一旦找到,立即将其复制到容器层,然后修改。
4.删除文件
在容器中删除文件时,docker也是会从上往下依次在镜像层查找此文件,找到后,会在容器层中记录下此删除操作
只有当需要修改时才复制一份数据,这种特性被称作“copy-on-write”。可见,容器层保存的是镜像的变化部分,不会对镜像本身进行任何修改。
容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。

构建镜像

构建镜像的方法:
1.docker commit命令
2.dockerfile 构建文件

Docker commit构建镜像:
Docker并不建议用户通过这种方式构建镜像,原因如下:
1.这是一种手工创建镜像的方式,容易出错,效率低而且可重复性弱
2.更重要的:使用者并不知道镜像是如何创建出来的,里面是否有恶意程序,也就是说无法对镜像进行审计,存在安全隐患。
既然docker commit不是推荐的方法,学习的原因:即便是用dockerfile构建镜像,底层也是docker commit一层一层够将新环境的。学习docker commit能够帮助我们更加深入理解构建过程和镜像的分层结构

Dockerfile构建镜像:
首先进入到当前目录/root下,创建文件夹然后创建文件dockerfile。
内容如下:
FROM centos
RUN yum install -y vim
然后执行docker build -t image_name -f path/dockerfile
@当前目录为/root
@dockerfile已经就绪
@运行docker build命令,-t将镜像命名,命令末尾的"."指明了build context为当前目录,docker默认会从build contex中查找dockerfile文件,我们也可以通过-f参数指定dockerfile的位置。
@镜像开始构建,首先docker将build context中的所有文件发送给docker daemon。build context为镜像构建提供所需要的文件或目录。dockerfile中的ADD,COPY等命令可以将build context中的文件添加到镜像。此示例中,bilid context为当前目录/root,该目录下的所有文件和子目录都会被发送给docker daemon。
所以,使用build context就得小心了,不要将多余文件放到build context,特别不要把/,/user作为build context,否则构建过程会相当缓慢甚至失败。
查看镜像分层结构:docker history image_name

镜像的缓存特性

Docker会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经存在,就直接使用,无需重新创建。
之前已经运行相同的命令,这次直接使用缓存中的镜像层。如果我们希望在构建镜像时不使用缓存,可以在docker build命令后面加上 --no-cache参数。
dockerfile中每一个命令都会创建一个镜像层,上层是依赖于下层。无论什么时候,只要某一层发生改变,其上面所有层的缓存都会失效。
除了构建时使用缓存,docker下载镜像时也会使用,例如我们下载httpd镜像。出现XXXX already exist

调试dockerfile

如果此步骤失败,则可以依靠上一步创建的镜像进行调试,方式是通过docker run -it 启动镜像的一个容器。
Dockerfile常用的指令
FROM
指定base镜像
MAINTAINER
设置镜像的作者,可以是任意字符串
COPY
将文件从build context复制到镜像
COPY支持两种形式:
1.COPY src dest
2.COPY ["src","dest"]
注意:src只能指定build context中的文件或目录。
ADD
与COPY类似,从build复制文件到镜像,不同的是,如果src是归档文件(tar,zip,xz),文件会被自动解压到dest。
ENV
设置环境变量,环境变量可被后面的指令使用。例如:
ENV my_version 1.3
RUN apt-get install -y mypackage=$my_version
EXPOSE
指定容器中的进程会监听某个端口,docker可以将端口暴露出来
VOLUME
将文件或目录声明为volume
WORKDIR
为后面的RUN,CMD等指令设置镜像中的当前工作目录。
RUN
在容器中运行指定的命令
CMD
容器启动时运行指定的命令
ENTRYPOINT
设置容器启动时运行的命令
dockerfile中可以有多个ENTRYPOINT指令,但只有最后一个生效,CMD或者docker run之后的参数会被当做参数传递给ENTRYPOINT

镜像命名

[image name] = [repository]:[tag]
如果执行docker build时没有指定tag,会使用默认值lastest

镜像仓库

私有和公有
docker tag [registory-host] [port] [username] [xxx]
docker push ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值