Docker 系列】docker 学习七,DockerFile 编写和实战

简介: Docker 系列】docker 学习七,DockerFile 编写和实战

【Docker 系列】docker 学习六,DockerFile

我们开始来一起学习 DockerFile 的知识点

DcokerFile 是用来构建 docker 镜像的文件,是一个命令参数脚本

一般 docker 镜像的构建步骤:

1、编写一个 dockerfile  文件

2、docker build 构建成为一个镜像

3、docker run 运行镜像

4、docker push 发布镜像(咱们可以发布到 DockerHub,也可以发布到阿里云上面)

我们来看看官方的镜像是咋玩的

例如我们在 DockerHub 上搜索 ubuntu ,看看官网的 DockerFile 是啥样子的

hub.docker.com/_/ubuntu

image.png

image.png

点击链接我们会进入到 git 仓库上,也是 DockerFile

image.png

咱们看到就 3 行 Docker 命令,是官方做成镜像的 DockerFile,所以这个官方的 ubuntu 镜像是非常简单的,阉割版本的,甚至连 clear 命令都没有,ll命令也没有

很多的官方镜像包都是非常简单的,很多功能都是没有的,我们通常会自己搭建自己的镜像来满足我们的各种需求

DockerFile 的构建过程

官方能构建镜像,我们也可以自己的镜像

DockerFile 的基础知识:

  • 每个 DockerFile 的保留字(指令),都必须是大写的
  • DockerFile 脚本执行是按照顺序执行的
  • # 表示注释
  • 每一个指令都会创建提交一个新的镜像层,并提交

可以在网络上找到这样的图片,可以看到镜像是一层一层的,可以在浏览器上搜索到 DockerFile 里面的指令解释

image.png

dockerfile 是面向开发的,我们以后在做项目的时候,是直接发布一个镜像,交付的是一个镜像,就需要编写 DockerFile 文件,这个文件非常的简单!

咱们必须要掌握 Docker 镜像,逐渐成为企业交付的标准了。

咱们学习的过程是先会使用别人的东西,再去研究别人是怎么写的,进而我们也学会如何去写,去开发

例如:

我们先学习使用了,

DockerImages:通过 DockerFile 构建生产的镜像,最终发布和运行的产品

Docker 容器:容器服务就是镜像运行起来的服务器

现在我们开始详细学习 DockerFIle : 构建文件,定义了一切的步骤,这是源代码

DockerFile 的指令

图片来源于网络,我们一一解释一波

image.png

  • FROM

基础的镜像,一切都是从这里开始的

  • MAINTAINER

指明镜像是谁写的,写下自己的姓名和邮箱

  • RUN

镜像构建的时候需要运行的命令

  • ADD

加入某些配置,例如加入 mysql 的压缩包,添加内容

  • WORKDIR

镜像的工作目录

  • VOLUME

挂载目录

  • EXPOSE

暴露端口 和 -p 是一个效果

  • CMD

指定这个容器启动的时候执行的命令,只会是最优一个指令进行生效,会被替代

  • ENTRYPOINT

指定这个容器启动的时候执行的命令,可以追加

  • ONBUILD

当构建一个被继承的 DockerFIle ,这个时候就会运行 ONBUILD 的指令,触发相应的动作

  • COPY

与 ADD 类似,此命令是将文件拷贝到镜像中

  • ENV

构建的时候设置环境变量

乍一看感觉 CMDENTRYPOINT功能好像差不多,但是还是不太清楚具体区别在哪里,文章末尾会有详细说明

实战

我们自己来做一个自定一个 ubuntu 镜像

官方的ubuntu是阉割版本的,很多工具和命令都是不支持的,那么我们就自己加进去,自给自足

image.png

自己写一个 DockerFile

这里需要注意的是,基本上 99%的镜像,都是基于这个基础镜像 scratch,我们可以看到官方的 DockerFIle 也是基于这个镜像来玩的

ubuntu git url

image.png

那么我们可以基于这个 ubuntu 来进行自定义,加入一些我们需要的工具,如vimifconfig

