使用docker commit创建镜像时我们需要先基于镜像运行一个容器,然后进入容器修改后保存为一个新镜像。
使用Dockerfile定制镜像的时候我们就不需要先启动一个容器了,但是我们仍然需要基于一个容器,当然我们可以基于一个空的容器来实现全diy。使用Dockerfile定制镜像我们就更容易理解容器是一层一层的了。
最简单的我们实现之前我们用commit保存的镜像
1.编写Dockerfile
首现创建一个新目录
# 文件名未必一定是Dockerfile
# 如果是其他名字的话后面我们在执行定制镜像命令时需要指定文件名(docker默认是Docker)
mkdir mynginx && cd mynginx && touch Dockerfile
进入Dockerfile输入下面两行保存:
# FROM是必备且必须是第一个指令,就是前面提到的需要基于一个镜像
FROM nginx
# RUN是执行指令 重写index.html文件
RUN echo "<h1>hello world</h1>" > /usr/share/nginx/html/index.html
2.定制镜像:docker build
docker build -t nginx:v2.0 .(这里有一个"点")
这样我们的镜像就定制好了,可以docker image ls查看
ps:
Dockerfile我们可以理解为docker脚本,就像一个命令罗列的shell脚本,每一句执行命令(如:RUN)就是一层,有多少个执行命令就是多少层。
这样我们就不难理解为什么我们commit保存的时候为什么是加一层而不是修改了,因为在生成镜像的时候是命令罗列的形式一个命令一个命令执行的完成的,而一个命令就是一层,每一层创建好之后这一层就创建结束了,想要修改就必须加一条命令(即添加一层)来修改,所以每一层的创建都要小新认真。
一个镜像不得超过127层(之前是42层)