![c27558a3e4c590329264da56415f94e1.png](https://i-blog.csdnimg.cn/blog_migrate/a840c49a69888eddc9d725fadcca1e48.jpeg)
从上篇docker commit学习可以了解到,镜像的定制其实每一层添加的配置和文件,如果把每一层的修改配置,修改文件,都写入脚本,用这个脚本构建定制镜像,无法重复的问题,镜像构建透明性的问题,体积的问题都会解决。这个脚本就是Dockerfile。
![b7968c3e07af1bdff9291eee53f72ea8.png](https://i-blog.csdnimg.cn/blog_migrate/84182ccd9392c35f40d86808458e37f4.jpeg)
Dockerfile
- 什么是dockerfile一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
- 了解FROMFROM指定基础镜像,基础镜像是必须指定的。而FROM就是指定基础镜像,因此一个Dockerfile中From是必备的指令,并且必须是第一条指令。在dockerhub上有很多高质量的docker镜像,有可以直接拿来使用的基础镜像:nginx,tomcat,java,python,php,mongodb。搜寻最符合使用的的一个基础镜像。
- 了解RUNRUN执行命令是用来执行命令行命令的。由于命令行的强大能力,RUN指令在定制镜像时最常用的指令之一。
shell 格式: RUN<命令>,就像直接在命令行中输入的命令一样
exec 格式: RUN["可执行文件","参数1","参数2"],这更像是函数调用中的格式
- 不建议的写成下面这种Dockerfile
> 之前说过Dockerfile每个指令都会创建一个层,下面这种写法就是创建了7层的镜像,这样做就完全是没有意义的,很多运行不需要的东西都被装到这个镜像里面去了,编译环境更新软件包,产生非常臃肿层非常多的镜像,不仅仅增加了构建部署的时间,也很容易出错,也是初学docker容易犯的错误,之前我也犯过。镜像的层数是有限制的,最大层不能超过127层。镜像是多层存储的,在加入一层就是,之前的层不会被修改。
![f1de6b0d0c0f017508dd22a950ed30e5.png](https://i-blog.csdnimg.cn/blog_migrate/ed802eb027037ca6e94e3fc02725563a.jpeg)
正确的方式。一定要做到每一层是需要的东西,任何无关的东西都要被清理掉。这也是制作镜像容易犯的错误,之前安装的文件没有清理。
![47ce15f27d1e409e7d12b02b1f876eb4.png](https://i-blog.csdnimg.cn/blog_migrate/972b1282fe41c4ecc3c4a8388c1de7ee.jpeg)
实战编写Dockerfile
- 创建目录,存放Dockerfile
mkdir newNginx
cd newNginx
![a891e56b38a3529782297a5954b7f6ab.png](https://i-blog.csdnimg.cn/blog_migrate/1714119de3326177f6d424d5199a6dd9.png)
- 编写 Dockerfile
From nginx
RUN echo '<h1>welcome to idig8.com study docker</h1>' > /usr/share/nginx/html/index.html
![ff9617c900999b46fcc73aa6d35290d1.png](https://i-blog.csdnimg.cn/blog_migrate/c251f2489eecf357ec2aced15d69d86e.png)
- 构建Dockerfile
docker build -t nginx:v2 .
docker images
![989672ae8ae3f6c9c5fea8b889f98cde.png](https://i-blog.csdnimg.cn/blog_migrate/cf2eab5d5b921d4f52d36367c142c053.jpeg)
- 推送docker hub推送
>登录docker hub
#先配置dns 8.8.8.8
vi /etc/resolv.conf
docker login
![22975cc1d78d7ead3e20792aba885c9f.png](https://i-blog.csdnimg.cn/blog_migrate/bd3e16bc194a2512f4f4c1bed67fe5b4.png)
![7ac567adbc3dba1dc9ea65eeecc1ad21.png](https://i-blog.csdnimg.cn/blog_migrate/3e5441838705d2875340ceabb0b465af.png)
设置仓库地址,登录http://hub.docker.com
![fbe3282abf4d880aa42a33b2113414c7.png](https://i-blog.csdnimg.cn/blog_migrate/5bdf7c87bb94376f29b5c47f81ba4b54.jpeg)
更改名称
docker tag nginx:v2 zhugeaming/nginx:v2
![34f34043979c0794f7060207b9230092.png](https://i-blog.csdnimg.cn/blog_migrate/655df16181224017b67f76a29eb3b773.png)
完成推送
docker push zhugeaming/nginx:v2
![904fbe0c2c6472af050c3848ad09d04e.png](https://i-blog.csdnimg.cn/blog_migrate/9d39a521a00f54910f4504e10b7a77c4.jpeg)
查看结果
![037f55f33c59a51a81eca660566c98fb.png](https://i-blog.csdnimg.cn/blog_migrate/4c99aeb60e706f0f1b6053c6f63eaee4.jpeg)
![371949a9c1e4ffe904dc9642ee30523c.png](https://i-blog.csdnimg.cn/blog_migrate/3416319d97ab4aa4419ffaf7c372c75d.jpeg)
PS:其实在开发的时候,多任务的时候,只需要一个python3和mitmproxy的镜像环境,已经做好了,到时候直接用docker push zhugeaming/python3-appium,其实想学习docker其他内容可以看我之前写的其他文章。