docker简单使用(二)
Dockerfile简介一
Dockerfile
Dockerfile是一个包含一条条指令的文本文件,其中每一条指令都构建一层(每一条指令的内存,就是描述该层应当如何构建)(docker镜像采用联合文件系统)
1 | 联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。 |
Dockerfile使用示例,建立一个空白文件夹,进去文件夹,创建Dockerfile,编辑Dockerfile,编写指令
1 | mkdir nginxtest |
Dockerfile内容:
1 | FROM nginx |
在当前文件夹,构建镜像:
1 | [root@localhost nginxtest]# docker build -t nginx:v3 . |
注意docker build最后有个.
表示镜像构建的上下文(Context)
镜像构建上下文(Context)
说实话,网上全是抄的一模一样的,全部来去《docker practice》,我也说不好自己理解的是对是错。。
首先,我也抄一下,docker其实是C/S架构,在执行docker build的时候,其实是有和server端(Docker引擎,服务端守护进程)进行交互。
Docker运行时,Docker引擎提供一组REST API,docker命令这样的客户端,就是通过这组API与Docker引擎交互,从而完成各种功能。
因此,在进行docker build的时候,看起来像是在本地进行构建,实际上,是先将上下文定义的路径下构建需要的包上传到Docker引擎,在Docker引擎处(服务端)完成构建。之前进行构建示例时候,有一行可以看出,和server进行了交互:
1 | Sending build context to Docker daemon 2.048kB |
在Dockerfile中经常会需要用到COPY,服务器在执行构建的时候,就需要知道copy的文件的地址,也就是上下文路径,需要注意的是,Docker的镜像构建上下文,即不是docker build执行的路径,也不是Dockerfile当前所在的目录。默认情况下,是建议创建一个空文件夹,然后将构建需要的文件和Dockerfile都放在该文件夹下,这样理所当然的Dockerfile所在路径就是上下文路径。
(说实话,这个上下文,有点晕,不是很理解,我只能理解成是构建需要的文件所在的路径为上下文;也就是为什么要创建一个空文件夹,将构建需要的文件和Dockerfile放进该文件夹的原因)
一定要记住,千万不要把Dockerfile放在根目录,不然会打包整个硬盘
一些Dockerfile指令示例:
1 | COPY ./package.json /etc/ |
上述两句效果是一样的,都是讲上下文下的package.json
拷贝到镜像里面的/etc/
下
1 | COPY /usr/local/nginx/nginx.conf /etc/nginx/ |
上面这条,会无法工作,因为/usr/local/nginx/nginx.conf
已经超出了上下文范文,服务端无法获取该文件
1 | docker build -f /usr/kyle/dockertest/a/Dockerfile . |
当Dockerfile不在构建上下文的根目录下,可以-f指定该文件位置(当前执行docker build在构建上下文下,可以理解为,当前有个空文件夹,里面是构建需要的文件,但是Dockerfile不在当前文件夹下,可以通过-f指定)
.dockerignore
现在上下文中有不想上传到服务端的文件,就需要使用.dockerignore
,例如当前文件夹下有:
1 | [root@localhost mynginx]# ls -al |
不想把text3.txt上传到server,其中Dockerfile内容为:
1 | FROM nginx |
这样,只需要编辑.dockerignore
,将text3.txt添加进去,然后构建镜像即可
可以起容器,进去验证:
1 | [root@localhost mynginx]# docker run --name web2 -d -p 8070:80 nginx:v4 |
可以看到,已经忽略了text3.txt
tips:删除镜像:docker rmi imageid
1 | [root@localhost mynginx]# docker rmi a59be9875db4 |