b2b电商系统搭建的关键步骤与最佳实践解析,助力企业数字化转型
716
2022-05-29
在《【docker系列】逐行解析Nginx镜像Dockerfile(学习经典)》文章中我们已经将Dokcerfile的核心指令做了详尽的说明解释,本文我们就学习使用Dockerfile构建镜像,以及对Dockerfile的使用做一些补充说明。
文章目录
一、使用Dockerfile构建镜像
二、` .dockerignore` 文件
三、用户切换USER
四、VOLUME指令(不建议使用)
五、ADD与COPY的区别(不建议使用ADD)
六、哪些指令会产生镜像分层
一、使用Dockerfile构建镜像
使用docker build指令构建镜像如下所示:
docker build -t <镜像名称>:<标签或版本号> /path/to/a/Dockerfile
1
-t− 给镜像指定名称并且添加一个标签或版本号
/path/to/a/Dockerfile Dockerfile所在的路径
我们写一个最简单的Dockerfile用来做实验
from ubuntu CMD echo "hello world from zimug"
1
2
把Dockerfile放入一个目录,并在该目录下执行下面的构建命令。命令行最后的一个点表示当前路径。
docker build -t helloworld:1.0 .
1
构建过程分为2步,因为我们只写了2个指令。
通过docker images查看构建完成的镜像
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE helloworld 1.0 a4c0e3f907ee 2 minutes ago 72.8MB
1
2
3
运行docker run从镜像启动一个容器,可以看到echo命令生效,终端显示“hello world from zimug”
二、 .dockerignore 文件
细心的读者可能会看到,上文中在执行构建命令docker build的时候出现了下面的这一行日志。这是因为在执行镜像构建的时候,会将Dockerfile所在路径的文件发给Docker daemon,也就是说这个目录下的所有文件全部提交给Docker daemon,如果这个路径下文件比较多就会很耗时。
Sending build context to Docker daemon 1.864GB
1
当然我们在构建镜像的时候,尽量保证Dockerfile所在路径不存在镜像构建无关的文件。除此之外,还有一种方式就是写一个.dockerignore文件,将与构建镜像无关的文件全都写道这个文件里面。如:
*.log *.md data logs
1
2
3
4
这样在执行构建命令的时候,无关的文件就不会被发往Docker daemon,构建过程也更加快速。
Sending build context to Docker daemon 83.95MB
1
三、用户切换USER
对于绝大多数软件,使用ROOT用户启动是不够安全的,甚至有些软件服务根本就不允许使用root用户启动。所以我们需要一个在容器内切换用户的指令,他就是USER。比如:
RUN groupadd -r redis && useradd -r -g redis redis USER redis
1
2
需要说明的是USER只能切换用户,前提是该用户已经存在。如果不存在,我们可以像上文一样先用RUN指令+shell命令去创建。
四、VOLUME指令(不建议使用)
Dockerfile还有另外一个指令,我没有为大家介绍过,从我个人的经验来看不建议使用它。
VOLUME ["/data1","/data2"]
1
比如上面的VOLUME会在容器启动时,将容器内的"/data1","/data2"路径映射到宿主机本地目录,映射关系可能是
当我们容器被销毁后这个路径仍然存在,会造成垃圾数据。如果确实需要Volume数据卷可以使用docker run -v显示指定,或者使用后面文章中会为大家介绍的docker volume来命名创建数据卷。
五、ADD与COPY的区别(不建议使用ADD)
在我之前的文章中已经介绍COPY指令的作用是将执行镜像构建的本地文件或目录src拷贝到宿主机的文件目录dest中去。还有一个和COPY指令非常相似的指令就是ADD指令,语法和COPY几乎一致,但是功能比COPY更加强大。
COPY
1
2
那么ADD比COPY强大在那些地方呢?
ADD支撑从URL下载文件并添加文件到镜像中,也就是上文中的src可以是URL路径。
ADD指令,如果源文件是压缩文件,会自动解压到镜像文件中去。
虽然ADD比COPY功能更强大,但是不建议使用。特别在使用压缩包时它会使构建缓存失效,也会带来一些令人迷惑的问题。如果确实需要解压缩压缩包,使用RUN指令加上shell脚本的解压命令行进行压缩包解压即可。
六、哪些指令会产生镜像分层
在镜像构建过程中,需要向镜像写入数据的时候会产生分层,一个写操作命令产生一个分层。 那么哪些指令可能产生“写入操作”呢?
一定会产生写入数据操作的是下面的三个指令
FROM
ADD
COPY
有可能产生写入数据操作的指令是下面三个,是否产生写操作取决于其脚本执行过程是否有磁盘写操作
RUN
CMD
ENTRYPOINT
Docker 镜像服务
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。