FROM ubuntu
RUN apt-get update          # 更新源
RUN  apt-get install -y vim     # 安装 vim
RUN  apt-get install -y net-tools # 安装 net-tools
ENV MYPATH /usr/local       # 设置环境变量
WORKDIR $MYPATH           # 设置镜像工作目录
EXPOSE 8888             # 暴露端口
CMD echo "----- end -----"      # 执行 echo 命令
CMD /bin/bash

开始构建

docker build -f dockerfile2 -t xmtubuntu .

如果不在 DockerFile 中写入 apt-get update 更新源,会出现下面这个问题,这个要注意

image.png

执行上述命令,会看到如下打印信息,最终会看到Successfully,即为构建成功

image.png

image.png

image.png

通过上图我们可以看出, DokerFile 中写了 9 个步骤,执行的时候也是分了 9 步,知道全部成功才算成功

最终构建成功后我们可以看到


Successfully built a6f88c9f245b
Successfully tagged xmtubuntu:latest

验证结果

docker images 查看我们的镜像


# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
xmtubuntu             latest    a6f88c9f245b   13 minutes ago   172MB

xmtubuntu 这个镜像的构建过程我们可以清晰的看出都执行了哪些步骤,当然,同样的方式,我们也可以看看官方的镜像是如何构建的,我们来看看官方 ubuntu 的

# docker history a6f88c9f245b
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
a6f88c9f245b   14 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B
3c0d23b8188f   14 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B
ffb019142fc7   14 minutes ago   /bin/sh -c #(nop)  EXPOSE 8888                  0B
8867e6d97670   14 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B
c9d0141ec3b0   14 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B
41e73f7e314d   14 minutes ago   /bin/sh -c apt-get install -y net-tools         1.52MB
52013ca51f1d   14 minutes ago   /bin/sh -c apt-get install -y vim               68.2MB
5ea7d553d403   14 minutes ago   /bin/sh -c apt-get update                       29.7MB
1318b700e415   11 days ago      /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      11 days ago      /bin/sh -c #(nop) ADD file:524e8d93ad65f08a0…

xmtubuntu 这个镜像的构建过程我们可以清晰的看出都执行了哪些步骤,当然,同样的方式,我们也可以看看官方的镜像是如何构建的,我们来看看官方 ubuntu 的

# docker history ubuntu
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
1318b700e415   11 days ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      11 days ago   /bin/sh -c #(nop) ADD file:524e8d93ad65f08a0…   72.8

官方的就很简单,阉割了很多东西,我们可以看出官方的 ubuntu 就 2 个步骤,第一个是加入ubuntu 压缩包,第二个就是 /bin/bash

我们查看我们的自定义镜像 xmtubuntu

image.png

果然,我们的自定义ubuntu镜像,有了vimifconfig工具,实战成功

CMD 和 ENTRYPOINT 的区别

  • CMD

指定这个容器启动的时候执行的命令,只会是最优一个指令进行生效,会被替代

  • ENTRYPOINT

指定这个容器启动的时候执行的命令,可以追加

如何理解呢?我们来做一个对比试验就可以很好的理解上述的解释说明,docker 里面有很多命令会有这样的微小区别,我们可以举一反三,慢慢深入学习

CMD 的例子

写一个简单的 DockerFile  文件名为 dockerfile-cmd


FROM xmtubuntu
CMD ["ls","-a"]

构建镜像

e# docker build -f dockerfile-cmd -t dockerfile-cmd .
Sending build context to Docker daemon  1.346GB
Step 1/2 : FROM xmtubuntu
 ---> a6f88c9f245b
Step 2/2 : CMD ["ls","-a"]
 ---> Running in 101670af4290
Removing intermediate container 101670af4290
 ---> 1697fc03b8ce
Successfully built 1697fc03b8ce
Successfully tagged dockerfile-cmd:latest

创建并启动容器

docker run 101670af4290,可以看到如下效果

image.png

我们尝试在启动容器时候追加命令

docker run 101670af4290 -l,就会有如下报错


# docker run 1697fc03b8ce -l# 

原因如下:

使用 CMD指令是(例如我们的例子是  ls -a),我们在启动容器的时候,后面追加的命令(-l)会把 ls -a替换掉,由于-l不是一个命令,因此报错

