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

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

个别 docker 镜像的构建步骤:

1、编写一个 dockerfile 文件

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

3、docker run 运行镜像

4、docker push 公布镜像(咱们能够公布到 DockerHub,也能够公布到阿里云下面)

咱们来看看官网的镜像是咋玩的

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

https://hub.docker.com/_/ubuntu

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

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

很多的官网镜像包都是非常简单的,很多性能都是没有的,咱们通常会本人搭建本人的镜像来满足咱们的各种需要

DockerFile 的构建过程

官网能构建镜像,咱们也能够本人的镜像

DockerFile 的基础知识:

  • 每个 DockerFile 的保留字(指令),都必须是大写的
  • DockerFile 脚本执行是依照程序执行的
  • # 示意正文
  • 每一个指令都会创立提交一个新的镜像层,并提交

能够在网络上找到这样的图片,能够看到镜像是一层一层的,能够在浏览器上搜寻到 DockerFile 外面的指令解释

dockerfile 是面向开发的,咱们当前在做我的项目的时候,是间接公布一个镜像,交付的是一个镜像,就须要编写 DockerFile 文件,这个文件十分的简略!

咱们必须要把握 Docker 镜像,逐步成为企业交付的规范了。

咱们学习的过程是先会应用他人的货色,再去钻研他人是怎么写的,进而咱们也学会如何去写,去开发

例如:

咱们先学习应用了,

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

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

当初咱们开始具体学习 DockerFIle : 构建文件,定义了所有的步骤,这是源代码

DockerFile 的指令

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

  • FROM

根底的镜像,一切都是从这里开始的

  • MAINTAINER

指明镜像是谁写的,写下本人的姓名和邮箱

  • RUN

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

  • ADD

退出某些配置,例如退出 mysql 的压缩包,增加内容

  • WORKDIR

镜像的工作目录

  • VOLUME

挂载目录

  • EXPOSE

裸露端口 和 -p 是一个成果

  • CMD

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

  • ENTRYPOINT

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

  • ONBUILD

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

  • COPY

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

  • ENV

构建的时候设置环境变量

乍一看感觉 CMDENTRYPOINT性能如同差不多,然而还是不太分明具体区别在哪里,文章开端会有具体阐明

实战

咱们本人来做一个自定一个 ubuntu 镜像

官网的ubuntu是阉割版本的,很多工具和命令都是不反对的,那么咱们就本人加进去,自力更生

本人写一个 DockerFile

这里须要留神的是,基本上 99%的镜像,都是基于这个根底镜像 scratch,咱们能够看到官网的 DockerFIle 也是基于这个镜像来玩的

ubuntu git url

那么咱们能够基于这个 ubuntu 来进行自定义,退出一些咱们须要的工具,如vimifconfig

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

开始构建

docker build -f dockerfile2 -t xmtubuntu .

如果不在 DockerFile 中写入 apt-get update 更新源,会呈现上面这个问题,这个要留神

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

通过上图咱们能够看出, DokerFile 中写了 9 个步骤,执行的时候也是分了 9 步,晓得全副胜利才算胜利

最终构建胜利后咱们能够看到

Successfully built a6f88c9f245bSuccessfully tagged xmtubuntu:latest

验证后果

docker images 查看咱们的镜像

# docker imagesREPOSITORY            TAG       IMAGE ID       CREATED          SIZExmtubuntu             latest    a6f88c9f245b   13 minutes ago   172MB

docker inspect a6f88c9f245b 查看咱们镜像的构建过程

# docker history a6f88c9f245bIMAGE          CREATED          CREATED BY                                      SIZE      COMMENTa6f88c9f245b   14 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B3c0d23b8188f   14 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0Bffb019142fc7   14 minutes ago   /bin/sh -c #(nop)  EXPOSE 8888                  0B8867e6d97670   14 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0Bc9d0141ec3b0   14 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B41e73f7e314d   14 minutes ago   /bin/sh -c apt-get install -y net-tools         1.52MB52013ca51f1d   14 minutes ago   /bin/sh -c apt-get install -y vim               68.2MB5ea7d553d403   14 minutes ago   /bin/sh -c apt-get update                       29.7MB1318b700e415   11 days ago      /bin/sh -c #(nop)  CMD ["bash"]                 0B<missing>      11 days ago      /bin/sh -c #(nop) ADD file:524e8d93ad65f08a0…   72.8MB

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

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

官网的就很简略,阉割了很多货色,咱们能够看出官网的 ubuntu 就 2 个步骤,第一个是退出ubuntu 压缩包,第二个就是 /bin/bash

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

果然,咱们的自定义ubuntu镜像,有了vimifconfig工具,实战胜利

CMD 和 ENTRYPOINT 的区别

  • CMD

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

  • ENTRYPOINT

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

如何了解呢?咱们来做一个比照试验就能够很好的了解上述的解释阐明,docker 外面有很多命令会有这样的渺小区别,咱们能够触类旁通,缓缓深刻学习

CMD 的例子

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

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

构建镜像

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

创立并启动容器

docker run 101670af4290,能够看到如下成果

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

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

# docker run 1697fc03b8ce -ldocker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

起因如下:

应用 CMD指令是(例如咱们的例子是 ls -a),咱们在启动容器的时候,前面追加的命令(-l)会把 ls -a替换掉,因为-l不是一个命令,因而报错

ENTRYPOINT 的例子

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

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

构建镜像,创立并启动容器和 CMD 的例子截然不同,咱们间接启动容器的成果和 CMD的例子也是截然不同,咱们间接来看启动容器并追加参数的例子

能够看出应用 ENTRYPOINT是能够在前面追加参数的,应用CMD若指令前面追加参数,那么会笼罩CMD指定的指令

那么,对于当前遇到相干的指令,咱们也能够触类旁通,做比照试验,这样咱们就会了解的更加分明

如何公布咱们的镜像

1、登录 dockerhub

没有注册的 xdm 能够注册一个,https://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. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded

2、批改咱们的镜像 tag

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

3、将镜像推到咱们本人的仓库中

公布镜像的时候,也是依照一层一层的提交的

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

参考资料:

docker docs

欢送点赞,关注,珍藏

敌人们,你的反对和激励,是我保持分享,提高质量的能源

好了,本次就到这里

技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。

我是小魔童哪吒,欢送点赞关注珍藏,下次见~