docker--Dockerfile (三)

1,Dcockerfile是什么

docker推荐使用dockerfile的定义文件和docker build命令来构建镜像。dockerfile使用基本的基于DSL(面向领域语言)语法的指令来构建Docker镜像。另一种创建Docker镜像的方式是使用docker commit,不推荐使用。

2,dockerfile的基本组成

dockerfile有一系列指令和参数组成,每条指令都必须为大写,执行时按顺序从上到下执行,所以应该根据需要合理安排指令的顺序。

Dockerfile的基本组成及说明:

组成说明
基础镜像信息FROM
维护者信息MAINTAINER
镜像操作指令RUN、(COPY/ADD)、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等
容器启动时执行指令CMD、ENTRYPOINT

2.1 FROM

指定基础镜像,如:

FROM ubuntu:18.04

2.2 MAINTAINER

指定该镜像的作者及电子邮件等信息

MAINTAINER lisen "xxxxx@163.com"

2.3 RUN

在镜像内部执行的指令,如安装软件,配置基础环境等,可用\进行换行

RUN echo 'hello' > /usr/local/file.txt

也可以使用exec格式,RUN ["命令", "参数1","参数2"], 如:

RUN ["apt-get", "install", "-y", "ubuntu"]

2.4 COPY

将主机的文件复制到镜像中,如果目的目录不存在,docker会自动创建所需目录结构。注意:该命令只是单纯的复制,并不会做文件的提取解压工作。

COPY  file.txt /usr/local

注意:需复制的文件或目录必须要放在Dockerfile文件的同级目录下。

2.5 ADD

将宿主机文件复制到镜像,该命令与COPY命令作用和用法是一样的,但ADD命令会对压缩文件做解压和提取操作(tar,gzip等)

2.6 EXPOSE

暴露镜像的端口供主机做端口映射,运行镜像时使用-P参数将镜像端口与宿主机随机端口或指定端口做映射。
示例:

EXPOSE 8080

可以通过docker port查看到端口的映射情况。

2.7 WORKDIR

WORKDIR指令用来在从镜像创建一个新容器时,在容器内部设置一个工作目录,ENTRYPOINT和/或CMD指定的程序会在这个目录下执行。
我们可以使用该指令为Dockerfile中后续的一系列指令设置工作目录,也可以为最终的容器设置工作目录。

示例:

WORKDIR /opt/webapp/db 
RUN bundle install
WORKDIR /opt/webapp 
ENTRYPOINT [ "rackup" ]

这里,我们将工作目录切换为/opt/webapp/db后运行了bundle install命令,之后又将工作目录设置为/opt/webapp,最后设置了ENTRYPOINT指令来启动rackup命令。

可以通过-w标志在运行时覆盖工作目录,如代码清单4-57所示。

代码清单4-57 覆盖工作目录

$ sudo docker run -ti -w /var/log ubuntu pwd 
/var/log

该命令会将容器内的工作目录设置为/var/log。

2.8 ONBUILD

当一个包含ONBUILD命令的镜像被用作其他镜像的基本镜像时,ONBUILD指令将执行。
例如:base-image

FROM ubuntu
ONBUILD ADD . /var/www
......

当使用base-image作基础镜像创建imageA时,

FROM base-image
......

则base-image基础镜像的 ONBUILD指令会执行

2.9 USER

指定镜像以什么用户执行

USER user01

2.10 VOLUME

向基于镜像创建的容器添加卷。一个卷是可以存在于一个或者多个容器内的特定的目录,这个目录可以绕过联合文件系统,并提供如下共享数据或者对数据进行持久化的功能。
示例:

#使用VOLUME 指令向容器添加volume
VOLUME  /data#可以添加多个
VOLUME ["/data1","/data2"] #添加多个

注意:VOLUME指令不能挂载宿主机中指定的目录,这是为了保证Dockerfile的可移植性,因为不能保证所有的宿主机都有对应的目录。

