DockerFile基础概念及案例

Docker file

Docker file 构建过程解析

内容基础知识

  1. 每条保留字指令都必须为大写且后要跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像层进行提交

Docker file的大致流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker在基于刚提交的镜像运行一个新容器
  5. 执行docker file中的下一条指令知道所有指令都执行完成

小总结

从应用软件角度来看,Docker file、docker镜像、docker容器分别代表三个不同阶段

  • docker file是软件的原材料
  • docker镜像是软件的交付品
  • docker容器则可以认定为是软件的运行状态

Docker file面向开发,Docker镜像面向交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

Docker File体系解析

FROM

基础镜像,当前镜像是基于那个镜像的

MAINTAINER

镜像维护者的姓名和邮箱地址

RUN

容器构建时需要运行的命令

EXPOSE

当前容器对外暴露出的端口

WORKDIR

指定在创建容器后,终端默认登进来的工作目录,一个落脚点

ENV

用来构建镜像过程中这还环境变量

ADD

将宿主机目录下的文件拷贝进镜像切ADD命令会自动处理URI和解压tar压缩包

COPY

类似ADD,拷贝文件和目录到镜像中

将从构建上下文目录中<源路径>的文件、目录复制到新的一层的镜像内的<目标路径>位置

COPY src dest

COPY [“src”,“dest”]

VOLUME

容器数据卷,用于数据保存和持久化工作

CMD

指定一个容器启东市要运行的命令

Dcoker file中可以有多个CMD指令,但只有最后一个会生效,CMD会被dcoekr run 之后的参数替换

ENTRYPOINT

指定一个容器启动时要运行的命令

  1. 和CMD的目的一样,都是在指定容器启动程序及参数
  2. ENTRYPOINT对参数的处理方式----追加

ONBUILD

当构建一个呗集成的Docker file时运行命令,父镜像在被自继承后父镜像的onbulid被触发

sql中的类似于触发器

小总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ayw9By11-1574145664626)(imgs/Docker File体系解析.png)]

案例

Base(scratch)

Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的

自定义镜像mycentos

1、拉去centos基础镜像
docker pull centos
2、编写dockerfile文件
#基础镜像
FROM centos
#指定环境变量
ENV MYPATH /usr/local
#指定工作目录
WORKDIR $MYPATH

#容器构建时 给镜像安装vim和net-tools
RUN yum -y install vim
RUN yum -y install net-tools

#设置暴露的端口号
EXPOSE 80

#执行/bin/bash命令
CMD /bin/bash
3、通过dockerfile来创建镜像
#切记最后的小数点。代表当前目录
docker build -f dockerfile -t mycentos:1.4 .

root@instance-3iyah5yw:/usr/local/etc/docker# docker build -f dockerfile -t mycentos:1.4 .

Sending build context to Docker daemon 2.048kB
Step 1/8 : FROM centos
—> 0f3e07c0138f
Step 2/8 : MAINTAINER ZYH534956355@qq.com
—> Using cache
—> 9aa3e19cade6
Step 3/8 : ENV MYPATH /usr/local
—> Using cache
—> 66a7962da9bd
Step 4/8 : WORKDIR $MYPATH
—> Using cache
—> 829dd5bd8659
Step 5/8 : RUN yum -y install vim
—> Using cache
—> ffe3729013f7
Step 6/8 : RUN yum -y install net-tools
—> Using cache
—> e466b2b281fb
Step 7/8 : EXPOSE 80
—> Using cache
—> 8c957dc7ed86
Step 8/8 : CMD /bin/bash
—> Running in f22670e97535
Removing intermediate container f22670e97535
—> 4c6efdd5cf26
Successfully built 4c6efdd5cf26
Successfully tagged mycentos:1.4

CMD/ENTRYPOINT样例

CMD

docekrfile

FROM centos
RUN yum -y install curl
CMD curl -s www.baidu.com

root@instance-3iyah5yw:/usr/local/etc/docker# docker build -f dockerfile2 -t mycentos:1.5 .
Sending build context to Docker daemon 3.072kB
Step 1/3 : FROM centos
—> 0f3e07c0138f
Step 2/3 : RUN yum -y install curl
—> Running in a16376fe0c3d
CentOS-8 - AppStream 1.6 MB/s | 6.3 MB 00:03
CentOS-8 - Base 878 kB/s | 7.9 MB 00:09
CentOS-8 - Extras 850 B/s | 2.1 kB 00:02
Package curl-7.61.1-8.el8.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
Removing intermediate container a16376fe0c3d
—> 60f970ccefe2
Step 3/3 : CMD curl -s www.baidu.com
—> Running in 1aae837bff1b
Removing intermediate container 1aae837bff1b
—> 2d69db12c750
Successfully built 2d69db12c750
Successfully tagged mycentos:1.5
root@instance-3iyah5yw:/usr/local/etc/docker#

