Docker进阶篇之DockerFile,教你用DockerFile构建镜像
文章目录
- 一、DockerFile介绍
- 二、DockerFile构建过程
- 三、DockerFile指令
- 四、实战测试
- 4.1 对比原生CentOS
- 五、CMD 和 ENTRYPOINT 的区别
- 5.1 测试CMD
- 5.2 测试ENTRYPOINT
一、DockerFile介绍
Dockerfile 是用来构建 docker 镜像的文件,命令参数脚本。
构建步骤:
- 编写一个 dockerfile 文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub、阿里云镜像仓库)
查看官方是怎么操作的:
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像。
官方既然可以制作镜像,那我们也可以。
二、DockerFile构建过程
基础知识:
1、每个保留关键字(指令)都必须是大写字母
2、执行顺序是从上到下
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层并提交
dockerfile 是面向开发的,我们以后要发布项目、做镜像,就需要编写 dockerfile 文件,这个文件十分简单。
Docker 镜像逐渐成为企业交付的标准,必须要掌握。
步骤:开发、部署、运维,缺一不可
DockerFile:构建文件,定义了一切的步骤,类比源代码
DockerImages:通过 DockerFile 构建生成的镜像,最终发布和运行的产品
Docker 容器:容器就是镜像运行起来提供服务的
三、DockerFile指令
下图为DockerFile部分指令:
指令介绍:
FROM # 基础镜像,一切从这里开始构建MAINTAINER # 镜像是谁写的,姓名+邮箱RUN # 镜像构建的时候需要运行的命令ADD # 步骤,如tomcat镜像,add用来添加tomcat压缩包WORKDIR # 镜像的工作目录VOLUME # 挂载的目录EXPOSE # 暴露端口配置CMD # 指定这个容器启动的时候需要运行的命令,只有最后一个会生效,可被替代ENTRYPOINT # 指定这个容器启动的时候需要运行的命令,可以追加命令ONBUILD # 当构建的一个镜像被另一个镜像继承时,会运行ONBUILD指令,触发指令COPY # 类似ADD,将我们的文件拷贝到镜像中ENV # 构建的时候设置环境变量
四、实战测试
Docker Hub 中99%的镜像都是从 FROM scratch
开始的,然后配置需要的软件和配置来进行构建。
创建一个自己的 centos
# 1.编写dockerfile文件
[root@wyc dockerfile]# vim mydockerfile-centos
[root@wyc dockerfile]# cat mydockerfile-centos
FROM centos:7
MAINTAINER wyc<837279588@qq.com>ENV MYPATH /usr/local
WORKDIR $MYPATHRUN yum -y install vim
RUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATH
CMD echo "-----end-----"
CMD /bin/bash# 2.通过这个文件构建镜像
# 命令 docker build -f dockerfile文件路径 -t 镜像名:[tag] .
[root@wyc dockerfile]# docker build -f mydockerfile-centos -t mycentos:1.1 .
# 3.测试运行
[root@wyc dockerfile]# docker run -it mycentos:1.1
创建过程可能会出现的问题:
如遇以上报错,将 FROM centos
改成 FROM centos:7
即可!
我们可以通过 docker history 镜像id
列出本地进行的变更历史,入下图:
4.1 对比原生CentOS
原生CentOS:
我们自己创建的CentOS:
五、CMD 和 ENTRYPOINT 的区别
CMD # 指定这个容器启动的时候需要运行的命令,只有最后一个会生效,可被替代ENTRYPOINT # 指定这个容器启动的时候需要运行的命令,可以追加命令
5.1 测试CMD
1、编写dockerfile文件
[root@wyc dockerfile]# vim dockerfile-cmd-test
[root@wyc dockerfile]# cat dockerfile-cmd-test
FROM centos:7
CMD ["ls","-a"]
2、构建镜像
[root@wyc dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM centos:7---> eeb6ee3f44bd
Step 2/2 : CMD ["ls","-a"]---> Running in fd77af3e32dc
Removing intermediate container fd77af3e32dc---> bf5078099acc
Successfully built bf5078099acc
Successfully tagged cmdtest:latest
3、运行镜像,发现 ls -a 命令生效
[root@wyc dockerfile]# docker run bf5078099acc
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
想追加一个命令 -l —> ls -al
[root@wyc dockerfile]# docker run bf5078099acc -l
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
cmd的情况:-l 替换了 CMD [“ls”,“-a”] 命令,,-l 不是命令所以报错。
使用 docker run bf5078099acc ls -al
则能正常运行,但非常繁琐。
5.2 测试ENTRYPOINT
1、编写dockerfile文件
[root@wyc dockerfile]# vim dockerfile-entrypoint-test
[root@wyc dockerfile]# cat dockerfile-entrypoint-test
FROM centos:7
ENTRYPOINT ["ls","-a"]
2、构建镜像
[root@wyc dockerfile]# docker build -f dockerfile-entrypoint-test -t enrtypointtest .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM centos:7---> eeb6ee3f44bd
Step 2/2 : ENTRYPOINT ["ls","-a"]---> Running in 15f8bfa40759
Removing intermediate container 15f8bfa40759---> 419abf4b7e1e
Successfully built 419abf4b7e1e
Successfully tagged enrtypointtest:latest
3、运行镜像,发现 ls -a 命令生效
[root@wyc dockerfile]# docker run 419abf4b7e1e
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
此时追加 -l 命令,发现可以运行。
追加的命令,是直接拼接在 ENTRYPOINT 命令的后面。
[root@wyc dockerfile]# docker run 419abf4b7e1e -l
total 12
drwxr-xr-x. 1 root root 6 Nov 21 08:26 .
drwxr-xr-x. 1 root root 6 Nov 21 08:26 ..
-rwxr-xr-x. 1 root root 0 Nov 21 08:26 .dockerenv
-rw-r--r--. 1 root root 12114 Nov 13 2020 anaconda-post.log
lrwxrwxrwx. 1 root root 7 Nov 13 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Nov 21 08:26 dev
drwxr-xr-x. 1 root root 66 Nov 21 08:26 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 home
lrwxrwxrwx. 1 root root 7 Nov 13 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 13 2020 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 Apr 11 2018 media
drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt
drwxr-xr-x. 2 root root 6 Apr 11 2018 opt
dr-xr-xr-x. 227 root root 0 Nov 21 08:26 proc
dr-xr-x---. 2 root root 114 Nov 13 2020 root
drwxr-xr-x. 11 root root 148 Nov 13 2020 run
lrwxrwxrwx. 1 root root 8 Nov 13 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Apr 11 2018 srv
dr-xr-xr-x. 13 root root 0 Nov 21 05:38 sys
drwxrwxrwt. 7 root root 132 Nov 13 2020 tmp
drwxr-xr-x. 13 root root 155 Nov 13 2020 usr
drwxr-xr-x. 18 root root 238 Nov 13 2020 var
Dockerfile 中很多命令都是十分相似的,我们需要了解它们的区别,最好的学习方式就是对比它们然后测试效果。
参考源:【狂神说Java】Docker最新超详细版教程通俗易懂
Docker进阶篇之DockerFile,教你用DockerFile构建镜像相关推荐
- Docker 进阶篇
1 Docker 安装MySQL主从复制 1.1 主从复制原理 MySQL 主从复制的核心就是二进制日志,过程如下 如上图所示,过程分为三步 1.master 主库在事务提交时,会把数据变更记录在二进 ...
- Docker进阶篇 - (一)Docker Compose
Docker Compose 简介 能够解决的问题:DockerFile build run 一次只能手动操作一个容器,如果到微服务层次,有100个微服务都有依赖关系的,那么前面的方法就显得很笨重,D ...
- docker进阶篇(一) ---- Volume(数据卷)
引言 docker的镜像是由多个只读的文件系统叠加在一起形成的.当我们在我启动一个容器的时候,docker会加载这些只读层并在这些只读层的上面(栈顶)增加一个读写层.这时如果修改正在运行的容器中已有的 ...
- 【运维知识进阶篇】手把手教你搭建OpenVPN(保姆级教程)
VPN就是虚拟专用通道,是提供给企业之间或者公司个人与公司之间安全数据传输的隧道,OpenVPN是Linux下开源VPN的先锋,提供了良好的性能和友好的用户GUI(图形用户界面).本篇文章包含Open ...
- 【狂神说】Docker【进阶篇】
[狂神说Java]Docker进阶篇超详细版教程通俗易懂_哔哩哔哩_bilibili 官网:https://www.docker.com/ 文档地址: https://docs.docker.com/ ...
- Docker 从Dockerfile 构建镜像 :build 命令的用法
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. Dockerfile 创建完成后,可以使用 docker build 命令根据 Dockerfile ...
- 构建测试的体系化思维(进阶篇)
读完需要 24 分钟 速读仅需 8 分钟 00 引言 1. 三个层次聊测试体系 测试人员缺乏体系化思维?新建产品团队或者新启项目,如何搭建质量保障体系? 大家都接触过不计其数的测试.质量方面的文章或者 ...
- Docker 安装 命令 数据卷 应用部署 网络优化 Dockerfile 服务编排Compose 私有仓库
Docker 1. 初识docker 1.1 Docker是什么 了解Docker的前生LXC LXC与docker的关系 Docker 的特点 1.2 为什么使用Docker Docker的优势 缺 ...
- Docker Dockerfile中文参考手册 (Dockerfile reference)
官网原文链接 Docker当前版本是18.03 文章目录 Dockerfile参考(Dockerfile reference) 用法(Usage) 格式(Format) 解析器指令(Parser di ...
最新文章
- ACdream 1099——瑶瑶的第K大——————【快排舍半,输入外挂】
- vue框架实现pdf在线预览
- 今晚直播 | 商汤科技X-Lab刘宇:神经网络结构与大规模优化方法
- python 元组 列表 字典区别_python编程:常用的数据结构之字典的方法总结,和列表和元组区别...
- 快速入门容器服务,创建Kubernetes集群
- 深入浅出MFC学习笔记:MFC六大关键技术仿真之RTTI运行时类型识别
- 简单的MySql游标创建
- 通过JDK动态代理实现拦截器
- 高度可定制化 IM聊天界面设计
- Caused by: java.lang.NoSuchMethodError:xxx——依赖冲突的解决
- At least one JAR was scanned for TLDs解决办法
- Selenium基础用法
- 3 FPGA时序约束理论篇之IO约束
- 二叉平衡树(AVL树)详细理解
- 【计算机体系结构-01】指令集体系结构、微体系结构简介
- buildroot学习(十)——at91sam9g45软件平台更新
- 2006年江苏专转本计算机试卷答案,2006年度江苏省普通高校专转本计算机试卷.doc...
- python编写的储存单位转换代码(以字节(B)为单位)
- 网站繁简切换的JS遇到的一个BUG
- WRF后处理:降雨量的说明以及降雨的绘制
热门文章
- 要多久人工智能的梦想才能照进现实
- 廖雪峰的博客——一个Python学习网站
- html弹窗中遍历数组,有关js各种数组遍历
- “离散元数值模拟仿真技术与应用”系列专题培训的通知
- 高一凡-数据结构第2章-线性表
- 劳动仲裁成功的几率大吗?
- 简述分类法的优缺点_自由分类法的优缺点
- python 两张图片合为一张的软件_在python中将两张照片合并为一张照片
- 宏替换、条件编译、头文件展开
- 易助erp系统服务器安装,ERP教学-易助ERP系统在采购底稿中增加毛需求量实际库存量预计入...-系统,采购,底稿,增加,需求量 - 木夕网络资源分享平台...