dockerfile构建镜像

我只是一个虾纸丫 提交于 2020-02-29 13:49:57

在操作系统中,我们可以通过ps看到各式各样的进程,这些进程有如下特点:
1.进程可以相互看到,可以相互通信
2.他们使用同一个文件系统,可以对同一个文件做读写操作
3.这些进程使用相同的系统资源
上述这些特点会带来一些问题,具体如下:
可以相互通信,高权限进程可以攻击其他进程
使用同一个文件系统,拥有高权限的进程可以对其他进程已有的数 据进行增删改查,不同进程之间的依赖会相互冲突
使用同一个宿主机资源,会存在资源抢占问题
linux系统中通过chroot这个工具,将子目录变成根目录,达到视图级别的隔离,系统在chroot的帮助下,具有独立的文件系统
使用namespace技术实现进程在资源的视图上进行隔离
使用Cgroup来限制资源使用率

而具有这些特性的进程的集合,就可以称为容器
总的来说,容器就是一个视图隔离,具有独立文件系统,资源可限制的进程集合。
镜像:我们将这些容器运行时所需要的所有文件的集合称为镜像
我们一般情况下通过dockerfile来构建镜像
dockerfile特点:
一般我们通过dockerfile构建镜像,每个构建步骤都会对已有的文件系统进行操作,对文件系统内容带来变化,我们将这些变化称为changeset
changeset具有分层和复用的特点,
1.可以提高分发效率,对于大的镜像,可以将其拆分为各个小块,可以提高分发效率,拆分后可以并行的下载这些数据
2.这些数据是相互共享的,这就意味着当本地储存上包含一些数据时,我们只需要下载本地没有的数据就可以
3.因为镜像的数据时共享的,因此可以大量节约磁盘空间
dockerfile命令
FROM:必须是第一条命令,指定基础镜像
写法:FROM:/
tag和digest是可选项没有的话默认为latest
MAINTAINER:指定作者
LABEL:为镜像添加元数据
一个dockerfile可以有多个label key:value形式
ADD:将本地文件添加进容器,tar类型的文件会自动解压,可以访问网络资源,类似wget,但网络压缩资源不会被解压
RUN:构建镜像时执行的命令
有两种格式
shell执行:
run
exec执行(类似于函数调用):
run json字符串格式
run命令创件的中间镜像会被缓存,并在下次构建的时候使用,如果不想使用这些缓存镜像,可以在构建的时候指定–no-cache参数
COPY
copy只能复制本地文件,其他用法和copy一致
** EXPOSE**:暴露容器运行时监听端口给外部
但是expose不会使容器访问主机的端口,如果要访问,需要在docker run运行容器时通过-p来发布这些端口,或者直接-p expose导出所有端口
ENV:设置环境变量
env语法有两种
一种key value key后的所有内容均为value的组成部分,一次只能设置一个变量
key=value。。。可以设置多个变量每个变量为一个key=value键值对
如果key中有空格可以用/来转义
CMD:容器启动时要运行的命令
也是shell加json两种语法格式,[]中的命令要用双引号引起来
cmd和run的区别:
cmd可以被docker run 指定的程序覆盖,cmd中的命令是在docker run时期运行。
run是指buid时运行的命令
ENTRYPOINT:启动时默认命令
和cmd的区别:
只能写一条,多了最后一个生效
entrypoint不会被覆盖,cmd会被覆盖
同时有cmd和entrypoint时,谁在最后谁生效
VOLUME:可以实现挂载功能,将宿主机目录挂载到容器
USER:启动容器的用户
WORKDIR:设置工作目录
ARG:设置变量命令:在build时用build-arg来指定参数
ONBUILD:设置镜像触发器,对当前镜像的子镜像生效
STOPSIGNAL:当容停止的时候给系统发送什么指令 默认15
HEALTHCHECK:给容器做健康检查
当有了dockerfile后,可以通过dicker build命令构建出所需要的应用,构建的结果储存在本地,通过docker push推送到镜像仓库中

当镜像构建完成后我们就可以运行容器了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!