Docker详解(一)

Docker详解(二)

Docker详解(三)

1.Dockfile简介

DockerFile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本。

构建步骤

  • 编写Dockerfile文件
  • docker build
  • docker run

Dockerfile是用来构建Docker镜像的源码

下面是官方 Centos 的 Dockfile文件以示参考

FROM scratch
ADD centos-7-docker.tar.xz / LABEL org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20181204" CMD ["/bin/bash"]

 

2. Dockerfile构建过程解析

Dockefile内容基础知识

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交

 

Docker执行Dockerfile的大致流程

  • docker从基础镜像运行一个容器
  • 执行一条命令并对容器作出修改
  • 执行类似docker commit 的操作一个新的镜像层
  • docker再基于刚提交的镜像运行一个新容器
  • 执行dockerfile中的下一条指令直到所有指令执行都执行完成

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段

  • Dockerfile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件的运行态。

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

 

3. Dockerfile体系结构

  • FROM:基础镜像,当前新镜像是基于哪个镜像的

  • MAINTAINER:镜像维护者的姓名和邮箱地址

  • RUN:容器构建时需要运行的命令

  • EXPOSE:当前容器对外暴露出的端口

  • WORKDIR:指定在创建容器后,终端默认登录进来的工作目录,一个落脚点

  • ENV:用来构建镜像过程中设置环境变量

  • ADD:在宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

  • COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下目录中<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置

  • VOLUME:容器数据卷,用于数据保存和持久化工作

  • CMD:知道一个容器启动需要运行的命令,Dockerfil中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

  • ENTRYPOINT:指定一个容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数

  • ONBUILD:构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后,父镜像的onbuild被触发

     

     

4. 案例

上了我们看了DockerFile的基本知识点,大致了解了 每个关键字 是做什么的,但是凡事光说不练假把式,下面我们来做一些案例,以便于了解DockerFile

 

4.1 自定义mycentos

大家都知道从DockerHub上下载的centos中 是与 linux共享内核的基础版本镜像,所以它会缺少 比如 vimifconfig 等等命令,以及初始默认目录 是根目录 这些种种特点

 

所以我们接下来将自定义一个centos,改变其默认目录,让其带有vim命令 和 ifconfig命令

1、准备 编写DockerFile文件

 

2、构建DockerFile文件

docker build -f /mydocker/Dockerfile2 -t mycentos:1.3 .

 

3、查看镜像是否构建成功,并运行查验

 

4、列出镜像变更的历史

docker history +镜像ID

 

通过这一波操作,相信你也已经熟悉了百分之80的关键字了,接下来的案例我们来了解比较容易混淆的两个关键字,CMD 和 ENTRYPOINT

 

4.2 CMD/ENTRYPOINT 镜像案例

都是指定一个容器启动时要运行的命令

  • CMD:Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
  • ENTRYPOINT:docker run 之后的参数会被当作新的参数传递给 ENTRYPOINT,之后形成新的命令组合

我们接下来用curl命令来讲解一下,CMD和ENTRYPOINT的区别

curl 命令的意思是下载文件输出到stdout

 

CMD

1、编辑Dockerfile文件

FROM centos
RUN yum install -y curl
CMD ["curl","-s","https://www.ip.cn"]

 

2、构建Dockerfile文件

docker build /mydocker/Dockerfile3 -t myip .

 

3、执行文件,查看效果

注: 这里报错主要是因为 -i 它不是一个单独的命令参数

 

ENTRYPOINT

1、编写Dockerfile文件

FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","https://www.ip.cn"]

 

2、构建Dockerfile文件

 

3、执行文件,查看结果

 

4.3 ONBUILD

这个案例我们来讲解一下ONBUILD的作用

1、编辑Dockerfile文件

vim Dockerfile4 创建一个Dockerfile文件 Dockerfile4

FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","https://www.ip.cn"]
ONBUILD RUN echo "father onbuild---------886"

  

2、构建父Dockerfile文件

docker build -f /mydocker/Dockerfile4 -t myip_father . 构建父Dockerfile文件

 

3、再次创建一个新的Dockerfile文件,继承ONBUILD文件

vim dockerfile5 创建一个Dockerfile文件 Dockerfile5

FROM myip_father
RUN yum install -y curl
CMD ["curl","-s","https://www.ip.cn"]

 

4、构建子Dockerfile文件

docker build -f /mydocker/Dockerfile5 -t myip_son .

 

4.4 自定义镜像Tomcat7

我们借着最后的实验来讲下最后的两个关键字ADDCOPY

 

1、创建一个Tomcat7文件夹,并创建一个文件

mkdir -p /coke/mydockerfile/tomcat7 创建文件夹

touch c.txt 创建文件

 

2、将jdk和tomcat安装的压缩包拷贝进上一步目录

 

3、创建一个Dockerfile文件,如上图

FROM         centos
MAINTAINER coke<dwlovelife@126.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-7u79-linux-x64.gz /usr/local/
ADD apache-tomcat-7.0.47.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.7.0_79
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-7.0.47
ENV CATALINA_BASE /usr/local/apache-tomcat-7.0.47
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-7.0.47/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-7.0.47/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-7.0.47/bin/startup.sh && tail -F /usr/local/apache-tomcat-7.0.47/bin/logs/catalina.out

 

4、凭借Dockerfile构建一个自定义Tomcat

docker build -t coke_tomcat7 . 构建tomcat

 

5、运行tomcat 查看效果

docker run -d -p 9080:8080 --name myt7 -v /coke/mydockerfile/tomcat7/test:/usr/local/apache-tomcat-7.0.47/webapps/test -v /coke/mydockerfile/tomcat7/tomcat7logs/:/usr/local/apache-tomcat-7.0.47/logs --privileged=true coke_tomcat7

 

注:此处我们建立了容器卷,还可以进行发布关联,日志关联,就不进行操作说明了,有兴趣的可以自己试试。

最新文章

  1. Python调用服务接口
  2. Queue Reconstruction by Height
  3. 精品干货丨APP常用导航框架
  4. Java 中Timer和TimerTask 定时器和定时任务使用的例子
  5. SqlServer调用外部程序实现数据同步
  6. lintcode:最小编辑距离
  7. ASP.NET - 记住滚动条的位置
  8. 机器学习:Python实现聚类算法(三)之总结
  9. MySQL优化五 SQL优化
  10. Web开发——HTML基础
  11. String类常用方法练习
  12. ios技术篇:导航栏push遵循的三个规则
  13. maven配置本地仓库通用
  14. [转]How to speed up Magento 2. Maximum Performance
  15. 【伪装位置神器】神行者AnyLocation 1.3.0001可用于微信,陌陌
  16. MongoDB初学笔记(1)
  17. flink 根据时间消费kafka
  18. Linux 通过程序名获取进程ID并Kill
  19. IOUtis.copy使用解析
  20. Mongodb时间问题

热门文章

  1. BZOJ2038 小Z的袜子 莫队
  2. codeforces 872 D. Something with XOR Queries(思维)
  3. CSS3 01. CSS3现状、属性选择器、伪类选择器、结构伪类、伪元素选择器、颜色、文本阴影shadow、盒子模型、私有化前缀
  4. 脱离脚手架来配置、学习 webpack4.x (一)基础搭建项目
  5. docker容器内 java应用程序启动慢
  6. java解决回文数
  7. Java中存储金额用什么数据类型
  8. Java抽象类构造方法
  9. 基于Arduino和Blynk平台的远程控制智能小车
  10. JavaScript之操作符