Docker入门之使用Dockerfile 构建镜像(七)

news2024/11/20 21:34:56

文章目录

  • 1. 前言
  • 2. Docker file 核心要点
    • 2.1 注意事项
    • 2.2 Docker file 执行流程
    • 2.3 Docker Image、Docker file、Docker Container区别
    • 2.4 Dockerfile常用保留字指令
      • 2.4.1 FROM
      • 2.4.2 MAINTAINER
      • 2.4.3 RUN
      • 2.4.4 EXPOSE
      • 2.4.5 WORKDIR
      • 2.4.6 USER
      • 2.4.7 ENV
      • 2.4.8 ADD
      • 2.4.9 COPY
      • 2.4.10 VOLUME
      • 2.4.11 CMD
      • 2.4.12 ENTRYPOINT
  • 3. 使用Docker file制作JDK8镜像
    • 4. 虚悬镜像

1. 前言

在微服务项目开发中,我们常借助自动化工具的方式帮助我们实现项目部署,我们可以使用Docker帮助我们构建自动化构建流程,以提高工作效率。而Docker file 就是将软件包构建打包成镜像的文本文件。

2. Docker file 核心要点

2.1 注意事项

  1. Docker file中 每一个关键保留字都必须是 大写字母 且后面至少跟一个参数。
  2. 每一条指令都是顺序执行的。
  3. 每一个指令都会创建一个新的镜像层,并进行提交。
  4. # 代表注释

2.2 Docker file 执行流程

  1. Docker从基础镜像运行一个容器。
  2. 运行文件中的一条指令并对容器作出修改。
  3. 执行类似于docker commit 的操作并提交一个新镜像。
  4. docker在基于刚刚提交的镜像上运行一个新容器。

2.3 Docker Image、Docker file、Docker Container区别

Docker file面向开发,Docker镜像逐渐成为应用交互新标准。Docker容器还涉及到部署、运维,三者缺一不可。
在这里插入图片描述

  1. Dockerfile:软件镜像构建文件,定义了镜像构建过程中涉及到每一个步骤。
  2. Docker Image:Dockerfile构建生成的一个Docker镜像。
  3. Docker Container:容器就是镜像运行起来的一个实例。

2.4 Dockerfile常用保留字指令

下面是常见的保留字列表信息:

指令说明
FROM基础镜像,指定一个已经存在的镜像为模版,且必须是Dockerfile中第一个指令
MAINAINER镜像维护者信息
RUN容器构建时需要的指令,有两种格式,shell、exec
EXPOSE暴露端口
WORKDIR指定创建容器后,终端默认进来的工作目录
USER默认为root用户,也可指定其他linux用户
ENV构建时设置的环境变量
ADD将宿主机目录下的文件拷贝的命令,此命令会自动解压tar包
COPY也是文件拷贝命令,但不会自动解压tar包
VOLUME容器数据卷
CMD指定容器启动后执行的命令,在Dockerfile中只会有最后一条CMD命令生效,且会被docker run 命令之后参数替换

2.4.1 FROM

基础镜像,指定一个已经存在的镜像为模版,且必须是Dockerfile中第一个指令。如果不以任何镜像为基础,那么写法为:FROM scratch,常用语法格式如下:

FROM <image>
FROM <image>:<tag>

2.4.2 MAINTAINER

指定镜像维护作者信息

MAINTAINER <name>

2.4.3 RUN

构建过程中可指定的shell命令,RUN命令有两种格式:

1. RUN <command>
2. RUN ["executable", "param1", "param2"]

第一种后面直接跟shell命令,linux系统上默认/bin/sh -c,windows系统上默认 cmd /S/C。
第二种类似函数调用,可以将executable理解成可执行文件,后面跟着两个参数。

2.4.4 EXPOSE

暴露容器运行时的监听端口给外部,这在容器内端口与宿主机端口绑定时特别有用,语法:

EXPOSE <port>

2.4.5 WORKDIR

