Dockfile是什么

news2024/9/25 11:12:37

目录

1. Dockfile是什么

2. Dockerfile的基本组成

2.1 FROM

2.2 MAINTAINER

2.3 RUN

2.4 COPY

2.5 ADD

2.6 EXPOSE

2.7 WORKDIR

2.8 ONBUILD

2.9 USER

2.10 VOLUME

2.11 CMD

2.12 ENTRYPOINT

3. dockerfile示例

3.1 准备

3.2 将该目录上传至linux

3.3 构建镜像

3.4 通过镜像运行容器

4. 一点建议


1. Dockfile是什么

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#

勘误:在创建镜像时将jdk,敲错乘jkd了。 ^ _ ^

4. 一点建议

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

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

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

相关文章

2022年「博客之星」参赛博主:一个处女座的测试

我正在参加年度博客之星评选&#xff0c;请大家帮我投票打分&#xff0c;您的每一分都是对我的支持与鼓励。 五星必回&#xff0c;诚信互评&#xff0c;&#xff08;如果&#xff09;今日已满&#xff0c;明天必回&#xff0c;言出必行&#xff0c;感谢支持&#xff01; 我正在…

【深度探讨】数据存储进化论,区块链才是未来

发表时间&#xff1a;2022年5月23日 信息来源&#xff1a;bsvblockchain.org 需要一个适于处理这种日渐普及的资源的基础设施。 2022年2月&#xff0c;在沙特愿景2030区块链峰会上&#xff0c;BSV区块链协会创始主席Jimmy Nguyen就数据的价值这一话题发表了一场令人叹为观止的…

nodejs+vue+element+eachers构建开源项目大型连续剧(2)安装mysql数据库,在nodejs服务器中操作数据库数据

太长时间没更新了&#xff0c;然后&#xff0c;理由是什么呢&#xff1f;是因为阳了&#xff0c;真没想到&#xff0c;吃嘛嘛香的我忽然阳了&#xff0c;果然阳的初期症状就是嘴硬。然后&#xff0c;开始我们连续剧的第二集。 一、进行mysql的安装 学习第一步&#xff0c;从安…

[极客大挑战 2019]BuyFlag1(BUUCTF)

前言: 这篇文章还是是为了帮助一些 像我这样的菜鸟 找到简单的题解 题目描述 解题工具: 我爱用edit this cookie2和hackerbar&#xff0c; 当然也可以burpsuite和fiddler抓包 解题过程: 看到他说flag要100000000 MONEY&#xff0c; 还要是Cuits students&#xff0c; …

GCC嵌入汇编特性

前言 在C语言编程中&#xff0c;使用汇编指令有两种方式&#xff0c;一种是使用单独的汇编源文件&#xff0c;在最后编译的时候和其它C工程文件编译到一起&#xff0c;这种方式能够做到汇编函数和C函数的互相调用&#xff0c;但是如果希望在C语言中直接调用汇编表达式就不是那…

kibana在linux环境安装实战遇到的问题汇总

kibana在linux环境安装实战遇到的问题汇总&#xff1a; 1、找不到主节点的错误&#xff1a; savedobjects-service] Unable to connect to Elasticsearch. Error: [master_not_discovered_exception] null 原因是找不到es的主节点&#xff0c;意思是es没有配置主节点。 解决…

【Spring】Spring @Cacheable 官方学习及demo

文章目录前言Cacheable 的来源应用场景集成Redis的思路代码及验证后记前言 Spring 有很多声明式的编程风格&#xff0c;Transactional 是&#xff0c;Cacheable 也是。说起 Transactional&#xff0c;复杂的事务情况下&#xff0c;这个注解也有局限&#xff0c;需要用到编程式…

奇安信病毒检测中心 2022年第二季度App收集个人信息检测报告 学习笔记 附下载地址

奇安信 2022年第二季度App收集个人信息检测报告 下载地址 2022年第二季度 APP收集个人信息 检测报告 奇安信 病毒响应中心 研究背景 随着互联网和移动设备的发展&#xff0c;手机已成为人人都拥有的设备&#xff0c;其中各式各样的APP更是丰富了人们的生活&#xff0c;从社交…

现在考系统集成项目管理工程师有用吗?

有用&#xff01; 现在考系统集成项目管理工程师还是挺有用的哈&#xff0c;虽然它资质评定国务院取消了&#xff0c;但它是由国家人力资源和社会保障部、工业和信息化部领导下的国家级考试&#xff0c;并且是职业资格考试、职称资格考试和水平考试。 系统集成项目管理工程师…

