Dockerfile详解
文章目录
- 一、Dockerfile介绍
- 二、常用指令
- 三、Dockerfile示例
- 四、最佳实践
一、Dockerfile介绍
Dockerfile是一个包含创建镜像所有命令的文本文件,通过docker build命令可以根据Dockerfile的内容构建镜像。
一般的,Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,其中,‘#’为Dockerfile中的注释。
二、常用指令
- FROM
所有Dockerfile都必须以FROM命令开始。FROM命令会指定镜像基于哪个基础镜像创建,接下来的命令也会基于这个基础镜像。FROM命令可以多次使用,表示创建多个镜像。
FROM <image>:<tag>
如果本地没有指定的镜像,则会从对应的镜像仓库pull镜像下来,不指定具体镜像仓库,则会从docker hub公共仓库拉取。
如果没有指定标签tag,则默认使用latest标签。
- MAINTAINER
设置该镜像的作者。
MAINTAINER <author name>
- ENV
设置环境变量,使用键值对,并且该环境变量可以被后续的Dockerfile命令使用
ENV <key>:<value> #设置一个变量
ENV <key1>:<value1> \ #设置多个变量,可以通过"\"换行<key2>:<value2>
- ARG
设置构建环境的环境变量,只在构建容器时生效,在将来容器运行时是不会存在这些环境变量的且在构建时可以使用--build-arg=来指定参数。具体用法如下:
ARG <key>=<value>
不要因此就是用ARG保存密码之类的信息,因为docker history可以看到所有的值。
- WORKDIR
设置后续Dockerfile命令,像RUN、CMD、ENTRYPOINT、COPY、ADD的工作目录,如果WORKDIR不存在,会自动创建。
WORKDIR /path/workdir
- ADD
复制本地主机文件、目录或者远程文件URLS添加到容器指定路径中,它又两个参数和。source是本地绝对路径或者是Dockerfile所在的相对路径,destination是容器内的路径且如果dest路径不存在,会自动创建对应的目录;如果dest路径不是以斜线结尾,文件会以普通文件形式写入到目标。
如果复制的是压缩文件,会自动解压。
ADD <src> <destination>
- COPY
COPY复制文件或者目录,并且添加到容器指定路径中。用法同ADD,不同的是不能指定远程文件URL、不会解压压缩包。
COPY <src> <destination>
- EXPOSE
设置容器暴露的端口。
EXPOSE <port> 运行容器时,需要配合使用-p或-P参数进行端口映射,映射到宿主机
- USER
设置RUN/CMD/ENTRYPOINT的用户名或UID。
USER <name>
- VOLUME
设置容器的挂载点。
VOLUME ["/data/]
VOLUME /data1 /data2
- RUN
在构建镜像时执行命令。RUN指令会在新创建的镜像上添加新的镜像层。
RUN <command> # shell风格,即shell命令
RUN ["exec","parm1","parm2"] # exec风格
- CMD
设置容器启动命令。
CMD ["exec","parm1","parm2"]
CMD ["parm1","parm2"] # 为ENTRYPOINT提供参数列表
CMD <command>
- ENTRYPOINT
设置容器的入口程序。具体用法如下:
ENTRYPOINT ["exec","parm1","parm2"]
ENTRYPOINT command parm1 parm2
ENTRYPOINT与CMD的区别在于,ENTRYPOINT的等级更高,一个Dockerfile里边可以既有ENTRYPOINT又有CMD,这个时候CMD后面的命令会作为ENTRYPOINT的参数传递。
推荐ENTRYPOINT和CMD都使用exec的方式来构建。
如果Dockerfile中指定了多条CMD,只有最后一条会被执行;
每个Dockerfile只能有一个ENTRYPOINT,当多个ENTRYPOINT时,只有最后一个生效。
三、Dockerfile示例
基于CentOS7.9,安装并运行redis
- 同级目录文件
$ tree
.
├── CentOS-Base.repo #YUM源,可自行下载阿里云镜像源
├── Dockerfile
├── epel.repo #YUM源,可自行下载阿里云镜像源
├── redis-6.2.12.tar.gz #redis安装包
└── redis.conf #redis配置文件
- redis配置文件,使用默认即可
$ vim redis. confbind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile "/usr/local/redis/log/redis.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /usr/local/redis/data
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
requirepass 123456
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
- Dockerfile
$ vim DockerfileFROM centos:centos7.9.2009
MAINTAINER real
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone \rm -f /etc/yum.repos.d/*
COPY CentOS-Base.repo epel.repo /etc/yum.repos.d/
RUN yum clean all && yum makecache && yum install -y gcc make
ADD redis-6.2.12.tar.gz /tmp/
RUN cd /tmp/redis-6.2.12 && make MALLOC=libc && make PREFIX=/usr/local/redis install && \mkdir -p /usr/local/redis/{data,etc,log}
COPY redis.conf /usr/local/redis/etc/
ENTRYPOINT exec /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
EXPOSE 6379
- 构建镜像
注意命令最后的点`.`,是基于当前目录的Dockerfile进行构建
$ docker build -t redis:latest .
- 基于redis镜像启动容器
$ docker run -d --name redis-server -p 16379:6379 redis-d:后台运行容器
--name:为容器指定一个名称
-p:指定端口映射。格式为:宿主机端口:容器端口
最后跟镜像名称
- 查看容器
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e25d95579784 redis "/bin/sh -c 'exec /u…" 6 seconds ago Up 5 seconds 0.0.0.0:16379->6379/tcp, :::16379->6379/tcp redis-server
- 使用redis客户端登录redis容器,进行验证
$ redis-cli -h 127.0.0.1 -p 16379
127.0.0.1:16379> auth 123456
OK
127.0.0.1:16379>
四、最佳实践
- 减少镜像层数,尽量把一些指令合在一起;
- 注意清理镜像构建的中间产物,比如一些安装包在安装之后就把它删掉
- 注意优化网络请求,使用yum源时,用一些网络比较好的源站点,可节约时间,减少失败率
- 尽量去构建缓存,把一些不变的东西或者变动较少的东西放在前面,因为不变的东西可以被缓存,如果不想使用缓存,则可以在docker build时添加–no-cache=true选项
相关文章:
Dockerfile详解
文章目录 一、Dockerfile介绍二、常用指令三、Dockerfile示例四、最佳实践 一、Dockerfile介绍 Dockerfile是一个包含创建镜像所有命令的文本文件,通过docker build命令可以根据Dockerfile的内容构建镜像。 一般的,Dockerfile分为四部分:基础…...
零基础小白如何自学sql?
学习SQL对于数据分析和处理来说非常重要。SQL是一种强大的工具,可以帮助你与数据库沟通,提取,整理和理解数据。 以下是一些学习SQL的建议: 01 前期:SQL数据库学习 了解SQL的基本概念:首先,你…...
【刷题笔记2】
刷题笔记2 最小公倍数、最大公约数 两个数的最大公约数两数乘积/最小公倍数 #<include> cmath; int a,b; int mgcd(a,b);//求最大公约数复制字符串substr()函数 s.substr(pos, len) :pos的默认值是0,len的默认值是s.size() - pos string a1;in…...
Kafka之集群搭建
1. 为什么要使用kafka集群 单机服务下,Kafka已经具备了非常高的性能。TPS能够达到百万级别。但是,在实际工作中使用时,单机搭建的Kafka会有很大的局限性。 消息太多,需要分开保存。Kafka是面向海量消息设计的,一个T…...
Linux备忘手册
常⽤命令 作⽤ shutdown -h now 即刻关机 shutdown -h 10 10分钟后关机 shutdown -h 11:00 11:00关机 shutdown -h 10 预定时间关机(10分钟后) shutdown -c 取消指定时间关机 shutdown -r now 重启 shutdown -r 10 10分钟之后重启 shutdown -…...
Qt中QGraphicsView总体架构学习
前沿 前段时间学习了下如何在QGraphicsView架构中绘制刻度尺,主要是与OnPainter中进行比较的,那么今天就来详细讲解下我对QGraphicsView框架的认知吧~ 最近一段时间想学习下,如果我有不正确的,欢迎留言探讨哟~ QGraphicsView架…...
STL-list的使用简介
目录 编辑 一、list的底层实现是带头双向循环链表 二、list的使用 1、4种构造函数(与vector类似)编辑 2、迭代器iterator 3、容量(capicity)操作 4、element access 元素获取 5、增删查改 list modifiers 6、list的迭…...
MySQL:索引失效场景总结
1 执行计划查索引 通过执行计划命令可以查看查询语句使用了什么索引。 EXPLAIN SELECT * FROM ods_finebi_area WHERE areaName = 福建 执行查询计划后,key列的值就是被使用的索引的名称,若key列没有值表示查询未使用索引。 2 在什么列上创建索引 (1)列经常被用于where…...
LNMP平台对接redis服务
目录 1、安装 LNMP 各个组件 2、安装 redis 服务 3、安装 redis 扩展 4、修改 php 配置文件 5、测试连接 1、安装 LNMP 各个组件 2、安装 redis 服务 3、安装 redis 扩展 官网:http://redis.io/ 下载包: https://codeload.github.com/phpredis/p…...
5G之味,在烟火长沙
今年夏天,有一部电影叫做《长沙夜生活》。影片讲述了长沙大排档中的一些故事。网红大排档的老板娘、厨师、顾客,他们的邂逅、热爱、留下、离开、和解、团圆,都发生在一段夜色里,发生在充满烟火气的长沙城。 有没有想过这样一个问题…...
【MYSQL】MYSQL 的学习教程(十一)之 MySQL 不同隔离级别,都使用了哪些锁
聊聊不同隔离级别下,都会使用哪些锁? 1. MySQL 锁机制 对于 MySQL 来说,如果只支持串行访问的话,那么其效率会非常低。因此,为了提高数据库的运行效率,MySQL 需要支持并发访问。而在并发访问的情况下&…...
LORA的基本原理
本文将介绍如下内容: 什么是Lora高效微调的基本原理LORA的实现方式LORA为何有效? 一、什么是LoRA LoRA 通常是指低秩分解(Low-Rank Decomposition)算法,是一种低资源微调大模型方法,论文如下: LoRA: Low…...
Vue2x的自定义指令和render函数使用自定义指令
在某些情况下,我们需要对底层DOM进行操作,而内置的指令不能满足需求,就需要自定义指令。一个自定义指令由一个包含类似组件的生命周期的钩子的对象来定义,钩子函数会接收到指令所绑定的元素作为参数。 定义指令 常用两种方式进行…...
Linux学习(2):文件目录指令
Linux学习(2):文件目录指令 1 文件目录指令1.1 pwd 用来显示当前目录的绝对路径的1.2 ls 显示当前目录的信息1.3 cd 切换到指定目录1.4 mkdir 创建目录1.5 rmdir 删除空目录1.6 touch 创建空文件1.7 cp 拷贝文件到指定目录1.8 rm 移除文件或目…...
Dockerfile的ENV
文章目录 环境总结测试测试1测试2测试3测试4测试5测试6 参考 环境 RHEL 9.3Docker Community 24.0.7 总结 如果懒得看测试的详细信息,可以直接看结果: 一条 ENV 指令可以定义多个环境变量。Dockerfile里可以包含多条 ENV 指令。环境变量的值不需要用…...
【普中开发板】基于51单片机的简易密码锁设计( proteus仿真+程序+设计报告+讲解视频)
基于51单片机的简易密码锁设计 1.主要功能:资料下载链接: 实物图:2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单 【普中】基于51单片机的简易密码锁设计 ( proteus仿真程序设计报告讲解视频) 仿真图proteus8.16(有低版本) 程…...
c语言之输出函数用法 putchar
putchar函数 putchar函数是c语言输出函数,但它只能输出单个字符,如果要输出字符串就不合适了。 应用举例 #include<stdio.h> int main() {putchar(a);putchar(4);putchar(\n);return 0: } 从上面代码可以看出,单字符必须用单引号’…...
高精度原边控制电路D3820,CC/CV精度±5%以内,可作为10W以下小功率、低待机功耗的电源替代,可兼容OB2520
高精度原边控制离线式PWM功率开关 特点 1、全电压范围CC/CV精度保持在5%以内 2、用原边控制,无需TL431和光耦 3、欠压锁定(UVLO)及自动重启 4、驱动BJT 5、内置前沿消隐(LEB) 6、逐周期限流模式 7、输出线压降…...
Python库学习(十四):ORM框架-SQLAlchemy
1.介绍 SQLAlchemy 是一个用于 Python 的 SQL 工具和对象关系映射(ORM)库。它允许开发者通过 Python 代码而不是 SQL查询语言来操作数据库。SQLAlchemy 提供了一种灵活且强大的方式来与关系型数据库交互,支持多种数据库后端,如 P…...
信息学奥赛一本通1014:与圆相关的计算
1014:与圆相关的计算 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 167892 通过数: 85008 【题目描述】 给出圆的半径,求圆的直径、周长和面积。输入圆的半径实数r,输出圆的直径、周长、面积,每个数保留小数点后4…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