ENTRYPOINT 的例子

写一个简单的 DockerFile  文件名为 dockerfile-entrypoint

FROM xmtubuntuENTRYPOINT ["ls","-a"]

构建镜像,创建并启动容器和 CMD 的例子一模一样,咱们直接启动容器的效果和 CMD的例子也是一模一样,我们直接来看启动容器并追加参数的例子

image.png

可以看出使用 ENTRYPOINT是可以在后面追加参数的,使用CMD若指令后面追加参数,那么会覆盖CMD指定的指令

那么,对于以后遇到相关的指令,我们也可以举一反三,做对比试验,这样我们就会理解的更加清楚

如何发布我们的镜像

1、登录 dockerhub

没有注册的 xdm 可以注册一个,hub.docker.com/


# docker login -u xxxx用户名
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded

2、修改我们的镜像 tag

docker tag 我们的镜像id 我们的docker用户名/镜像名字:版本

3、将镜像推到我们自己的仓库中

image.png

发布镜像的时候,也是按照一层一层的提交的

最后补充一个网络上找到的图片,现在看这张图就能更清晰的明白其中的原理了

image.png

参考资料:

docker docs

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~


相关文章
|
1月前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
23天前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
209 5
|
5月前
|
运维 监控 数据可视化
容器化部署革命:Docker实战指南
容器化部署革命:Docker实战指南
|
4月前
|
供应链 测试技术 开发者
用 Docker 轻松部署 ERPNext 15:多场景实战指南
ERPNext 15 是一款功能全面的开源企业资源规划系统,结合 Docker 容器化部署,具备高效、灵活、低成本等优势。适用于小微企业数字化起步、多分支机构协同办公、开发者测试环境搭建、短期项目管理及企业内部培训等多种场景。模块化设计支持按需扩展,满足不同规模企业需求,是实现高效企业管理的理想选择。
用 Docker 轻松部署 ERPNext 15:多场景实战指南
|
5月前
|
安全 Java Docker
Docker 部署 Java 应用实战指南与长尾优化方案
本文详细介绍了Docker容器化部署Java应用的最佳实践。首先阐述了采用多阶段构建和精简JRE的镜像优化技术,可将镜像体积减少60%。其次讲解了资源配置、健康检查、启动优化等容器化关键配置,并演示了Spring Boot微服务的多模块构建与Docker Compose编排方案。最后深入探讨了Kubernetes生产部署、监控日志集成、灰度发布策略以及性能调优和安全加固措施,为Java应用的容器化部署提供了完整的解决方案指南。文章还包含大量可落地的代码示例,涵盖从基础到高级的生产环境实践。
239 3
|
分布式计算 Java Linux
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
Docker 是一套构建在 Linux 内核之上的高级工具,旨在帮助开发人员和运维人员更轻松地交付应用程序和依赖关系,实现跨系统和跨主机的部署。使用安全且轻量级的容器环境来实现这一目标。容器可以手动创建,也可以通过编写 Dockerfile 自动创建。开发人员和运维人员可以将应用程序及其依赖打包到容器中,实现应用程序的可移植性和环境一致性。
448 5
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
|
Linux 应用服务中间件 Shell
docker学习--docker容器镜像常用命令大全(简)
本文档详细介绍了Docker中的镜像命令与容器管理命令。镜像命令部分涵盖了镜像搜索、下载、上传等操作;容器管理命令则包括了容器的创建、启动、停止、删除及日志查看等功能。通过具体示例,帮助用户更好地理解和使用Docker相关命令。
765 0
|
关系型数据库 MySQL Java
Docker学习重点(6)~容器数据卷
Docker学习重点(6)~容器数据卷
468 0
|
存储 运维 Linux
精彩推荐 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
在使用Docker时,管理维护工作可能会显得复杂。然而,实际上,Docker提供了许多便捷且人性化的工具,这些工具的使用技巧可以大大简化维护工作,并提升效率。通过掌握这些技巧,你不仅能够更轻松地管理Docker环境,还能展现出专业的能力。接下来我们就给大家介绍一下对于我在工作当中对于Docker容器使用的技术实战总结
148 2
精彩推荐 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
下一篇
开通oss服务