sql-labs靶场环境搭建及搭建过程遇到的问题

sql-labs是github上的一个开源项目&#xff0c;通过闯关的方式训练自己的SQL注入。 下载php-study 进入官网 php-study 下载sql-labs 进入github sql-labs 将sql-labs下载到php-study的WWW\目录下&#xff0c;解压。 配置sql-llibs 记事本打开sqli-labs-master\sql-conn…

用python采集四大电商平台商品数据进行对比

前言 大家早好、午好、晚好吖 ❤ ~ 环境介绍: python 3.8 越稳定越好 pycharm 2021专业版 一、考拉 模块使用: requests >>> pip install requests parsel >>> pip install parsel 代码展示 导入模块 # import 导入模块 import requests # 第三方…

这届黑客不讲武德

编者按 腾讯安全2022年典型攻击事件复盘第七期&#xff0c;希望帮助企业深入了解攻击手法和应对措施&#xff0c;完善自身安全防御体系。 本篇讲述了某物流公司遭遇不明黑客攻击&#xff0c;腾讯安全服务团队和客户通力合作&#xff0c;排查溯源&#xff0c;最后揪出黑客的尾…

十、HashMap详解

文章目录小结底层源码框架特点源码详解小结 Map接口的常用实现类:HashMap、Hashtable和Properties.HashMap是Map接口使用频率最高的实现类。HashMap是以 key-val对的方式来存储数据(HashMap$Node类型)key不能重复&#xff0c;但是值可以重复,允许使用null键和null值。如果添加…

Android设计模式详解之组合模式

前言 组合模式也称为部分整体模式&#xff0c;结构型设计模式之一&#xff1b; 定义&#xff1a;将对象组合成树形结构以表示“部分-整体”的层次结构&#xff0c;使得用户对单个对象和组合对象的使用具有一致性&#xff1b; 使用场景&#xff1a; 表示对象的部分-整体的层…

屏幕录制为什么没声音?检查这2项,轻松解决

相信很多人在录制视频的时候都会遇到各种各样的问题&#xff0c;比如录制的视频没有声音。屏幕录制为什么没声音&#xff1f;今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音&#xff0c;你可以试试这个方法。 一、检查是否打开电脑系…

amCharts 5: Maps 附加组件

amCharts 5: Maps 附加组件 将reverseGeodata设置添加到MapPolygonSeries。如果设置为true&#xff0c;将反转GeoJSON数据中多边形角的方向。 向MapLine添加了新的linechanged事件。 amCharts 5&#xff1a;地图 amCharts:Maps是amCharts:Charts的附加组件。使用它可以将完整的…

Java学习笔记【7】面向对象

⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ &#x1f300; 个人首页&#xff1a;&#x1f3e0; 星空之路Star &#x1f3e0; &#x1f300; 所属专栏&#xff1a;&#x1f4d6; Java知识点总结 &#x1f4d6; &#x1f300; 大家好&#x1f91d; 我是 &#x1f449;老孙&#x1f448; &…

操作系统期末考试必会题库5——文件管理

1、画出文件系统的层次模型&#xff0c;并描述各层的功能。 2、某文件系统为一级目录&#xff0c;文件的数据一次性写入磁盘&#xff0c;已经写入的文件不可修改&#xff0c;但可以多次创建新文件&#xff0c;请回答&#xff1a; (1) 采用哪种文件物理结构形式更适合&#xff…

hnu计网实验二-网络基础编程实验(JAVA\Python3)

前言&#xff1a;这次实验用的是python语言&#xff0c;但是本人的python也不是很强&#xff0c;所以代码大部分也是借鉴别人的。实验本身还是很有趣的 一、实验目的 通过本实验&#xff0c;学习采用Socket&#xff08;套接字&#xff09;设计简单的网络数据收发程序&#xf…

Qt编写雷达模拟仿真工具

一、前言 雷达模拟仿真工具&#xff0c;已发布很长一段时间&#xff0c;一直以来没有好好整理该系列文章&#xff0c;在刘哥6.5的极力推荐下&#xff0c;整理出该系列的更加详细细节的文章出来。懒散了很久&#xff0c;也颓废了不少&#xff0c;人啊&#xff0c;感觉不能颓废下…