一、DockerFile是什么

用来构建镜像的文本文件, 由一条条构建指令及参数构成的脚本

构建三步骤:

  1. 编写DockerFile文件
  2. docker build命令构建镜像
  3. docker run 依照镜像运行容器实例

二、DockerFile基础知识

  1. 每条保留字指令都为大写字母且至少跟随一条参数
  2. 指定从上至下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层并对镜像进行提交

三、DockerFile构建大致流程

  1. Docker根据基础镜像运行容器
  2. 执行一条DockerFile的指令并对容器进行修改
  3. 执行类似docker commit的操作提交镜像
  4. 运行刚提交的镜像
  5. 执行下一条DockerFile的指令,循环2、3、4、5的操作,直至执行完DockerFile的所有指令

四、DockerFile、镜像、容器的关系

DockerFile:原材料

镜像:交付标准、交付产品

容器:运行的产品

DockerFile --build–>镜像–run–>容器

五、DockerFile保留字

DockerFile保留字

FROM #基础镜像
MAINTAINER #镜像维护者信息:邮箱及姓名
RUN #容器构建时(docker build)需要执行的命令 shell格式&exec格式
EXPOSE #当前容器对外暴露的端口
WORKDIR #指定当前容器进入后,终端默认登录进来的工作目录,落脚点
USER #指定镜像以什么用户去执行,如果不指定默认root
ENV #运行时环境,构建过程中设置环境变量,设置的环境变量可直接在后续RUN指令及其它指令中使用
VOLUME #相当于docker run -v 挂载容器数据卷 用于数据保存及持久化
ADD #将宿主机的文件拷贝进容器指定目录,并自动处理url及解压tar
COPY #类似ADD 目录及文件拷贝入镜像
CMD #指定容器启动后要做的事(执行的指令) 可以有多个指令 但只有最后一个生效 会被docker run后的参数替换#在docker run 时CMD才会运行
ENTRYPOINT #与CMD相似,但是其不会被docker run后的参数覆盖,docker run后的参数会被当作参数送给ENTRYPOINT指令指定的程序#ENTRYPOINT指定后,CMD的内容作为参数传给ENTRYPOINT 变成<ENTRYPOINT> "<CMD>"#ENTRYPOINT + 定参#ENTRYPOINT + CMD变参

DockerFile构建带vim+ifconfig+jdk8的centos镜像案例:

编写Dockerfile

FROM centos
MAINTAINER hsp<hsp@126.com>ENV MYPATH /usr/local
WORKDIR $MYPATH#修改yum配置文件解决安装软件异常
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
#yum更新缓存及yum更新
RUN yum makecache
RUN yum update -y
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u351-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u351-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_351
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATHEXPOSE 80CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

上传jdk8压缩文件至Dockerfile同级目录

构建镜像及运行测试

#构建镜像 最后有一个点 代表当前目录
docker build -t 新镜像名:TAG .
docker build -t centosjava8:1.0 .
#查看镜像
docker images
#运行镜像
docker run -it centosjava8:1.0 /bin/bash
#测试 vim ifconfig java命令
#成功

六、虚悬镜像

仓库名、标签名都为的镜像、俗称dangling image

构建镜像、删除镜像时有概率出现错误导致

#虚悬镜像Dockerfile
From ubuntu
CMD echo 'Hello World'
#构建虚悬镜像
docker build .
#查看虚悬镜像
docker image  ls  -f dangling=true
#删除虚悬镜像
docker image prune

七、构建带ifconfig+jdk8的ubuntu镜像

Dockerfile

FROM ubuntu
MAINTAINER hsp<hsp@126.com>ENV MYPATH /usr/local
WORKDIR $MYPATH#apt 更新
RUN apt-get update
#安装ifconfig命令查看网络IP
RUN apt-get install  net-tools
#安装vim
RUN apt-get install -y vim
#安装java8
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u351-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u351-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_351
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATHEXPOSE 80CMD echo $MYPATH
CMD echo "success-----ubuntu+vim+ifconfig+jdk8---------ok"
CMD /bin/bash

构建及运行

#构建
docker build -t ubuntujdk8:1.0 .
#查看
docker images
#运行
docker run -it ubuntujdk8:1.0 /bin/bash
#测试
ifconfig
touch a.txt
vim  a.txt
java -version
#成功

八、Docker微服务实战

编写微服务工程

编译打jar包

编写Dockerfile

# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER hsp
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为rb_ms_docker.jar
ADD robot-service-1.0-SNAPSHOT.jar rb_ms_docker.jar
# 运行jar包
RUN bash -c 'touch /rb_ms_docker.jar'
ENTRYPOINT ["java","-jar","/rb_ms_docker.jar"]
#暴露6088端口作为微服务
EXPOSE 6088

构建及运行

#构建
docker build -t rbsdocker:1.0 .
#查看
docker images
#运行
docker run -d rbsdocker:1.0
#测试、访问接口

Docker学习(四):Dockerfile相关推荐

  1. Docker学习四:Docker 网络

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  2. Docker系列四DockerFile打造Python镜像

    前言 起因是在更新博客的时候,发现可以用更优雅的方式来实现原有的目的,所以重新整理后,将原文改成了两篇,都收录在了该系列中. 构建Docker镜像,简单来说分为以下两种: 拉取CentOS的操作系统镜 ...

  3. docker学习(四)docker run用法

    目录 前言 一.参数列表 二.使用示例 前言 docker run 命令用于创建一个新的容器,启动一个新的进程,并为这个进程分配其独占的文件系统.网络资源等.通过参数设置可以覆盖镜像和容器的一些默认配 ...

  4. Docker学习(四)-----Docker容器常用命令

    七.Docker容器 容器是Docker核心概念 简单的说,容器是独立运行的一个或一组应用,以及它们的运行环境 对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和运行 ...

  5. Docker学习四--Harbor私有仓库搭建

    Harbor企业级私有仓库搭建 安装docker-compose 进入官网 安装Harbor 下载harbor的离线安装包 进入系统进行安装 通过浏览器访问登录系统 安装docker-compose ...

  6. docker学习(四) 配置阿里云镜像加速器

    配置阿里云镜像加速器 注册阿里云账号 进入 镜像加速页面 进入对应操作系统配置,按照提示配置,这里以centos为例 复制配置,拷贝至centos 系统下 /etc/docker/daemon.jso ...

  7. Docker学习(四) -- 制作私有镜像推送到阿里云或私服

    1. 将自己创建的镜像发布到阿里云仓库: 1.1 在阿里云容器镜像服务中创建个人实例 1.2 进入个人实例,创建命名空间 1.3 创建镜像仓库,会产生一些阿里云为你生成的命令 操作指南: 1. 登录阿 ...

  8. Docker学习(12) Dockerfile构建过程

    Dockerfile的构建过程 以上为构建缓存 转载于:https://www.cnblogs.com/xiao-xue-di/p/11485044.html

  9. Docker学习六:综合实践

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  10. Docker学习五:Docker 数据管理

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

最新文章

  1. [Ext JS 4] 实战Chart 协调控制(单一的坐标,两个坐标)
  2. 开发最前沿:项目案例实战之桥模式
  3. Redis操作hash类型
  4. 深度解密Go语言之反射
  5. Codeforces Round #742 (Div. 2) F. One-Four Overload 构造 + 二分图染色
  6. Linux下open函数、read函数、write函数记录
  7. MySQL - 行锁 表锁 乐观锁 悲观锁 读锁 写锁
  8. 使用 Kustomize 帮你管理 kubernetes 应用(二): Kustomize 的使用方法
  9. Thread中yield方法
  10. nginx 1.12基础知识
  11. 基于OpenCV的三维数据点的曲面重构_MySurefaceReconstruction
  12. plc通过无线通讯连接服务器,多个plc无线通讯方案
  13. STM32学习笔记——HC05
  14. android 气泡尖角边框,如何使用CSS实现一个带尖角的气泡框?
  15. 欧拉计划第80题:平方根数字展开
  16. cogs——2098. Asm.Def的病毒
  17. JAVA数组常见例题(转置,排序,求和平均,插入,删除)
  18. The import com. cannot be resolved
  19. mat1 and mat2 shapes cannot be multiplied (128x432 and 576x64)的解决
  20. 2.郝斌C语言课程大纲

热门文章

  1. 【WINDOWS / DOS 批处理】for命令详解(八)
  2. 广工Anyview数据结构2021-C语言版--第一章
  3. springboot 整合 mqtt 实现消息订阅
  4. 一、计算机基础: 特点、数制、编码、组成
  5. MinIO入门-02 SpringBoot 整合MinIO并实现文件上传
  6. CSS预处理器之Sass与Less
  7. 如何在CTEX上对论文进行排版
  8. Java实现Sunday算法
  9. text/plain
  10. jmeter参数化的用法和用途