【Docker 系列】docker 学习七,DockerFile 编写和实战
我们开始来一起学习 DockerFile 的知识点
【【Docker 系列】docker 学习七,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 文件,这个文件非常的简单!
咱们必须要掌握 Docker 镜像,逐渐成为企业交付的标准了。
咱们学习的过程是先会使用别人的东西,再去研究别人是怎么写的,进而我们也学会如何去写,去开发
例如:
我们先学习使用了,
DockerImages:通过 DockerFile 构建生产的镜像,最终发布和运行的产品
Docker 容器:容器服务就是镜像运行起来的服务器
现在我们开始详细学习 DockerFIle : 构建文件,定义了一切的步骤,这是源代码
DockerFile 的指令 图片来源于网络,我们一一解释一波
文章图片
- FROM
- MAINTAINER
- RUN
- ADD
- WORKDIR
- VOLUME
- EXPOSE
-p
是一个效果- CMD
- ENTRYPOINT
- ONBUILD
- COPY
- ENV
乍一看感觉
CMD
和 ENTRYPOINT
功能好像差不多,但是还是不太清楚具体区别在哪里,文章末尾会有详细说明实战 我们自己来做一个自定一个
ubuntu
镜像官方的
ubuntu
是阉割版本的,很多工具和命令都是不支持的,那么我们就自己加进去,自给自足文章图片
自己写一个 DockerFile
这里需要注意的是,基本上
99%
的镜像,都是基于这个基础镜像 scratch
,我们可以看到官方的 DockerFIle 也是基于这个镜像来玩的ubuntu git url
文章图片
那么我们可以基于这个 ubuntu 来进行自定义,加入一些我们需要的工具,如
vim
,ifconfig
等FROM ubuntuRUN apt-get update# 更新源RUNapt-get install -y vim# 安装 vimRUNapt-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 a6f88c9f245b
Successfully tagged xmtubuntu:latest
验证结果
docker images 查看我们的镜像
# docker images
REPOSITORYTAGIMAGE IDCREATEDSIZE
xmtubuntulatesta6f88c9f245b13 minutes ago172MB
docker inspect a6f88c9f245b 查看我们镜像的构建过程
# docker history a6f88c9f245b
IMAGECREATEDCREATED BYSIZECOMMENT
a6f88c9f245b14 minutes ago/bin/sh -c #(nop)CMD ["/bin/sh" "-c" "/bin…0B
3c0d23b8188f14 minutes ago/bin/sh -c #(nop)CMD ["/bin/sh" "-c" "echo…0B
ffb019142fc714 minutes ago/bin/sh -c #(nop)EXPOSE 88880B
8867e6d9767014 minutes ago/bin/sh -c #(nop) WORKDIR /usr/local0B
c9d0141ec3b014 minutes ago/bin/sh -c #(nop)ENV MYPATH=/usr/local0B
41e73f7e314d14 minutes ago/bin/sh -c apt-get install -y net-tools1.52MB
52013ca51f1d14 minutes ago/bin/sh -c apt-get install -y vim68.2MB
5ea7d553d40314 minutes ago/bin/sh -c apt-get update29.7MB
1318b700e41511 days ago/bin/sh -c #(nop)CMD ["bash"]0B
11 days ago/bin/sh -c #(nop) ADD file:524e8d93ad65f08a0…72.8MB
xmtubuntu 这个镜像的构建过程我们可以清晰的看出都执行了哪些步骤,当然,同样的方式,我们也可以看看官方的镜像是如何构建的,我们来看看官方 ubuntu 的
# docker history ubuntu
IMAGECREATEDCREATED BYSIZECOMMENT
1318b700e41511 days ago/bin/sh -c #(nop)CMD ["bash"]0B
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 daemon1.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-storeLogin Succeeded
2、修改我们的镜像 tag
docker tag 我们的镜像id 我们的docker用户名/镜像名字:版本
3、将镜像推到我们自己的仓库中
文章图片
发布镜像的时候,也是按照一层一层的提交的
最后补充一个网络上找到的图片,现在看这张图就能更清晰的明白其中的原理了
文章图片
参考资料:
docker docs
欢迎点赞,关注,收藏 朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
文章图片
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是小魔童哪吒,欢迎点赞关注收藏,下次见~
推荐阅读
- 宽容谁
- 我要做大厨
- Docker应用:容器间通信与Mariadb数据库主从复制
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷
- 叙述作文
- 20190302|20190302 复盘翻盘