DockerFile系统的学习
1.背景
DockerFile定义:用来构建Docker镜像的文件,有脚本命令组成。
自定义镜像并运行步骤:
编写dockerFile文件--》docker build为镜像--》docker run 运行镜像
dockerFile文件模板可以在官网看到:
https://hub.docker.com/
2.基本语法介绍
dockerFile的基础规则
1.dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
2.Docker以从上到下的顺序运行Dockerfile的指令。
3.以#字符开头则被视为注释。
4.第一条指令必须是FROM,用来确定基本镜像来源。
5.每条指令的关键字必须大写,且后面至少要有一个参数
6.每条指令都会创建一个新的镜像层,并提交镜像产生id
Docker build执行dockerFile的流程
1.docker从基础镜(由From 指定)像运行一个容器
2.由上往下执行指令,并对容器作出修改
3.修改完成后提交一个新的镜像并返回镜像id
4.docker再基于刚才的新镜像运行一个新的容器
5.接着执行下一条指令,重复步骤2、3、4,指导所有指令执行完
3.dockerFile关键字
如下讲解,我们以构建一个tomcat镜像为例,说明常用关键字
3.1.FROM
作用:指定基础镜像,当前新镜像是基于哪个镜像的。
案例:FROM centos
备注:如果没有基础镜像,需要写成 FROM scratch,这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像
3.2.MAINTAINER
[maintainer : n.维护者;维护设备;软件维护人员;(律 史)非法帮助诉讼者]
作用:镜像维护者的姓名和邮箱地址
案例:MAINTAINER lidongping <851298348@qq.com>
3.3.RUN
作用:容器构建时需要运行的命令
案例:RUN yum -y install vim ,表示安装vim编辑器功能
3.4.ENV
作用:定义一个变量,与Java中定义一个常量一样的道理
案例:ENV WORK_PATH /usr/local
3.5.WORKDIR
作用:指定在创建容器后,终端默认登陆进来的工作目录
案例:WORKDIR $WORK_PATH
备注:这里使用了上一步的ENV WORK_PATH /usr/local变量,等同于WORKDIR /usr/local
3.6.COPY
作用:拷贝文件和目录到镜像中
案例:COPY readme.txt /home
备注:将当前文件下的readme.txt 拷贝到容器中的centos中的home目录下
3.7.ADD
作用:与上面的copy作用一样,拷贝文件和目录到镜像中,只是ADD命令会自动处理URL和解压tar压缩包
案例:ADD jdk-8u131-linux-x64.tar.gz /usr/local/
3.8.EXPOSE
作用:当前容器对外暴露出的端口
案例:EXPOSE 8080
3.9.CMD
作用:指定一个容器启动时要运行的命令。可以有多个CMD指令,但只有最后一个生效,CMD 会被docker run 之后的参数替换;
案例:CMD ["/usr/local/apache-tomcat-8.5.41/bin/catalina.sh","run"]
3.10.ENTRYPOINT
entry point 入口点,进入点
作用:指定一个容器启动是要运行的命令。ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数,但是ENTRYPOINT不会被docker run 之后的参数替换;
案例:ENTRYPOINT ["/usr/local/apache-tomcat-8.5.41/bin/startup.sh" ]
3.11.VOLUME
volume 体积,容器
作用:容器数据卷,用于数据保存和持久化工作
案例:VOLUME ["/c-data01", "/c-data02","/更多路径"]
到此,常用的命令大概就这些,更多的命令大家可以自己查官方文档,使用方式和套路大致是一样的。
4.实际案例
本案例以构建一个tomcat镜像为实际案例作为演示
第一步,准备素材,
在根路径下建立myTomcat文件夹,并准备如下素材
构建文件:dockerFileTomcat文件内容如下
#基础容器来自于centos
FROM centos
#设置维护者的邮箱和微信
MAINTAINER email:lidongping<851298348@qq.com.com>,wechat:851298348
#安装vim编辑器
RUN yum -y install vim
#默认的centos容器时不带ifconfig命令的,安装ip查询工具,即可以使用ifconfig命令
#RUN yum install net-tools
#定义一个变量,类似于java中定义一个常量
ENV WORK_PATH /usr/local
#设置工作访问时候的WORKDIR路径,即进入容器后的默认工作目录
WORKDIR $WORK_PATH
#把宿主机当前上下文的readme.txt拷贝到容器/usr/local/路径下
COPY readme.txt $WORK_PATH/readme.txt
#把java与tomcat拷贝到容器并解压
ADD jdk-8u131-linux-x64.tar.gz $WORK_PATH/
ADD apache-tomcat-8.5.41.tar.gz $WORK_PATH/
#配置java、tomcat环境变量
ENV JAVA_HOME $WORK_PATH/jdk1.8.0_131
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME $WORK_PATH/apache-tomcat-8.5.41
ENV CATALINA_BASE $WORK_PATH/apache-tomcat-8.5.41
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动tomcat
CMD ["/usr/local/apache-tomcat-8.5.41/bin/catalina.sh","run"]
第二步,执行构建镜像命令
docker build -f /myTomcat/dockerFileTomcat -t lidongping/tomcat01 .
注意:如果构建文件名称为:Dockerfile,且在当前路径下,可以直接写为:docker build -t lidongping/tomcat01 .
第三步, 运行上一步构建的lidongping/tomcat01 镜像
命令:docker run -d -p 8081:8080 lidongping/tomcat01
第四步,访问tomcat,看是否正常
完美!
系统化学习docker教程:
https://www.cnblogs.com/newAndHui/p/13508771.html
DockerFile系统的学习的更多相关文章
- 如何系统的学习Java
初学者记住一点,学习Java一定是连续性的且循序渐进的“系统化”学习,首先我给你提供一个优秀Java工程师的学习路线. web前端方面:html.css,Java.jQuery.xml解析.Boots ...
- 一点点linux系统的学习心得
我相信你正在阅读本文的时候,可能是因为你渴望学习Linux技术.我想分享一下过去两年中我自己的一些学习经历,希望你能更顺利地成为Linuxer. 两年前在Linux系统的运行和维护方面找到了一份工作( ...
- Unity3d-Particle System 5.x系统的学习(四)
Unity3d-Particle System 5.x系统的学习(四) 今天,我们来聊聊unity5.x的粒子系统和unity4.x粒子系统的区别. 我大致看了下,区别还是蛮多的,但是总体的粒子制作思 ...
- 安装虚拟机和Linux系统的学习
安装虚拟机和Linux系统的学习(随笔3) 1.安装虚拟机 首先我按着老师给的链接上的步骤一步一步安装VirtualBox,进行得十分顺利. 接着则是在虚拟机上安装Ubuntu. 然而安装完成以后按要 ...
- 这一次,终于系统的学习了 JVM 内存结构
最近在看< JAVA并发编程实践 >这本书,里面涉及到了 Java 内存模型,通过 Java 内存模型顺理成章的来到的 JVM 内存结构,关于 JVM 内存结构的认知还停留在上大学那会的课 ...
- 系统的学习Devops
系统的学习devops 1. 学习一门编程语言 Java python JavaScript 2.了解不同的操作系统概念 线程和并发,套接字,I/O管理,虚拟化,内存存储和文件系统 3.掌握终端生存大 ...
- Linux 系统编程 学习 总结
背景 整理了Liunx 关于 进程间通信的 很常见的知识. 目录 与 说明 Linux 系统编程 学习:000-有关概念 介绍了有关的基础概念,为以后的学习打下基础. Linux 系统编程 学习:00 ...
- Linux 系统编程 学习:00-有关概念
Linux 系统编程 学习:00-有关概念 背景 系统编程其实就是利用系统中被支持的调度API进行开发的一个过程. 从这一讲开始,我们来介绍有关Linux 系统编程的学习. 知识 在进行Linux系统 ...
- Linux 系统编程 学习:01-进程的有关概念 与 创建、回收
Linux 系统编程 学习:01-进程的有关概念 与 创建.回收 背景 上一讲介绍了有关系统编程的概念.这一讲,我们针对 进程 开展学习. 概念 进程的身份证(PID) 每一个进程都有一个唯一的身份证 ...
随机推荐
- end的用法——print中加end=可以不换行展示
A=['hello','world',1,2,3]for i in A: print('正常输出i的值:',i) #打印出来的是换行展示hello world 1 2 3 print('加入sep后i ...
- python 3 字符串
字符串中单引号与双引号无差别 三单引号与三双引号 三引号允许一个字符串跨多行,字符串中可以包含换行符等特殊字符 字符串使用索引的方法来读取,正向从0开始计数,反向从-1开始计数 反向索引 字符串切片 ...
- [05] 通过P/Invoke加速C#程序
通过P/Invoke加速C#程序 任何语言都会提供FFI机制(Foreign Function Interface, 叫法不太一样), 大多数的FFI机制是和C API. C#提供了P/Invoke来 ...
- 刀哥之指纹识别biometrics
指纹识别 - 生物识别 简介 iPhone 5S 开始支持 iOS 8.0 开放了 Touch ID 的接口 代码准备 - (void)touchesBegan:(NSSet *)touches wi ...
- k8s运行容器之Job(四)
Job 容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序, ...
- 企业面试中关于MYSQL重点的28道面试题解答
问题1:char.varchar的区别是什么? varchar是变长而char的长度是固定的.如果你的内容是固定大小的,你会得到更好的性能. 问题2: TRUNCATE和DELETE的区别是什么? ...
- if else与switch for与foreach
if...else...适用于变量判断 switch适用于常量判断(switch只判断一次,if else 判断多次) foreach只适用于集合和数组查询(foreach不支持增加删除操作) for ...
- nginx 1.12安装
准备工作 使用root用户安装. 到nginx官网下载Linux源码或者执行:wget http://nginx.org/download/nginx-1.12.2.tar.gz. 到pcre站点下载 ...
- python3 读取写入excel操作-win32com
前面有写一篇是用xlrd操作excel的,这一篇是使用win32com来进行操作excel,个人推荐使用win32com. 要使用win32com组件,也需要先导入win32com包. # -*- c ...
- 深入解读 ASP.NET Core 身份认证过程
长话短说:上文我们讲了 ASP.NET Core 基于声明的访问控制到底是什么鬼? 今天我们乘胜追击:聊一聊ASP.NET Core 中的身份验证. 身份验证是确定用户身份的过程. 授权是确定用户是否 ...