设置容器登录进来的终端默认工作目录,对 RUN,CMD,ENTRYPOINT,COPY,ADD 命令生效,语法:

WORKDIR /path/to/workdir

2.4.6 USER

设置容器启动的用户,可以是用户名或UID,语法:

USER <username>
USER <uid>

2.4.7 ENV

为容器设置环境变量,语法有如下两种:

 ENV <key> <value>
 ENV <key>=<value> ...

第一种与第二种的区别为:第二种可以设置多次值,在Dockerfile中使用环境变量主要有如下四种模块:

  • $key
  • ${key}
  • ${key:-default value}
  • ${key:+default value}
    上面表达式中第一种与第二种相同,第三种表示变量不存在时候使用默认值,第三种是变量存在使用默认值

2.4.8 ADD

可以将宿主机的文件拷贝到容器中,如果将容器想象为一个linux服务器,那么此命令类似与cp命令,语法如下所示:

1. ADD <src>... <dest>
2. ADD ["<src>",... "<dest>"]
  • 路径可以是容器内绝对路径,也可以是相对于工作目录的相对路径,一般都是使用绝对路径。
  • 如果源文件是tar文件,拷贝到容器后会被自动解压。
  • 源文件也可以是一个url,此时ADD命令类似与wget命令
  • 如果源文件是一个目录,会自动把目录下的文件复制到容器中,目录本身并不会被拷贝。

2.4.9 COPY

与上面命令ADD相似,唯一区别就是COPY只能拷贝本地文件,且压缩包文件不会自动解压。

2.4.10 VOLUME

声明一个容器卷,将宿主机目录挂载到容器中,语法如下:

VOLUME ["dirpath"]
VOLUME dirpath

2.4.11 CMD

容器启动时候执行的命令参数,语法如下:

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

与RUN命令类似,区别是RUN命令在镜像构建过程中有效。需要注意的是CMD命令执行的参数,会被docker run 命令之后的参数给替换掉。

2.4.12 ENTRYPOINT

与CMD功能类似,也是在容器启动后执行的命令,语法如下所示:

 ENTRYPOINT ["executable", "param1", "param2"]  
 ENTRYPOINT command param1 param2

第一种语法就是可执行文件加参数(EXEC调用,可在docker run 启动时传递参数),与CMD的区别就是命令不会被docker run 启动的命令进行覆盖,还有就是当与CMD共用时,CMD的内容会作为ENTRYPOINT 的参数。

3. 使用Docker file制作JDK8镜像

首先准备jdk8 软件包,然后编写Dockerfile如下所示:

# 以centos7系统为源镜像
FROM centos:7
MAINTAINER "galen"
# 安装vim命令与相关网络命令
RUN yum install -y net-tools vim*
# 设置时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
# 解决中文乱码问题
ENV LANG en_US.UTF-8  
ENV LANGUAGE en_US:en  
ENV LC_ALL en_US.UTF-8
# 设置工作目录环境变量
ENV WORKDIR /app/
# 拷贝jdk8安装包
ADD jdk-8u192-linux-x64.tar.gz ${WORKDIR}
# 设置工作目录
WORKDIR ${WORKDIR}
# 设置JDK环境变量
ENV JAVA_HOME ${WORKDIR}/jdk1.8.0_192
ENV PATH ${JAVA_HOME}:${PATH}
# 验证JDK安装是否成功
CMD ["java","-version"]

然后构建执行命令,执行如下命令:

# 命令格式:docker build -f <dockerfile 文件路径> -t <镜像名:tag名>
# 命令简写如下(需确保Dockerfile和软件tar包在同一个路径下)
docker build -t jdk:8 .

在这里插入图片描述
可以清晰看到jdk8镜像已经构建成功。

4. 虚悬镜像

仓库和标签都为none的镜像,发生在打包或者运行出错才会发生,例如:迁移镜像时,使用新的镜像覆盖原来的镜像,会使旧的镜像变为none。

