docker~Dockerfile优化程序的部署
一些理论
我们都知道docker这个容器工具可以帮助我们快速进行环境的部署,这对于运营人员来说,无疑是个福音,而这个工作大叔认为不应该是运营人员干的,而是由开发人员来做,因为只有你知道你干的是什么,你干了它,就应该要部署它,或者把部署的过程写成一个脚本,让运营人员去执行,就可以了,这也许就是docker产生的原因吧!
Dockerfile是为快速构建docker image而设计的,当你使用docker build 命令的时候,docker 会读取当前目录下的命名为Dockerfile(首字母大写)的纯文本文件并执行里面的指令构建出一个docker image。
Dockerfile的组合可以用一张图来表示
Dockerfile的一些命令
Dockerfile是将一组脚本组合在一个文件中,然后它让批量执行,而脚本中最重要的就是FROM,它告诉docker要启动哪个镜像,然后后观的动作都是针对这个image来执行——我们要想执行一个Dockerfile文件,可以使用下面的代码:
$ docker build -f /path/to/a/Dockerfile .
下面是从eshoponcontainer中截取的一个Dockerfile文件的内容,我们可以学习一下
FROM microsoft/aspnetcore:1.1.2 ARG source WORKDIR /app EXPOSE 80 COPY ${source:-obj/Docker/publish} . ENTRYPOINT ["dotnet", "Basket.API.dll"]
从上面代码中,我们看到Dockerfile有几个命令,下面具体说明一下
FROM
基于哪个镜像
RUN
安装软件用
MAINTAINER
镜像创建者
CMD
Container启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD.
CMD主要用于container时启动指定的服务,当Docker run command的命令匹配到CMD command时,会替换CMD执行的命令。
ENTRYPOINT
container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条
ENTRYPOINT没有CMD的可替换特性
USER
使用哪个用户跑container
EXPOSE
container内部服务开启的端口。主机上要用还得在启动container时,做host-container的端口映射:
ADD
将文件<src>拷贝到container的文件系统对应的路径<dest>
所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0
如果文件是可识别的压缩格式,则docker会帮忙解压缩
如果要ADD本地文件,则本地文件必须在 docker build <PATH>,指定的<PATH>目录下
如果要ADD远程文件,则远程文件必须在 docker build <PATH>,指定的<PATH>目录下。
注意:使用docker build - < somefile方式进行build,是不能直接将本地文件ADD到container中。只能ADD url file.
ADD只有在build镜像的时候运行一次,后面运行container的时候不会再重新加载了。
VOLUME
可以将本地文件夹或者其他container的文件夹挂载到container中。
WORKDIR
切换目录用,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效
ONBUILD
ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行
好了,今天就说这么多,总之我们要知道,Dockerfile主要用来快速生成image和快速部署应用环境的!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2016-06-20 插件~使用ECharts动态在地图上标识点
2013-06-20 EF架构~引入规约(Specification)模式,让程序扩展性更强
2012-06-20 面向对象的故事~数据底层操作告诉了我们接口,抽象类,继承与多态性的使用