写在本章前
在开始本章前,想做一个《每天5分钟docker系列》的内容说明。
很多人学习新技术的时候,往往抓不住技术的主线,上来就从手册第一页读到手册的最后一页,结果因为手册上的命令太多,又不知道用在哪儿,导致学的很迷茫,学着学着就放弃了。
在下不才,略懂一点docker容器相关知识,希望通过应用的角度给小伙伴们提供一个简单易懂的入门教程。
因此,本系列主要从开发常用的一些lnmp的环境配置说起,然后一点一点的介绍里面用到的命令。
有时候文章中说到的一些操作docker提供了很多种命令实现,但我们只会先说一种常用的,为的是保证大家能够了解这个东西从前到后是怎么玩的。
后面咱们会再慢慢地去覆盖其他的命令,这样可以大大降低大家学习的难度,也希望大家能跟着我这个系列坚持下来。
认识dockerfile
我们之前安装软件,是到docker hub仓库上面去搜索对应的镜像,
比如安装nginx,我们在对应的nginx下的标签列表中找到自己需要的版本的镜像,如果细心一点我们可以看到,如下的内容:
上图中,箭头所指向的内容是一串英文,中文意思是:支持的标签和相应的Dockerfile链接。
”标签“ 其实就是对应的我们的nginx镜像的版本,但是这里面说到的Dockerfile链接是什么呢?点击一个链接接试试?
点击其中一个标签的链接,便跳转到了github上名称为Dockerfile的文件里面去。
这写着一条条命令的dockerfile和镜像之间有什么关系吗?
Dockfile是专门被Docker程序解析的脚本文件,文件名一般就叫Dockerfile,没有后缀,里面写的一条一条指令,对应着Linux下面的一条条shell命令,Docker程序会将这些Dockerfile指令翻译成真正的Linux命令。
Dockerfile和镜像的关系有点像我们平时写的js,为了压缩js文件的体积,在写完源js文件之后,会执行压缩命令,把js文件压缩,压缩后的js文件体积虽然小,但是打开之后不易读,不好维护,所以我们在代码要修改的时候,还是会修改js源文件,然后再重新生成压缩的js文件。
这里面压缩前的源js文件就好比dockerfile,压缩后的js文件就好比镜像,压缩的命令就好比docker的构建命令。
当我们执行docker build命令进行构建的时候,Docker程序将读取Dockerfile里面的内容,根据指令生成相应的镜像。
因此,当我们需要定制自己的镜像时,只需在Dockerfile上添加或者修改部分指令,然后重新生成镜像即可,省去了敲命令的麻烦。
到这里,我们也就明白了,docker hub上面存放着镜像和Dockerfile的github地址这两种,是为了让人们根据自己的需要去下载,想要自定义镜像的可以下载Dockerfile,想要直接快速构建容器可以docker pull 找个镜像。
如何写dockerfile
认识了Dockerfile,那接下来就来看看Dockerfile里面该怎么写吧?
Dockerfile每一行只支持一条指令,且指令需要大写,docker会按照指令从上而下顺序执行。
我们来写一个简单的nginx的Dockerfile文件。
先在一个目录下创建一个名为Dockfile的文件,然后在里面写上下面的内容:
#继承自nginx镜像
FROM nginx
#镜像维护者的姓名和邮箱MAINTAINER
MAINTAINER laohemanhua<xxxx@qq.com>
#设置容器启动后进入的工作目录WORKDIR
WORKDIR /usr/share/nginx/html/
#执行创建目录的命令
RUN mkdir ceshi
#执行进入到ceshi文件夹下
RUN cd ceshi
#将宿主机上./ceshi.html文件拷贝到容器中去
COPY ./ceshi.html /usr/share/nginx/html/ceshi
这段Dockfile的指令,咱们依次来解释下:
第一个命令:FROM nginx,这里面大写的FROM是docker的一个指令,FROM关键词后面跟的什么就代表当前的基础镜像是什么,FROM nginx就代表当前基础镜像是nginx,继承自nginx镜像,我们就不需要再安装nginx了,当然你也可以写其他的镜像,比如centos系统镜像都行。
这有点像面向对象里面的继承父类的意思。当FROM nginx指令执行的时候,docker会先从本地获取nginx镜像,如果没有,会从远程的docker仓库把这个nginx镜像下载下来。
第二个命令:MAINTIANER 这个指令后面跟的是作者的名字和邮箱,当然这个命令你也可以不写
第三个命令:WORKDIR 这个指令代表容器启动后进入的工作目录
第四个指令:RUN 这个指令代表构建镜像的时候执行哪些shell命令,后面跟的就是shell命令。
第五个指令:COPY 这个指令代表我们将宿主机的./ceshi.html文件拷贝到容器中的/usr/share/nginx/html/ceshi目录中去
其实,docker还提供了一些其他的指令,大概十多个,不过这里咱们既然只用到这些,就先说这么多,先入门,了解下怎么玩的,后面咱们再去覆盖其他的命令。
通过Dockerfile构建镜像
既然我们自己创建了Dockfile,如何把它变成镜像呢?不是说执行下docker build就好了吗?
是的,只要执行如下的指令就能用我们的Dockerfile文件构建出镜像:
docker build -t local-nginx-1 .
上述命令说明:
docker build命令用来从Dockerfile文件构建出一个镜像出来,-t代表我们要构建出来的镜像叫啥,上面我们的镜像叫做local-nginx,命令的最后还有一个点号,这个点号代表Dockfile文件所在的目录为当前目录,如果在别的目录需要指定清楚。
效果如下,我们可以看到输出了我们刚刚的每一条命令,在最后显示成功构建:
上图也说明,docker在构建容镜像的时候,确实是一条一条的去解析命令。
然后,我们去查看下镜像是不是真的存在,执行docker images,可以看到,镜像确实已经有了。
至此,我们在nginx这个基础镜像上自定义了一个Dockerfile文件,并基于这个Dockerfile文件构建了我们的镜像也就完成了。
好啦,这就是今天的全部内容,如果您有疑问,可以在下方留言哦~
公众号:老何漫话
id:laohemanhua