声明:这是我在大学毕业后进入第一家互联网公司学习的内容
深入浅出Docker原理及实战系列第四篇,我主要分享制作镜像的两种方法以及如何高效构建镜像的注意点,最后展示一个构建项目级镜像的实践过程
创建镜像的方式
创建一个指定的镜像有两种方式
- 基于一个现有的镜像来修改 docker commit
- 基于Dockerfile来创建 docker build
基于一个现有的镜像来修改
命令:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
--author , -a 作者(例如“ rugod.cn ”)
--change , -c 将Dockerfile创建的镜像进行更新
--message , -m 提交讯息
--pause , -p true 提交期间暂停容器
你可以理解成快照,不过不是你在容器里所有的操作都会快照上,支持更改命令有 CMD| ENTRYPOINT| ENV| EXPOSE| LABEL| ONBUILD| USER| VOLUME|WORKDIR
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c3f279d17e0a ubuntu:12.04 /bin/bash 7 days ago Up 25 hours desperate_dubinsky
197387f1b436 ubuntu:12.04 /bin/bash 7 days ago Up 25 hours focused_hamilton
$ docker commit --change='CMD ["apachectl", "-DFOREGROUND"]' -c "EXPOSE 80" c3f279d17e0a svendowideit/testimage:version4
f5283438590d
$ docker run -d svendowideit/testimage:version4
89373736e2e7f00bc149bd783073ac43d0507da250e999f3f1036e0db60817c0
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
89373736e2e7 testimage:version4 "apachectl -DFOREGROU" 3 seconds ago Up 2 seconds 80/tcp distracted_fermat
c3f279d17e0a ubuntu:12.04 /bin/bash 7 days ago Up 25 hours desperate_dubinsky
197387f1b436 ubuntu:12.04 /bin/bash 7 days ago Up 25 hours
总结:一般来说这种修改的方式镜像都是用于测试构建,不适合生产环境的构建。
注意!!!提交操作将不包含容器内挂载卷中的任何数据。
基于Dockerfile来创建
常规来讲,镜像都是需要有一个dockerfile来构建的,但是我们在制作前需要理解一下底层的构建原理,这很重要
底层构建原理
先回顾一下Docker的架构=Docker客户端(CLI)+Docker服务端(docker的守护进程)。
Docker 客户端通过 REST API 和服务端进行交互,docker 客户端每发送一条指令,底层都会转化成 REST API 调用的形式发送给服务端,服务端处理客户端发送的请求并给出响应。
Docker 镜像的构建、容器创建、容器运行等工作都是 Docker 服务端来完成的,Docker 客户端只是承担发送指令的角色。
所以构建一个镜像是由Doc