文章目录

  • 一、DockerFile介绍
  • 二、DockerFile构建过程
  • 三、DockerFile指令
  • 四、实战测试
    • 4.1 对比原生CentOS
  • 五、CMD 和 ENTRYPOINT 的区别
    • 5.1 测试CMD
    • 5.2 测试ENTRYPOINT

一、DockerFile介绍

Dockerfile 是用来构建 docker 镜像的文件,命令参数脚本。

构建步骤:

  1. 编写一个 dockerfile 文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. 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构建镜像相关推荐

  1. Docker 进阶篇

    1 Docker 安装MySQL主从复制 1.1 主从复制原理 MySQL 主从复制的核心就是二进制日志,过程如下 如上图所示,过程分为三步 1.master 主库在事务提交时,会把数据变更记录在二进 ...

  2. Docker进阶篇 - (一)Docker Compose

    Docker Compose 简介 能够解决的问题:DockerFile build run 一次只能手动操作一个容器,如果到微服务层次,有100个微服务都有依赖关系的,那么前面的方法就显得很笨重,D ...

  3. docker进阶篇(一) ---- Volume(数据卷)

    引言 docker的镜像是由多个只读的文件系统叠加在一起形成的.当我们在我启动一个容器的时候,docker会加载这些只读层并在这些只读层的上面(栈顶)增加一个读写层.这时如果修改正在运行的容器中已有的 ...

  4. 【运维知识进阶篇】手把手教你搭建OpenVPN(保姆级教程)

    VPN就是虚拟专用通道,是提供给企业之间或者公司个人与公司之间安全数据传输的隧道,OpenVPN是Linux下开源VPN的先锋,提供了良好的性能和友好的用户GUI(图形用户界面).本篇文章包含Open ...

  5. 【狂神说】Docker【进阶篇】

    [狂神说Java]Docker进阶篇超详细版教程通俗易懂_哔哩哔哩_bilibili 官网:https://www.docker.com/ 文档地址: https://docs.docker.com/ ...

  6. Docker 从Dockerfile 构建镜像 :build 命令的用法

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. Dockerfile 创建完成后,可以使用 docker build 命令根据 Dockerfile ...

  7. 构建测试的体系化思维(进阶篇)

    读完需要 24 分钟 速读仅需 8 分钟 00 引言 1. 三个层次聊测试体系 测试人员缺乏体系化思维?新建产品团队或者新启项目,如何搭建质量保障体系? 大家都接触过不计其数的测试.质量方面的文章或者 ...

  8. Docker 安装 命令 数据卷 应用部署 网络优化 Dockerfile 服务编排Compose 私有仓库

    Docker 1. 初识docker 1.1 Docker是什么 了解Docker的前生LXC LXC与docker的关系 Docker 的特点 1.2 为什么使用Docker Docker的优势 缺 ...

  9. Docker Dockerfile中文参考手册 (Dockerfile reference)

    官网原文链接 Docker当前版本是18.03 文章目录 Dockerfile参考(Dockerfile reference) 用法(Usage) 格式(Format) 解析器指令(Parser di ...

最新文章

  1. ACdream 1099——瑶瑶的第K大——————【快排舍半,输入外挂】
  2. vue框架实现pdf在线预览
  3. 今晚直播 | 商汤科技X-Lab刘宇:神经网络结构与大规模优化方法
  4. python 元组 列表 字典区别_python编程:常用的数据结构之字典的方法总结,和列表和元组区别...
  5. 快速入门容器服务,创建Kubernetes集群
  6. 深入浅出MFC学习笔记:MFC六大关键技术仿真之RTTI运行时类型识别
  7. 简单的MySql游标创建
  8. 通过JDK动态代理实现拦截器
  9. 高度可定制化 IM聊天界面设计
  10. Caused by: java.lang.NoSuchMethodError:xxx——依赖冲突的解决
  11. At least one JAR was scanned for TLDs解决办法
  12. Selenium基础用法
  13. 3 FPGA时序约束理论篇之IO约束
  14. 二叉平衡树(AVL树)详细理解
  15. 【计算机体系结构-01】指令集体系结构、微体系结构简介
  16. buildroot学习(十)——at91sam9g45软件平台更新
  17. 2006年江苏专转本计算机试卷答案,2006年度江苏省普通高校专转本计算机试卷.doc...
  18. python编写的储存单位转换代码(以字节(B)为单位)
  19. 网站繁简切换的JS遇到的一个BUG
  20. WRF后处理:降雨量的说明以及降雨的绘制

热门文章

  1. 要多久人工智能的梦想才能照进现实
  2. 廖雪峰的博客——一个Python学习网站
  3. html弹窗中遍历数组,有关js各种数组遍历
  4. “离散元数值模拟仿真技术与应用”系列专题培训的通知
  5. 高一凡-数据结构第2章-线性表
  6. 劳动仲裁成功的几率大吗?
  7. 简述分类法的优缺点_自由分类法的优缺点
  8. python 两张图片合为一张的软件_在python中将两张照片合并为一张照片
  9. 宏替换、条件编译、头文件展开
  10. 易助erp系统服务器安装,ERP教学-易助ERP系统在采购底稿中增加毛需求量实际库存量预计入...-系统,采购,底稿,增加,需求量 - 木夕网络资源分享平台...