DockeFile的介绍与使用

news2024/11/20 13:25:55

目录

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 通过镜像运行容器


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 准备

这个方式 是通过git命令行创建 也可创建文本文件将扩展名给去除

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

下载素材包

天翼云盘 珍藏美好生活 家庭云|网盘|文件备份|资源分享(访问码:mpe8)

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
jdk1.8-container    latest              f61711334bc6        13 seconds ago      449MB

通过镜像运行容器

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

4. 一点建议

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

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

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

相关文章

Docker+Jenkins+Gitee+Maven项目配置jdk、maven、gitee等拉取代码并自动构建以及遇到的那些坑

场景 CentOS中使用Docker安装Jenkins&#xff1a; CentOS中使用Docker安装Jenkins_霸道流氓气质的博客-CSDN博客_centos docker jenkins 在上面使用Docker部署起来Jenkins的基础上&#xff0c;怎样拉取SpringBoot项目代码并编译构建。 后台项目的搭建参考如下。 若依前后端…

OpenFeign AutoConfiguration源码解析

本文约2千字&#xff0c;主要知识 OpenFeign的父子容器FeignClient的注册 背景 在使用Spring Cloud时&#xff0c;经常使用OpenFeign 作为远程服务调用的类库&#xff1b;Feign 是一种声明式服务调用组件&#xff0c;它在 RestTemplate 的基础上做了进一步的封装。通过 Feig…

跨平台应用开发进阶(五十)uni-app ios web-view嵌套H5项目白屏问题分析及解决

文章目录一、前言二、问题分析三、解决方案3.1 nvue 页面替代 vue 页面3.2 白屏检测刷新3.2.1 自动刷新3.2.2 手动刷新3.3 总结四、拓展阅读一、前言 应用uni-app框架开发好APP上架使用过程中&#xff0c;发现应用经过长时间由后台切换至前台时&#xff0c;通过webview方式嵌套…

SQL语句(基本)

SELECT 语句的 执行过程&#xff1a; from clause ---> where clause ---> select --->group by ---> having--->order by ---> limit 写法顺序: select col1,... from clause ---> where clause ---> group by ---> having---> order by --->…

“ 请你要发光 而不是被照亮 “

做一个厉害的大人 勇敢地长大 成为会发光的星星 勇音频&#xff1a;00:0003:41 | 01 | 世界不会辜负努力拼搏的人 光明的前途在乌云散去之后 请你一定一定坚持自己 勿忘初心 要做会发光的星星 成为想成为的大人啊 | 02 | 我牵起你的手 你望向我的眼 少了你的懵懂青涩…

总线一:IIC

一、I2C集成电路总线, 多用于主控制器和从器件间的主从通信。 二、适用场景&#xff1a;在小数据量场合使用&#xff0c;传输距离短。 三、IIC是半双工。IIC的物理层&#xff1a;两条总线线路&#xff0c;一条是串行数据线SDA&#xff0c;一条是串行时钟线SCL&#xff0c;当总…

《Python知识手册》更新到V4.1版,快拿走学习

前言 最近&#xff0c;我花了点时间&#xff0c;把《Python知识手册》的部分内容进行了更新&#xff0c;更新后的版本号为 v4.1 版。 python知识手册内容&#xff1a;《Python知识手册》 没有比较完整的覆盖 Python 的基础知识。因此&#xff0c;针对手册的阅读&#xff0c;各…

程序员年底好找工作吗?

到年底了除非必要不要辞职&#xff01;除非必要不要辞职&#xff01;除非必要不要辞职&#xff01; 重要的事情说三遍。 很多老哥问我&#xff1a;工作干不下去了&#xff0c;这会儿辞职找工作合适吗&#xff1f;今天就来为大家解答一下&#xff0c;为什么不要在年底辞职&…

Redis6入门到实战------ 六、Redis_Jedis_测试

1 Jedis所需要的jar包 在pom文件中引入依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.2.0</version> </dependency>2 连接Redis注意事项 禁用Linux的防火墙&#xff1a;L…

Linux mybash

shell 在了解bash之前 我们要先了解shell Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面…

NoSQL数据库原理与应用综合项目——Neo4j篇

