乐趣区

关于docker:Docker-系列docker-学习七DockerFile-编写和实战

咱们开始来一起学习 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 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 更新源,会呈现上面这个问题,这个要留神

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

通过上图咱们能够看出,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

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

# 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…   72.8MB

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.8MB

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

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

果然,咱们的自定义 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,能够看到如下成果

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

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

# docker run 1697fc03b8ce -l
docker: 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 xmtubuntu
ENTRYPOINT ["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. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

2、批改咱们的镜像 tag

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

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

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

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

参考资料:

docker docs

欢送点赞,关注,珍藏

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

好了,本次就到这里

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

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

退出移动版