2.11 CMD

CMD指令用于指定一个容器启动时要运行的命令,这有点儿类似于RUN指令,只是RUN指令是指定镜像被构建时要运行的命令,而CMD是指定容器被启动时要运行的命令。
例如:

$ sudo docker run -i -t jamtur01/static_web /bin/true

在Dockerfile中以下的CMD指令是等效的

CMD ["/bin/true"]

可以为要运行的命令指定参数,以下代码清单

CMD ["/bin/bash", "-l"]

这里我们将-l参数传递给了/bin/bash命令。

需要注意的是使用docker run命令可以覆盖CMD指令,如果我们在Dockerfile里指定了CMD指令,而同时在docker run命令行中也指定了要运行的命令,命令行中指定的命令会覆盖Dockerfile中的CMD指令。

2.12 ENTRYPOINT

ENTRYPOINT指令与CMD指令很相似,它们的区别在于ENTRYPOINT指令提供的命令不容易在启动容器时被覆盖,docker run命令行中指定的任何参数都会当作参数再次传给ENTRYPOINT命令。
ENTRYPOINT命令的一个示例:

ENTRYPOINT ["/usr/sbin/nginx"]

与CMD命令相似,ENTRYPOINT命令可以使用数组形式指定参数,如以下代码清单:

ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]

若我们构建镜像,并将ENTRYPOINT设置为ENTRYPOINT["/usr/sbin/nginx"],用docker build构建镜像,代码清单如下:

$ sudo docker build -t="jamtur01/static_web" .

然后用如下命令启动容器:

sudo docker run –t -i jamtur01/static_web -g "daemon off;"

则命令行参数-g "daemon off;"会传递给ENTRYPOINT指定的命令。在这里该命令为/usr/sbin/nginx -g "daemon off;"。该命令会以前台运行的方式启动Nginx守护进程,此时这个容器就会作为一台Web服务器来运行

3,dockerfile示例

该示例通过Dockerfile的方式构建一个安装了jdk的镜像。

3.1 准备

创建一个目录,在该目录中放入jdk,并创建一个Dockerfile文件。如图:

Dockerfile文件如下:

#0.vi Dockerfile进入编辑模式
#1.指定基础镜像,并且必须是第一条指令
FROM ubuntu:latest
#2.指明该镜像的作者和其电子邮件
MAINTAINER zs "zs@qq.com"
#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR /usr/local/java
#4.一个复制命令,把jdk安装文件复制到镜像中,语法:ADD <src>... <dest>,注意:jdk*.tar.gz使用的是相对路径
ADD jdk-8u151-linux-x64.tar.gz /usr/local/java/
#5.配置环境变量
ENV JAVA_HOME=/usr/local/java/jdk1.8.0_151
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
#容器启动时需要执行的命令
#CMD ["java","-version"]

注:在构建镜像时基础镜像请使用指定版本,而不要使用latest

3.2 将该目录上传至linux

3.3 构建镜像

登录linux,进入dockerfilejdk目录,通过docker build 构建镜像

3.4 通过镜像运行容器

查看我们刚才创建的镜像

root@ubuntu:/home/lisen/dockerfilejdk# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
jkd1.8-container    latest              f61711334bc6        13 seconds ago      449MB

通过镜像运行容器

root@ubuntu:/# docker run -it jkd1.8-container /bin/bash
root@ba5158079806:/usr/local/java#

4,建议

  1. 精简镜像用途:尽量让每个镜像的用途都比较集中单一,避免构造大而复杂、多功能的镜像
  2. 选用合适的基础镜像:容器的核心是应用,选择过大的父镜像(如Ubuntu系统镜像)会造成最终生成应用镜像的膝肿,推荐选用瘦身过的应用镜像或者较为小巧的系统镜像(alpine)

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

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

相关文章

【python】flask执行上下文context,请求上下文和应用上下文原理解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

SqlServer期末复习(数据库原理及应用)持续更新中

