在使用DockerFile
定制镜像之前,我们先来了解一下镜像的构成:镜像是容器的基础,每次执行docker run
命令的时候都会指定哪个镜像作为容器运行的基础。在之前的栗子中,我们使用的镜像都是来着Docker Hub的镜像。直接使用这些镜像为基础运行容器可以一定程度上满足我们的需求,可是当这些镜像都无法直接满足需求时,我们就需要定制镜像!
docker commit构建
现在我们以定制一个Web服务器为例:
root@ubuntu:~# docker run --name webserver -d -p 80:80 nginx
f0a2ad681b692642be0b825631d8716ae3d8c1fb5ad48148362331df3fae9775
此时,我们在浏览器中访问本机地址,例如以本机为例192.168.0.89
,如图:
这条命令会以Nginx为镜像创建并启动一个容器,映射了80端口,这样我们可以在浏览器中访问这个Nginx服务器!假设,我们现在不喜欢这个欢迎页面的样式,想把它改为“Hello Docker!”,我们可以使用docker exec
命令,进入容器,修改器内容:
root@ubuntu:~# docker exec -it webserver bash
root@f0a2ad681b69:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@f0a2ad681b69:/# exit
此时,我们再刷新浏览器的话,发现内容已经发生了改变,如图:
改变了容器的文件,也就是说,改变了容器的存储层,我们可以使用docker diff
来查看文件的修改情况:
root@ubuntu:~# docker diff webserver
C /root
A /root/.bash_history
C /run
A /run/nginx.pid
C /usr/share/nginx/html/index.html
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
现在,我们定制好了变化,希望能将其保存下来形成镜像。要知道,我运行一个容器的时候,我们对任何文件的修改操作都会记录在容器的存储层里。Docker提供了一个docker commit
命令,可以将容器的存储层保存为镜像。docker commit
的语法格式为:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
下面,我们将上面那个容器保存为镜像,命令如下:
root@ubuntu:~# docker commit --author "ycx <ycx921101@163.com>" --message "修改了Nginx欢迎页面" webserver nginx:v1.0
sha256:1b6b342acb5e91a5da9a564818e94ec1041f7a152b249075f109b0c259d580f0
--author
指定修改的作者,--message
为记录本次修改的内容,webserver
为容器名,也可以传入容器ID,nginx:v1.0
为仓库名和标签。保存成功之后,会返回一个摘要!接下来,我们使用docker image ls
命令来查看当前宿主机上所有的镜像:
root@ubuntu:~# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1.0 1b6b342acb5e 5 seconds ago 109MB
nginx latest 5699ececb21c 5 days ago 109MB
我们刚刚保存的镜像已经出现在上面了!!!
我们还可以使用docker history
命令来查看镜像内的历史记录,接下来,我们查看以下刚刚保存的镜像内的历史记录,如下:
docker history nginx:v1.0
IMAGE CREATED CREATED BY SIZE COMMENT
1b6b342acb5e 4 minutes ago ngi