咱们开始来一起学习 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
构建的时候设置环境变量
乍一看感觉 CMD
和 ENTRYPOINT
性能如同差不多,然而还是不太分明具体区别在哪里,文章开端会有具体阐明
实战
咱们本人来做一个自定一个 ubuntu
镜像
官网的 ubuntu
是阉割版本的,很多工具和命令都是不反对的,那么咱们就本人加进去,自力更生
本人写一个 DockerFile
这里须要留神的是,基本上 99%
的镜像,都是基于这个根底镜像 scratch
,咱们能够看到官网的 DockerFIle 也是基于这个镜像来玩的
ubuntu git url
那么咱们能够基于这个 ubuntu 来进行自定义,退出一些咱们须要的工具,如 vim
,ifconfig
等
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 镜像,有了 vim
,ifconfig
工具,实战胜利
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
欢送点赞,关注,珍藏
敌人们,你的反对和激励,是我保持分享,提高质量的能源
好了,本次就到这里
技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。
我是 小魔童哪吒,欢送点赞关注珍藏,下次见~