docker 构建应用
docker 应用程序开发手册
开发 docker 镜像
Dockerfile
- 非常容易定义镜像内容
- 由一系列指令和参数构成的脚本文件
- 每一条指令构建一层
- 一个
Dockerfile
文件包含了构建镜像的一套完整指令 - 指令不区分大小写,但是一般建议都是大写
- 从头到尾按顺序执行指令
- 必须以
FROM
指令开头,其实也是允许这个之前定义变量 #
是注释,但是要以这个开头的才是。行中其他位置被视为参数的一部分- 可以自定义转义字符:
escape=
构建镜像的基本方法
通过:docker build
原理:通过 Dockerfile 文件和构建上下文(build context)构建镜像
构建上下文
上下文是由文件路径或者一个 URL 定义的一组文件
构建上下文以递归方式处理,本地路径包括其中的任何子目录,URL 包括仓库及其子模块
示例
使用当前目录作为上下文的构建语句:docker build -t 镜像标识 .
镜像构建过程
- 整个构建过程是由 docker 守护进程运行的
- 构建过程从上到下递归发给守护进程执行
- 最好是一个项目一个目录进行构建,以这个目录作为上下文
Dockerfile 常用指令
这边以centos的镜像作为构建基础
FROM
设置基础镜像
FROM <image> [AS name]
- image 参数指定任何有效的镜像,多种写法,也可以从公有注册中心拉取
- 可以多次出现,以创建多个镜像层
- 设置别名,对构建阶段指定一个名称,这个名称后续的 FROM 和 COPY --from=<name|index> 指令引用此阶段构建的镜像
- 也支持由 ARG 指令申明的变量,但是这个变量要在第一条 FROM 指令前,在 FROM 指令前,就意味这个这个变量没有进入构建阶段
示例
RUN
运行命令
RUN <command>
RUN ["exec","param1","param2"]
- shell 格式,命令在 shell 环境中运行,默认是 /bin/sh -c
- exec 格式,不会启用 shell 环境执行
- 可以使用反斜杠将单个 RUN 指令延续到下一行
示例
RUN ["/bin/bash", "-c", "echo hello,world"]
CMD
指定容器启动时默认执行的命令
- 一个文件只能由一个 CMD 指令,就算有多个 CMD 指令,只有最后一个 CMD 有效
CMD ["exec","param1","param2"] ## 首选
CMD ["param1","param2"] ## 提供给 ENTRYPOINT 指令的默认参数
CMD command param1 param2 ## shell 格式
示例
LABEL
向镜像添加元数据信息
- 其中如果有空格,要加引号和反斜杠
- 可以有多个标记,多个标记合并到单个标记可以减少层数
LABEL kye=value kye=value kye=value...
示例
EXPOSE
声明容器运行时监听的端口
- 可以指定TCP或者UDP,默认是TCP
- 它不会发布真实的端口,只是声明一下,
EXPOSE <port>
ENV
指定环境变量
- 键值对形式
- 构建镜像阶段的所有后续指令的环境中,也可以被运行时指定的环境变量替换
- 引号和反斜杠可以作为值中包含空格
ENV key value ### 单个环境变量
ENV key=value key=value key=value ### 多个环境变量
示例
ARG version=7
FROM centos:$version
LABEL name=whale mail=565616251@qq.com info="then is a test"
COPY index.html /home/html/
EXPOSE 80/tcp 8088/udp
ENV var1=hello var2=world var3="hello world"
RUN ["/bin/bash","-c","echo ${var1}"]
RUN ["/bin/bash","-c","echo hello,world"]
CMD ["/bin/bash","-c","echo ${var1},${var2}"]
COPY
将源文件复制到容器内
- 一些通配符:*代表任何内容,?代表单个字符
- 源路径必须位于构建的上下文
- 如果源是目录,则复制整个目录的内容
- 指定多个源的话,目的路径必须是目录,必须以 / 结尾
- 如果目的路径不以/ 结尾,被视为常规文件,源内容将写入目录路径
- 如果目的路径不存在,则会与其路径中所有缺少的目录一起创建
COPY [--chown=<user>:<group>] <src>...<dest> #### chown只用于linux容器
COPY [--chown=<user>:<group>] ["<src>",..."<dest>"] #### 路径如果有空格字符,要用这种形式
示例
ARG version=7
FROM centos:$version
LABEL name=whale mail=565616251@qq.com info="then is a test"
COPY ind* /home/html/
EXPOSE 80/tcp 8088/udp
ENV var1=hello var2=world
CMD ["/bin/bash","-c","cat /home/html/index.html"]
ADD
将源文件复制到容器
ADD [--chown=<user>:<group>] <src>...<dest> #### chown只用于linux容器
ADD [--chown=<user>:<group>] ["<src>",..."<dest>"] #### 路径如果有空格字符,要用这种形式
- 源可以使用 URL 指定
- 归档文件在复制过程中能够被自动解压缩,URL 的资源除外
ENTRYPOINT
配置容器的默认入口
ENTRYPOINT ["exec","param1","param2"] #### 首选exec格式
ENTRYPOINT command param1 param2 #### shell 格式
VOLUME
创建挂载点
VOLUME ["/data"]
- 创建具有指定名称的挂载点,并将其标记为从本机主机或其他容器保留外部挂载的卷
示例
ARG version=7
FROM centos:$version
LABEL name=whale mail=565616251@qq.com info="then is a test"
COPY index.html /home/html/
EXPOSE 80/tcp 8088/udp
ENV var1=hello var2=world
VOLUME ["/home/html/"]
CMD ["/bin/bash","-c","cat /home/html/index.html"]
WORKDIR
配置工作目录
WORKDIR /path/xxx/xxxx
- 该指令后的 RUN 、CMD、COPY、ADD、ENTRYPOINT 指令设置工作目录,如果目录不存在,就会被创建
- 可以多次使用这个指令,当时最终的路径是基于先前 WORKDIR 指令的路径
示例
ARG version=7
FROM centos:$version
LABEL name=whale mail=565616251@qq.com info="then is a test"
WORKDIR /
RUN pwd
COPY index.html /home/html/
EXPOSE 80/tcp 8088/udp
ENV var1=hello var2=world
VOLUME ["/home/html/"]
WORKDIR /home/html
CMD ["/bin/bash","-c","cat index.html"]
USER
设置运行镜像时使用的用户名
USER <user>:<group>
- RUN、CMD、ENTRYPOINT 指令都会使用这个指定的身份
- 如果没有设置, root 组身份运行
示例
ARG version=7
FROM centos:$version
LABEL name=whale mail=565616251@qq.com info="then is a test"
RUN useradd whale
USER whale:whale
COPY index.html /home/html/
EXPOSE 80/tcp 8088/udp
ENV var1=hello var2=world
VOLUME ["/home/html/"]
WORKDIR /home/html
CMD ["/bin/bash","-c","id"]
ARG
定义构建时候的变量
ARG <name>[=<value>]
- 构建时候也可以使用命令进行传递:–build-arg =,但是如果这个参数没有在文件中定义,就会报错
SHELL
指定命令的 shell 格式
SHELL ["exec","parameters"]
- 用于指定命令的shell格式来覆盖默认的 shell,Linux 系统默认的shell是 /bin/sh -c 的形式,windows 是 cmd /S /C
- 可以多次出现,但是会被覆盖
exec、shell 格式方法
RUN、CMD、ENTRYPOINT
这些指令都会用到 exec 和 shell 两种格式
#### exec的一般写法:直接调用命令,不会被shell进行解析,也识别不了ENV指令的环境变量,除非是 shell 执行的
<指令> ["exec", "param1", "param2" ,......]
ENTRYPOINT ["/bin/echo", "Hello,World"]#### shell 的一般写法:底层直接调用的是/bin/sh -c 来执行的
<指令> <command>
- CMD、ENTRYPOINT 首先 exec 格式,可读性强,容易理解
- RUN 两种都可以
RUN、CMD、ENTRYPOINT 区别
- RUN 指令执行命令并创建新的镜像层,经常用来安装应用程序和依赖包
- CMD 指令为运行容器提供默认值,默认执行的命令及其参数,如果容器启动时候手动指定,CMD 指令就会被覆盖,如果省略了可执行文件,就必须指定 ENTRYPOINT 指令,CMD 指令可为提供额外的默认参数
- ENTRYPOINT 指令配置容器启动时运行的命令,CMD 指令提供额外参数,并且 ENTRYPOINT 在容器启动一定会运行,不会被覆盖的
ARG version=7
FROM centos:$version
LABEL name=whale mail=565616251@qq.com info="then is a test"
ENTRYPOINT ["/bin/echo", "hello"]
CMD [" world"]
构建镜像的基本步骤
- 准备构建 Dockerfile 上下文
- 编写 Dockerfile
- 执行构建命令
- 基于构建镜像启动进行测试
注意点
- 构建缓存问题
- 创建基础镜像(可以通过 scratch 构建最简单的父镜像)
多阶段构建
docker 17.05以上才支持
不用多阶段构建的解决方案
- 传统解决方案使用 shell 技巧和其他逻辑尽可能减少层的大小
- 还有一些先创建一个容器,然后运行,在复制出来需要的文件,再构建一次,需要shell脚本的配合来完成构建,麻烦地
使用多阶段构建
- 就是一个 Dockerfile 中有多个 FROM 指令,每个指令使用不同的基础镜像,并且各自分别开始一个新的构建阶段
- 可以选择将构建从一个阶段复制到另一个阶段,并在最终镜像中排除不需要的内容
####
ARG version=7
FROM centos:$version
LABEL name=whale mail=565616251@qq.com info="then is a test"
COPY index.html /home/html/FROM centos:6
COPY --from=0 /home/html/index.html /home/ ### 从前一阶段复制到新的阶段
CMD ["/bin/bash","-c","cat /home/index.html"]
为每个构建阶段命名
这里使用c语言环境进行构建演示
FROM gcc:latest as builder
WORKDIR /app
COPY myapp.c /vim app
RUN gcc -o myapp myapp.cFROM centos:7
WORKDIR /
COPY --from=builder /app/myapp .
CMD ["./myapp"]
Dockerfile 编写建议
- 创造短生命周期的容器:容器以无状态运行,可以被停止和销毁,可以使用最小的设置和配置进行重建和替换
- 可以使用标准输入管道化来构建(就不用保存 Dockerfile 文件了)
- 它的特殊参数 - 就是用来从标准输入读取 Dockerfile 内容的,直到遇到EOF/分界符
- 使用.dockerignore文件排除与构建无关的文件,类似于git那种,构建上下文发送给守护进程前,就会排除掉这些文件
- 使用多阶段构建
- 不安装不必要的包
- 解耦应用程序:一个容器只解决一个问题
- 使镜像层数最少
- 对多行参数排序
- 利用构建缓存
echo -e "FROM xxx \nRUN xxxx" | docker build -
Docker 的应用程序开发准则
减少镜像大小
- 选择合适的基础镜像:比如需要 JDK,考虑官方的 openjdk,而不是从通用的 ubuntu 镜像去构建JDK环境
- 多阶段构建:jave应用使用maven,使用多阶段构建,最终镜像就可以不用包含构建时需要引入的所有库和依赖
- 创建自己的基础镜像
- 生产镜像作为基础镜像
- 不依赖自动产生的 latest 标签
持久化应用程序数据
- 避免应用程序数据存储在容器的可写成,会降低IO和增加容器的大小
- 尽可能使用卷来存储数据
- 生产环境,使用 secrets 存储服务需要的敏感程序数据,使用配置数据 configs 存储配置文件
尽可能使用 swarm 集群服务
- 即使单节点,swarm 带来的收益也比 docker run 要优秀
应用程序 Docker 化
基本流程
选择基础镜像
几乎所有开发技术都有自己的基础镜像,比如:java、python、node.js等,如果不直接使用这些镜像,就需要从基础操作系统镜像开始安装所有的依赖,最常见的就是 ubuntu 操作系统作为基础镜像
安装必要的软件
如果有必要,需要针对构建、调试和开发环境创建不同的 Dockerfile
添加自定义文件
定义容器运行时的用户权限
尽可能避免使用 root 权限运行
定义要对外暴露的端口
定义应用程序的入口点
entrypoint,比较简单的就是直接运行可执行文件,更专业的方法创建一个专门的shell脚本:entrypoint.sh,通过环境变量配置容器的入口点
定义一种配置方式
应用程序如果需要参数,可以使用应用程序特定的配置文件,也可以使用操作系统的环境变量
持久化应用数据
这些数据最好存储到卷或者绑定挂载上,不要将他们保存到容器本身的可写层
相关文章:
docker 构建应用
docker 应用程序开发手册 开发 docker 镜像 Dockerfile 非常容易定义镜像内容由一系列指令和参数构成的脚本文件每一条指令构建一层一个 Dockerfile 文件包含了构建镜像的一套完整指令指令不区分大小写,但是一般建议都是大写从头到尾按顺序执行指令必须以 FROM 指…...
Go语言grpc服务开发——Protocol Buffer
文章目录 一、Protocol Buffer简介二、Protocol Buffer编译器安装三、proto3语言指南四、序列化与反序列化五、引入grpc-gateway1、插件安装2、定义proto文件3、生成go文件4、实现Service服务5、gRPC服务启动方法6、gateway服务启动方法7、main函数启动8、验证 相关参考链接&am…...
【开源】基于JAVA语言的实验室耗材管理系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗材出库模块2.4 耗材申请模块2.5 耗材审核模块 三、系统展示四、核心代码4.1 查询耗材品类4.2 查询资产出库清单4.3 资产出库4.4 查询入库单4.5 资产入库 五、免责说明 一、摘要 1.1…...
金智易表通构建学生缴费数据查询+帆软构建缴费大数据报表并整合到微服务
使用金智易表通挂接外部数据,快速建设查询类服务,本次构建学生欠费数据查询,共有3块设计,规划如下: 1、欠费明细查询:学校领导和财务处等部门可查询全校欠费学生明细数据;各二级学院教职工可查询本二级学院欠费学生明细数据。 2、大数据统计报表:从应收总额、欠费总额…...
MySQL复合索引
复合索引是指在数据库表上同时包含两个或更多列的索引。它们对于优化涉及这些列的查询非常有效,特别是当这些列常常在查询条件(如WHERE子句)、排序(ORDER BY子句)和连接(JOIN条件)中使用时。 复…...
Web3 游戏开发者的数据分析指南
作者:lesleyfootprint.network 在竞争激烈的 Web3 游戏行业中,成功不仅仅取决于游戏的发布,还需要在游戏运营过程中有高度的敏锐性,以应对下一次牛市的来临。 人们对 2024 年的游戏行业充满信心。A16Z GAMES 和 GAMES FUND ONE …...
temu跨境电商怎么样?做temu蓝海项目有哪些优势?
在全球电商市场激烈的竞争中,Temu跨境电商平台以其独特的优势和策略,逐渐崭露头角。对于许多想要拓展海外市场的商家来说,Temu的蓝海项目提供了一个充满机遇的新平台。本文将深入探讨Temu跨境电商的优势以及在蓝海市场中的发展前景。 全球化市…...
C#使用RabbitMQ-1_Docker部署并在c#中实现简单模式消息代理
介绍 RabbitMQ是一个开源的消息队列系统,实现了高级消息队列协议(AMQP)。 🍀RabbitMQ起源于金融系统,现在广泛应用于各种分布式系统中。它的主要功能是在应用程序之间提供异步消息传递,实现系统间的解耦和…...
EasyExcel中自定义拦截器的运用
在EasyExcel中自定义拦截器不仅可以帮助我们不止步于数据的填充,而且可以对样式、单元格合并等带来便捷的功能。下面直接开始 我们定义一个MergeWriteHandler的类继承AbstractMergeStrategy实现CellWriteHandler public class MergeLastWriteHandler extends Abst…...
shell编程-7
shell学习第7天 sed的学习1.sed是什么2.sed有两个空间pattern hold3.sed的语法4. sed里单引号和双引号的区别:5.sed的查找方式6.sed的命令sed的标签用法sed的a命令:追加sed的i命令:根据行号插入sed的c命令:整行替换sed的r命令sed的s命令:替换sed的d命令:删除sed中的&符号 7…...
工业智能网关储能物联网应用实现能源的高效利用及远程管理
储能电力物联网是指利用物联网技术和储能技术相结合,实现对电力系统中各种储能设备的智能管理和优化控制。随着可再生能源的不断发展和应用,电力系统面临着越来越大的电力调度和储能需求而储能电力物联网的出现可以有效解决这一问题,提高电力…...
虹科数字化与AR部门升级为安宝特AR子公司
致关心虹科AR的朋友们: 感谢您一直以来对虹科数字化与AR的支持和信任,为了更好地满足市场需求和公司发展的需要,虹科数字化与AR部门现已升级为虹科旗下独立子公司,并正式更名为“安宝特AR”。 ”虹科数字化与AR“自成立以来&…...
服务器是什么?(四种服务器类型)
服务器 服务器定义广义: 专门给其他机器提供服务的计算机。狭义:一台高性能的计算机,通过网络提供外部计算机一些业务服务 个人PC内存大概8G,服务器内存128G起步 服务器是什么 服务器指的是 网络中能对其他机器提供某些服务的计算机系统 ,相对…...
09-微服务Sentinel整合GateWay
一、概述 在微服务系统中,网关提供了微服务系统的统一入口,所以我们在做限流的时候,肯定是要在网关层面做一个流量的控制,Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。 1.1 总览 Sentinel 1.6.…...
python基础学习-03 安装
python3 可应用于多平台包括 Windows、Linux 和 Mac OS X。 Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。)Win 9x/NT/2000Macintosh (Intel, PPC, 68K)OS/2DOS (多个DOS版本)PalmOSNokia 移动手机Windows CEAcorn/RISC OSBeOSAmigaVMS/OpenVMSQNXVxWorksP…...
HTML — 区块元素
HTML 通过各种标签将元素组合起来。 一. 区块元素 大多数 HTML 元素被定义为块级元素或内联元素。块级元素在浏览器显示时,通常会以新的行开始。例如:<div>、<h1>、<p>、<ul>等。 它们在使用时会独自占据一行,称为块…...
《PCI Express体系结构导读》随记 —— 第I篇 第3章 PCI总线的数据交换(4)
接前一篇文章:《PCI Express体系结构导读》随记 —— 第I篇 第3章 PCI总线的数据交换(3) 3.2 PCI设备的数据传递 PCI设备的数据传递使用地址译码方式,当一个存储器读写总线事务到达PCI总线时,在这条总线上的所有PCI设…...
力扣0083——删除排序链表中的重复元素
删除排序链表中的重复元素 难度:简单 题目描述 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例1 输入:head [1,1,2] 输出:[1,2]示例2 输入:…...
MySQL数据库的一些缩写含义
DDL Data Definition Language,数据定义语言,用来定义数据库对象(数据库,表,字段) DML DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进 行增、删、改操作。 添加数据&#x…...
解决 ssh: connect to host github.com port 22: Connection timed out
问题 今天使用git克隆github上的代码时,一直报错 原以为是公钥过期了,就尝试修改配置公钥,但是尝试了几次都不行,最终在博客上找到了解决方案,在次记录一下,以备不时之需 解决ssh-connect-to-host-github…...
【iOS ARKit】同时开启前后摄像头BlendShapes
在上一节中已经了解了 iOS ARkit 进行BlendShapes的基本操作,这一小节继续实践同时开启前后摄像头进行人脸捕捉和世界追踪。 iOS设备配备了前后两个摄像头,在运行AR 应用时,需要选择使用哪个摄像头作为图像输人。最常见的AR 体验使用设备后置…...
Vue3动态插入组件
一、使用<component>is实现动态组件插入 <component>:一个用于渲染动态组件或元素的“元组件”。 :is : 要渲染的实际组件,当 is 是字符串,它既可以是 HTML 标签名也可以是组件的注册名。 <script> import Foo from ./F…...
介绍一下OpenCV中常用的图像处理函数
OpenCV中常用的图像处理函数有很多,以下是其中一些函数的介绍: - cvLoadImage():读入图像函数。 - imshow():显示图像函数。 - imwrite():保存图像函数。 - Mat srcImage imread():读入图像函数。 - …...
vscode vim 快捷键汇总
需满足操作: 上下移动按照 word 移动选中增删改查找字符/变量移动、增加、复制、删除 行选中多个相同的变量/字符屏幕移动增加多个光标快速注释 上下左右移动 CommandDescription🔢 hleft (also: CTRL-H, BS, or Left key)🔢 lright (also…...
npm官方注册表和淘宝镜像切换
1.切换到淘宝镜像 加快npm包的下载速度, //已失效 //npm config set registry https://registry.npm.taobao.org/ npm config set registry https://registry.npmmirror.com这会将npm的注册表设置为淘宝镜像 查看: npm config get registry如果返回的…...
LFU算法
LFU算法 Least Frequently Used(最不频繁使用) Leetcode有原题,之前手写过LRU,数据结构还是习惯于用java实现,实现是copy的评论题解。 题解注释写的很清楚 大致就是说LFUCache类维护一个存放node的map,同…...
JVM系列-7内存调优
👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理🔥如果感觉博主的文…...
[UI5 常用控件] 01.Text
文章目录 前言1. 普通文本2. 长文本:3. 设置最大显示行数 ( maxLines3 )4. 单行显示 ( wrappingfalse )5. 显示空白符 ( renderWhitespacetrue )6. 使用 - 连接单词:只适用于英文 ( wrappingTypeHyphenated )7. 空白时使用 - 代替 ( emptyIndicatorModeOn )8. JSON数…...
C语言之指针的地址和指向的内容总结(八十四)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...
1月25日,每日信息差
第一、中国和新加坡互免签证,新加坡酒店搜索量较发布前增长4倍。去哪儿数据显示,新加坡酒店搜索量较发布前增长4倍,仍在持续增长中。同程旅行数据显示,消息发布半小时内,同程旅行平台新加坡相关搜索热度较前日同一时段…...
做的好的农产品网站/网页制作软件免费版
在Java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符。 但对应的字节数不同,一个汉字占两个字节。 定义一个方法,按照指定的字节数来取子串。 如:对于“ab你好”,如果取三个字节ÿ…...
做网站的开题报告/成都seo招聘
datetime.timedelta对象代表两个时间之间的时间差,两个date或datetime对象相减就可以返回一个timedelta对象。 如果有人问你昨天是几号,这个很容易就回答出来了。但是如果问你200天前是几号,就不是那么容易答出来。而在Python中datetime模块…...
网站被主流搜索引擎收录的网页数量是多少/磁力宅
一日从朋友处得到一网站权限,让我帮忙提权。拿到后看了看,C、D盘有只读权限,C:\Documents and Settings\All Users\Documents 可写。 没有装FTP软件和数据库。wscript.shell没有被禁用, 终端端口被改成45678 。试了试从外网连不上…...
企业网站备案还是不用备案/晚上看b站
链接:https://ac.nowcoder.com/acm/contest/699/F来源:牛客网 题目描述 从前有个小哥哥Bill非常喜欢编程,但是让他更加心动的是班上那位小姐姐,为了取得小姐姐的欢心,Bill每天刷acm题,只想着找一个机会大发…...
越秀网站建设设计/河北关键词排名推广
初始化 1、从list初始化一个ndarray arr np.array([1, 2, 3]) #list转ndarry li arr.tolist() #ndarry转list print(type(arr),type(li))<class numpy.ndarray> <class list>2、通过内置函数初始化 arr np.zeros((2, 3)) #初始化一个2*3的元素…...
wordpress网站速度慢/seo顾问服务深圳
文章目录心流是当一个人完全沉浸在某种活动中,无视其他事物存在的状态,这种体验本身会获得莫大的喜悦,使人愿意付出巨大的代价。心流是一种最优体验,这种最优体验产生于一种自我掌控的感觉,虽然我们未必会在现实生活中…...