一、SQL语句 1.1 SQL语句知识引入 1.DDL语言(数据定义语言&#xff09;主要是进行定义/改变表的结构、数据类型、表之间的链接等操作&#xff0c;关键字CREATE、DROP、ALTER CREATE TABLE 表面( 列名1 数据类型&#xff0c; 列名2 数据类型&#xff0c; ) ALTER TABLE 表名&a…

MFC 打开类向导中方法时提示对com组件的调用返回了错误 HRESULT E_FAIL

解决&#xff1a;头文件中要分类&#xff0c;把virtual和afx_msg等放在一起&#xff0c;不要交叉错开。 MFC&#xff08;Microsoft Foundation Class&#xff09;中的virtual关键字用于声明虚函数。虚函数是C中实现多态的一种机制&#xff0c;它允许派生类重新定义基类中的虚函…

那位拿了多个Offer的大佬分享了最新Go面经

和大家分享一下我们 Go就业训练营 和 升职加薪星球 中战友们投稿的真实面经。 这是第一篇&#xff0c;计划还会再更新4篇最新Go面经&#xff0c;都是拿到Offer的那种&#xff01; 欢迎大家关注我的账号&#xff0c;关注之后不迷路。 先秀战绩 虽然不同的公司考察的侧重点不一…

每日必学Linux命令:mv命令

mv命令是move的缩写&#xff0c;可以用来移动文件或者将文件改名&#xff08;move (rename) files&#xff09;&#xff0c;是Linux系统下常用的命令&#xff0c;经常用来备份文件或者目录。 一&#xff0e;命令格式&#xff1a; mv [选项] 源文件或目录 目标文件或目录二&am…

计算机基础(中断、IO)

操作系统 设备交互 CPU 与 IO 设备交互过程 CPU 通过设备控制器&#xff08;驱动&#xff1f;&#xff09;与计算机外设进行交互。可以将控制器想象成编程语言中的接口&#xff0c;然后不同地计算机外设的控制器去实现这个接口&#xff0c;CPU 只需要调用接口而无需关注具体地…

如何使用生成式人工智能进行科学文献检索?

在学术写作过程中&#xff0c;查找文献是一个至关重要的步骤。文献检索不仅可以帮助我们了解研究领域的现状和发展&#xff0c;还可以为我们的论文提供理论支持和数据来源。然而&#xff0c;许多学者在查找文献时往往感到困惑和无所适从。本文将详细解释如何查找文献&#xff0…

柯桥专业会计培训|会计实操做账手工账电脑账出纳报税手把手教

开具纸质发票时&#xff0c;经常有小伙伴纠结发票开票人和复核人的问题。现在全国已施行数电票&#xff0c;这个问题还存在吗&#xff1f;一起来看看~ 暂未规定!! 开票人和复核人不应为同一人&#xff01; 目前&#xff0c;全国大部分城市已基本实现数电票的开票试点&#x…

Python学习:循环语句

Python循环语句 概念 循环语句是编程中常用的结构&#xff0c;用于多次执行相同或类似的代码块。Python中有两种主要的循环语句&#xff1a;for循环和while循环。 for循环&#xff1a; for循环用于遍历一个序列&#xff08;如列表、元组、字符串等&#xff09;中的元素&#x…

KIOXIA铠侠CM7系列E3.S双端口NVMe2.0 PCIe5.0 SSD KCM71RJE7T68

KIOXIA 铠侠推出的CM7-R E3.S企业级NVMe读密集型企业级固态硬盘&#xff0c;采用PCIe 5.0和NVMe 2.0技术&#xff0c;性能出色&#xff0c;最高可达2,700K IOPS&#xff08;随机读取&#xff09;和310K IOPS&#xff08;随机写入&#xff09;1 DWPD的耐用性和高达15.36 TB的存储…

教程4_轮廓特征(更多属性)

目标 在本章中&#xff0c;我们将学习 - 凸性缺陷以及如何找到它们 - 查找点到多边形的最短距离 - 匹配不同的形状 1. 凸性缺陷 我们看到了关于轮廓的第二章的凸包。从这个凸包上的任何偏差都可以被认为是凸性缺陷。 OpenCV有一个函数来找到这个 cv.convexityDefects()。一个…

剧变:人类社会与国家危机的转折点 - 三余书屋 3ysw.net

精读文稿 今天我们解读的这本书是《巨变》。副标题是人类社会与国家危机的转折点&#xff0c;这是一个充满风险和危机的时代。比如作为个人&#xff0c;我们可能会遭遇失业、离婚、亲朋好友的意外去世。作为国家&#xff0c;会遭遇经济危机、社会动荡甚至战争。整个世界也会陷入…

3.1. 状态空间方程

引言 状态空间方程是现代控制理论的基础&#xff0c;它以矩阵的形式表达系统的状态变量&#xff0c;输入及输出的关系。它可以描述和处理多输入多输出的系统。 目前流行的一些算法&#xff0c;比如&#xff1a;模型预测控制、卡尔曼滤波器及最优化控制都是在状态空间方程的表…

第二证券|固态电池概念拉升,丰山集团、丰元股份涨停,翔丰华等大涨

固态电池概念26日盘中强势拉升&#xff0c;截至发稿&#xff0c;丰山集团、丰元股份、科森科技等涨停&#xff0c;翔丰华涨超7%&#xff0c;瑞泰新材、鹏辉动力、天力锂能等涨超5%。 音讯面上&#xff0c;近来&#xff0c;智己联席CEO刘涛昨日发文称&#xff0c;智己L6将在准9…

【虚幻引擎】DTWebSocketServer 蓝图创建WebSocket服务器插件使用说明

本插件可以使用蓝图创建WebSocket服务器&#xff0c;并监听响应数据。 1. 节点说明 Create Web Socket Server – 创建WebSocket服务器对象并开启监听 创建一个WebSocket服务器对象&#xff0c;并监听相应端口&#xff0c;连接地址为 ws://IP:PORT, 比如ws://192.168.1.5:9001…

一本通差分约束入门题

最关键的就是找好所有的要满足的不等式条件&#xff0c;注意隐含的条件还有一点就是注意没有源点 建立源点 #2436. 「SCOI2011」糖果 #include<bits/stdc.h> using namespace std; using ll long long; using pii pair<int,int>; #define int long long const in…

视觉图像处理与FPGA实现第七次作业——生成512深度、8位宽度的双端口存储器IP,并分析IP包资料构成

一、生成IP 打开Vivado&#xff0c;点击IP Catalog&#xff0c;搜索memory&#xff0c;双击对应IP核 调整参数为——512深度、8位宽度&#xff0c;双端口&#xff0c;然后一直默认点击OK 二、分析IP构成 查看IP细节&#xff0c;查看设计资源和仿真资源 双击打开文件 设计文件…

【Java程序设计】【C00366】基于(JavaWeb)Springboot的纹理生产图片系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…

20240325数据驱动的机器学习预测单层二维材料力学性能

本论文使用模型主要有Mo,W,S,Se原子组成的单层二维材料。大小为30nmx30nm&#xff0c;中间有切口&#xff0c;切口大小从无切口以1nm增长到5nm&#xff0c;加载方向垂直于切口方向&#xff0c;并且分锯齿型和扶手椅型方向。 使用MD对模型进行拉伸&#xff0c;一共288个模型。 …

【数据存储】TIDB和MySQL的区别

1.TIDB和MySQL对比 对比内容MySQLTiDB架构设计一个传统的单机数据库系统&#xff0c;采用主从复制和分区表等方式来实现水平扩展一个分布式的 NewSQL 数据库&#xff0c;采用分布式存储和分布式事务等技术&#xff0c;支持水平扩展和高可用性事务支持 InnoDB 存储引擎来支持事…