NoSQL数据库原理与应用综合项目——Neo4j篇 文章目录NoSQL数据库原理与应用综合项目——Neo4j篇0、 写在前面1、本地数据或HDFS数据导入到Neo4j2、Neo4j数据库表操作2.1 使用Python连接Neo4j2.2 查询数据2.3 插入数据2.4 修改数据2.5 删除数据3、Windows远程连接Neo4j(Linux)4、…

uboot源码下载以及编译

环境&#xff1a;ubuntu 20.04 uboot源码下载以及编译1 uboot源码下载&#xff1a;1.1 进入uboot官网1.2 下载源码2 编译uboot2.1 配置2.2 编译2.2.1 确认编译工具链是否ok2.2.2 配置环境变量2.2.3 编译3 注意事项3.1 uboot 2022.04版本问题3.2 unable to execute swig: No suc…

分代收集算法

将这个堆内存划分成两块&#xff1a;新生代和老年代&#xff0c;刚刚创建的对象都在新生代&#xff0c;长久存活的对象都在老年代&#xff08;老年代的垃圾回收很久发生一次&#xff0c;新生代的垃圾回收发生的比较频繁&#xff09; 新生代又进一步划分成伊甸园Eden&#xff0…

docker安装gitlab(超级详细)

前提&#xff1a; 在操作之前需要安装docker和docker-compose 拉取镜像 docker pull gitlab/gitlab-ce:15.2.4-ce.0 创建本地文件夹 mkdir /data/docker/gitlab/etc mkdir /data/docker/gitlab/logs mkdir /data/docker/gitlab/data 编写 docker-compose.yml cd /data/docker/…

面试高频题目,每周更新。

1.如何实现一个div快速的居中对齐&#xff1f; 2.margin和padding有什么不同&#xff1f; 作用对象不同&#xff0c;margin是针对对外部对象&#xff0c;padding是针对于自身。 3.vw和百分比有什么区别&#xff1f; 百分比是有继承的&#xff0c;父级元素改变后&#xff0c;会…

删除的照片如何恢复? 5个照片恢复方法总结

有人说&#xff0c;照片承载着很多回忆&#xff0c;一些难忘的时刻&#xff0c;还有一些经历。这就是我们不能丢失它们的原因&#xff0c;如果偶然丢失它们&#xff0c;到目前为止还没有可靠的设备。但是&#xff0c;如果您丢失了一些照片并想找回它们&#xff0c;请不要担心&a…

MySQL集群解决方案(4):负载均衡

在前面架构中&#xff0c;虽然对mycat做了集群&#xff0c;保障了mycat的可靠性&#xff0c;但是&#xff0c;应用程序需要连接到多个mycat&#xff0c;显然不是很友好的&#xff0c;也就是说缺少负载均衡的组件&#xff0c;接下来我们来了解下HAProxy。 1 简介 官网&#xff…

Nacos安装-单机安装

目录 一、环境介绍 二、安装方式 三、部署模式 四、单机模式包部署 4.1 下载到对应地址 4.2 解压缩包 4.3 单机模式支持mysql 导入初始化SQL 修改配置文件 4.4. 单机模式启动nacos 启动成功 登录 一、环境介绍 操作系统&#xff1a;Ubuntu 20.04.1JDK&#xff1a;保证…

HaaS EDU物联网项目实战:老板来了

HaaS EDU K1是一款高颜值、高性能、高集成度的物联网开发板&#xff0c;板载功能强大的4核&#xff08;双核300Mhz M33双核1GHz A7&#xff09;主芯片&#xff0c;2.4G/5G双频Wi-Fi&#xff0c;双模蓝牙&#xff08;经典蓝牙/BLE&#xff09;&#xff0c;并自带丰富的传感器与小…

2023 年的 7 个技术趋势——人工智能与企业内容管理相结合,云成为企业 IT 标准, 数据民主化······

2023 年的 7 个技术趋势 技术的发展速度比以往任何时候都快。高通胀、供应链问题和技术工人短缺等经济因素给当今的企业带来了巨大的压力。艰难的经济环境促使公司重新评估其财务战略&#xff0c;并寻找保持利润率的方法&#xff0c;同时培养对不断变化的经济状况做出快速反应…