镜像是容器的基础,每次执行docker run的时候都会制定哪个镜像作为容器运行的基础。在之前的例子中,我们所使用的都来自于Docker Hub的镜像。直接使用这些镜像是可以满足一定的需求,而当这些镜像无法直接满足需求的时候,我们就需要定制这些镜像。
镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础层上加一层作为容器运行时的存储层。
我们定制一个Web服务器为例。
docker run --name webserver -d -p 80:80 nginx
以上命令会用nginx镜像启动一个容器,命名为webserver,并且映射了80端口,这样我们可以用浏览器去访问这个nginx服务器。
然后访问地址。
试着修改一下nginx的欢迎界面。
docker exec -it webserver bash echo '<h1>My Docker</h1>' > /usr/share/nginx/html/index.html
我们以交互式终端方式进入webserver 容器,并执行bash命令,也就是获的一个可操作的shell,然后覆盖了nginx下的index.html内容,刷新浏览器。
我们修改了容器的文件,也就是改动了容器的存储层。我们可以通过docker diff ID | name 查看改动内容。
容器内容改变了,如果我们希望保存成新的镜像,那么我们可以使用docker commit命令,语法为:
docker commit \ --author "update by wt" \ --message "修改了nginx的主页" \ webserver \ //ID或者名称 nginx:v2
其中, --author 是指定修改的作者,而 --message是备注,可以留空。
docker images 查看新的镜像
新的镜像定制好之后,我们可以运行这个镜像
docker run --name newwebserver -d -p 81:80 nginx:v1
这里我们命令为新的服务newwebserver ,并且映射到81端口。访问在浏览器加端口即可http://192.168.52.133:81,然后获的shell修改nginx欢迎界面即可。
慎重docker commit,关于为什么慎用,去网上搜索一下。