# 虚悬镜像查询
docker image ls -f dangling=true
# 删除虚悬镜像
docker image prune

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194265.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ansible 简单使用

运行过程 1.加载自己的配置文件&#xff0c;默认/etc/ansible/ansible.cfg&#xff1b; 2.查找对应的主机配置文件&#xff0c;找到要执行的主机或者组&#xff1b; 3.加载自己对应的模块文件&#xff0c;如 command&#xff1b; 4.通过ansible将模块或命令生成对应的临时py文…

OpenMMLab 实战营打卡 - 第 一 课

OpenMMLab 实战营打卡 - 第 一 课 复习下总忘的基础知识 卷积的通道数变化 前一层特征纬度&#xff08;通道数&#xff09;决定核的通道数 当前层输出的特征纬度&#xff0c;由核的数量决定 图像尺寸变化 padding 公式&#xff1a;H′H−K12pH^{\prime}H-K12 pH′H−K12p…

电源技术中的安森美 单通道电压电平转换器件FXLP34P5X 适合便携式应用方案

电源技术中的安森美 单通道电压电平转换器件FXLP34P5X 适合便携式应用方案 &#xff1a;输入转换器电源电压为VCC1&#xff0c;输出转换器电源电压为VCC。 该器件使用1.0V至3.6V的VCC值运行&#xff0c;主要用于要求超低功耗的便携式应用。内部电路由最小量的缓冲器级组成&…

普通大学生自学 JAVA 怎样才能进大厂?

前言 可以看一下现在大厂对于Java方面的要求 阿里 百度 腾讯 从上面可以看出&#xff0c;无论是阿里、百度亦或是腾讯对于Java方面的要求是比较高的&#xff0c;可以说要求的是一个全面&#xff0c;所以想要进入大厂&#xff0c;不能操之过急&#xff0c;需要先从基础做起&am…

php报错SERVER SENT CHARSET (255) UNKNOWN

配置文件PHP.ini修改打开; extension_dir "ext"&#xff0c;修改成; extension_dir "./" ; On windows: extension_dir "自己php的存放路径\ext"2.打开extensionmsql.dll; For example, on Windows: ;extensionmsql.dll3.修改配置&#xff08…

五、Linux 用户管理常用命令

一、用户管理命令 - useradd 命令名称&#xff1a;useradd 命令所在路径&#xff1a;/usr/sbin/useradd 执行权限&#xff1a;root 功能描述&#xff1a;添加新用户 语法&#xff1a;useradd 用户名 二、用户管理命令 - userdel 命令名称&#xff1a;userdel 命令所在路…

创业青年张继群

中央广播电视总台 -专访-张继群简介&#xff1a; 张继群&#xff0c;1995年10月生&#xff0c;男&#xff0c;临沂大学硕士研究生在读&#xff0c;现临沂城投思索信息技术有限公司智慧城市事业部员工&#xff0c;作为农业专班成员主要从事网络安全、大数据等新一代信息技术的科…

nuxt3:postcss-pxtorem

一、理解postcsshttps://www.postcss.com.cn/1.1、PostCSS是一个用 JavaScript 工具和插件转换 CSS 代码的工具。1.2、增强代码可读性&#xff1a;利用从 Can I Use 网站获取的数据为 CSS 规则添加特定厂商的前缀。 Autoprefixer 自动获取浏览器的流行度和能够支持的属性&#…

如何录制电脑屏幕和声音?分享3个实用的方法,赶紧收藏

使用电脑录屏工具&#xff0c;可以帮助我们轻松录制电脑屏幕。有时候我们不仅仅需要录制电脑上的画面&#xff0c;还需要在录制画面的同时录入声音。那您知道如何录制电脑屏幕和声音吗&#xff1f;如何在录屏的时候录制电脑内部声音或者电脑外部声音&#xff1f;现在小编就给大…

操作系统—王道考研之计算机系统概述