启动容器不加命令

root@instance-3iyah5yw:/usr/local/etc/docker# docker run -it mycentos:1.5

百度一下,你就知道

root@instance-3iyah5yw:/usr/local/etc/docker#
启动加命令

root@instance-3iyah5yw:/usr/local/etc/docker# docker run -it mycentos:1.5 -i
docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused “exec: “-i”: executable file not found in $PATH”: unknown.
root@instance-3iyah5yw:/usr/local/etc/docker#

root@instance-3iyah5yw:/usr/local/etc/docker# docker run -it mycentos:1.5 /bin/bash
[root@6cd2b123f6ef /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@6cd2b123f6ef /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@6cd2b123f6ef /]# exit
exit
root@instance-3iyah5yw:/usr/local/etc/docker#

总结

  • 当创建容器时不带命令时

    执行CMD指定的命令

  • 当创建容器带命令时

    则覆盖docker file中的CMD命令

即CMD只执行最新的一个命令

ENTRYPOINT

dockerfile

FROM centos
RUN yum -y install curl
#
#
ENTRYPOINT ["curl","-s","www.baidu.com"]
注意:关于ENTRYPOINT指定-i参数不会打印首部问题分析

使用ENTRYPOINT时指定参数时相当于加载参数中

ENTRYPOINT ["curl","-s","www.baidu.com"]

指定参数-i时,实际执行中,会将其变更为

ENTRYPOINT ["curl","-s","-i","www.baidu.com"]

如果使用 shell 格式的话,实际的命令会被包装为 sh -c 的参数的形式进行执行。比如:

CMD echo $HOME

在实际执行中,会将其变更为:

CMD [ "sh", "-c", "echo $HOME" ]

如果使用ENTRYPOINT时使用 curl -s www.baidu.com则会被转化为["curl" "-s" "-i" "www.baidu.com"]

可以通过docker history --no-trunc mycentos:1.8查看

root@instance-3iyah5yw:/usr/local/etc/docker# docker history --no-trunc mycentos:1.6
IMAGE CREATED CREATED BY SIZE COMMENT
sha256:b94448dd001f04a3fe49c7a254a042c64a76b2729e5a1e7700ac351cfa080730 40 minutes ago /bin/sh -c #(nop) ENTRYPOINT ["/bin/sh" “-c” “curl -s www.baidu.com”] 0B
sha256:60f970ccefe25df8bb2e5b3e12ee311bdf5ed696182751880e5ecabd58a77a38 About an hour ago /bin/sh -c yum -y install curl 29.6MB
sha256:0f3e07c0138fbe05abcb7a9cc7d63d9bd4c980c3f61fea5efa32e7c4217ef4da 6 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
6 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.schema-version=1.0 org.label-schema.name=CentOS Base Image org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date=20190927 0B
6 weeks ago /bin/sh -c #(nop) ADD file:d6fdacc1972df524a795bd36cf75dd355faefbe9a69d88d1fff95599e2eeed4c in / 220MB
root@instance-3iyah5yw:/usr/local/etc/docker#

所以这事加 -i 没有打印首部信息

不带参数

root@instance-3iyah5yw:/usr/local/etc/docker# docker run -it mycentos:1.6

百度一下,你就知道

root@instance-3iyah5yw:/usr/local/etc/docker#

带参数

root@instance-3iyah5yw:/usr/local/etc/docker# docker run -it mycentos:1.7 -i
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: Keep-Alive
Content-Length: 2381
Content-Type: text/html
Date: Sun, 17 Nov 2019 09:40:11 GMT
Etag: “588604c8-94d”
Last-Modified: Mon, 23 Jan 2017 13:27:36 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/

百度一下,你就知道

root@instance-3iyah5yw:/usr/local/etc/docker#

总结

  • 当创建容器时不带参数时

    执行ENTRYPOINT指定的命令

  • 当创建容器带参数时

    则将参数加入ENTRYPOINT指定的命令,组合成新的命令

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值