by:星辰 课程视频链接:https://www.bilibili.com/video/BV1YE411D7nH 第 1 章 计算机系统概述 1.1 操作系统的基本概念 1.1.1 操作系统的概念、功能和目标 系统资源的管理者、提供接口、作为扩充机器、虚拟机 1.1.1.1 熟悉的操作系统举例 1.1.1.2 操作系统的层次结构 1.1.1…

5分钟了解 KubeGems 1.23 GA

KubeGems 是一款开源的企业级多租户容器云平台。围绕云原生社区&#xff0c;KubeGems 提供了多 Kubernetes 集群接入能力&#xff0c;并具备丰富的组件管理和资源成本分析功能&#xff0c;能够帮助企业快速的构建和打造一个本地化、功能强大且低成本的云管理平台。 KubeGems 发…

C 语言判断

判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假定为 false。下面是大…

爱情呼叫转移-深度广度遍历(中)

广度遍历和深度遍历可以结合吗&#xff1f; 可以的&#xff0c;例如经典的《爱情转移》 《爱情转移》是电影《爱情呼叫转移》的主题曲&#xff0c;《爱情呼叫转移》讲述了一个男人穿梭在12个女人之间的情感流浪&#xff0c;讨论的是夫妻相处之道。我当时还在想他到底爱谁。 …

java 设计原则

提示&#xff1a; 设计模式 文章目录一、软件设计原则1.开闭原则2.依赖倒置原则3.单一职责原则4.接口隔离原则5.迪米特法则6.里氏替换原则7.合成复用原则一、软件设计原则 1.开闭原则 开闭原则&#xff08;Open-Closed Principle, OCP&#xff09;是指一个软件实体如类、模块…

Java:如何避免Java内存泄漏

Java的核心优势之一就是利用JVM(Java虚拟机)&#xff0c;JVM是一种开箱即用的内存管理。你只管创建对象&#xff0c;Java的垃圾回收器帮你分配以及回收内存。然而&#xff0c;实际的情况并没有那么简单&#xff0c;因为内存泄漏在Java应用程序中还是时有发生的。为了避免内存泄…

别再焦虑了,进大厂没你想象的那么困难....

前段时间有个在小公司干了好多年的朋友离职了&#xff0c;想要拼一拼大厂&#xff0c;又觉得自己30多岁了&#xff0c;年级比较大&#xff0c;害怕人家不要。在我们的鼓励下&#xff0c;他选择字节跳动试试。面试总共花费了 20 天左右&#xff0c;包含了 4 轮电话面试、1 轮笔试…

微信小程序中使用Vant Weapp组件库

介绍Vant 是一个轻量、可靠的移动端组件库&#xff0c;于 2017 年开源。目前 Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本&#xff0c;并由社区团队维护 React 版本和支付宝小程序版本使用首先要提供npm支持使用npm安装&#xff1a;在小程序 package.json 所在的目…

css优先级、CSS盒模型、内边距padding、外边距margin、边框border、盒模型的计算及模式转换、三维盒子

一、css优先级 二、CSS盒模型 代码&#xff1a; 三 三、内边距padding <!doctype html> <html> <head> <meta charset"utf-8"> <title>无标题文档</title><style type"text/css">*{ /* 关闭系统默认设置的外…

elasticsearch中使用runtime fields

1、背景 在我们使用es的开发过程中可能会遇到这么一种情况&#xff0c;比如我们的线路名称字段lineName字段在设置mapping的时候使用的是text类型&#xff0c;但是后期发现需要使用这个字段来进行聚合操作&#xff0c;那么我们除了对索引进行reindex操作外&#xff0c;还有什么…

YOLO项目资源包配置及云硬盘挂载问题

资源包配置 首先就是pytorch的安装了&#xff0c;这里可以使用conda命令或者是pip命令 首先是conda命令&#xff0c;博主在第一个服务器时的安装方式就是这个&#xff0c;很正常&#xff0c;但到第二次安装时却总是出错 conda install pytorch1.12.0 torchvision0.13.0 torch…