docker 构建应用

news2024/9/30 11:31:07

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"]

在这里插入图片描述

构建镜像的基本步骤

  1. 准备构建 Dockerfile 上下文
  2. 编写 Dockerfile
  3. 执行构建命令
  4. 基于构建镜像启动进行测试

注意点

  1. 构建缓存问题
  2. 创建基础镜像(可以通过 scratch 构建最简单的父镜像)

多阶段构建

docker 17.05以上才支持

不用多阶段构建的解决方案

  1. 传统解决方案使用 shell 技巧和其他逻辑尽可能减少层的大小
  2. 还有一些先创建一个容器,然后运行,在复制出来需要的文件,再构建一次,需要shell脚本的配合来完成构建,麻烦地

使用多阶段构建

  1. 就是一个 Dockerfile 中有多个 FROM 指令,每个指令使用不同的基础镜像,并且各自分别开始一个新的构建阶段
  2. 可以选择将构建从一个阶段复制到另一个阶段,并在最终镜像中排除不需要的内容
#### 
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.c

FROM centos:7
WORKDIR /
COPY --from=builder /app/myapp .
CMD ["./myapp"]

在这里插入图片描述

Dockerfile 编写建议

  1. 创造短生命周期的容器:容器以无状态运行,可以被停止和销毁,可以使用最小的设置和配置进行重建和替换
  2. 可以使用标准输入管道化来构建(就不用保存 Dockerfile 文件了)
  3. 它的特殊参数 - 就是用来从标准输入读取 Dockerfile 内容的,直到遇到EOF/分界符
  4. 使用.dockerignore文件排除与构建无关的文件,类似于git那种,构建上下文发送给守护进程前,就会排除掉这些文件
  5. 使用多阶段构建
  6. 不安装不必要的包
  7. 解耦应用程序:一个容器只解决一个问题
  8. 使镜像层数最少
  9. 对多行参数排序
  10. 利用构建缓存
echo -e "FROM xxx \nRUN xxxx" | docker build -

在这里插入图片描述

在这里插入图片描述

Docker 的应用程序开发准则

减少镜像大小

  1. 选择合适的基础镜像:比如需要 JDK,考虑官方的 openjdk,而不是从通用的 ubuntu 镜像去构建JDK环境
  2. 多阶段构建:jave应用使用maven,使用多阶段构建,最终镜像就可以不用包含构建时需要引入的所有库和依赖
  3. 创建自己的基础镜像
  4. 生产镜像作为基础镜像
  5. 不依赖自动产生的 latest 标签

持久化应用程序数据

  1. 避免应用程序数据存储在容器的可写成,会降低IO和增加容器的大小
  2. 尽可能使用卷来存储数据
  3. 生产环境,使用 secrets 存储服务需要的敏感程序数据,使用配置数据 configs 存储配置文件

尽可能使用 swarm 集群服务

  • 即使单节点,swarm 带来的收益也比 docker run 要优秀

应用程序 Docker 化

基本流程

选择基础镜像

几乎所有开发技术都有自己的基础镜像,比如:java、python、node.js等,如果不直接使用这些镜像,就需要从基础操作系统镜像开始安装所有的依赖,最常见的就是 ubuntu 操作系统作为基础镜像

安装必要的软件

如果有必要,需要针对构建、调试和开发环境创建不同的 Dockerfile

添加自定义文件

定义容器运行时的用户权限

尽可能避免使用 root 权限运行

定义要对外暴露的端口

定义应用程序的入口点

entrypoint,比较简单的就是直接运行可执行文件,更专业的方法创建一个专门的shell脚本:entrypoint.sh,通过环境变量配置容器的入口点

定义一种配置方式

应用程序如果需要参数,可以使用应用程序特定的配置文件,也可以使用操作系统的环境变量

持久化应用数据

这些数据最好存储到卷或者绑定挂载上,不要将他们保存到容器本身的可写层

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

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

相关文章

03 SB实战 -微头条之首页门户模块(跳转某页面自动展示所有信息+根据hid查询文章全文并用乐观锁修改阅读量)

1.1 自动展示所有信息 需求描述: 进入新闻首页portal/findAllType, 自动返回所有栏目名称和id 接口描述 url地址&#xff1a;portal/findAllTypes 请求方式&#xff1a;get 请求参数&#xff1a;无 响应数据&#xff1a; 成功 {"code":"200","mes…

苹果手机突然无服务了,这是怎么回事?

苹果手机无疑是一款备受青睐的智能设备&#xff0c;但有时候我们可能会面临一个令人困扰的情况——苹果手机突然无服务。这种情况可能会在任何时候发生&#xff0c;无论是在使用手机时&#xff0c;刚刚升级系统&#xff0c;或者是突然发现在本应有信号的区域却无法连接到运营商…

一种通过增强的面部边界实现精确面部表示的多级人脸超分辨率

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;一种通过增强的面部边界实现精确面部表示的多级人脸超分辨率二、使用步骤1、研究背景2、方法提出3、相关方法3.1、FSR网络结构3.2…

【复现】Laykefu客服系统后台漏洞合集_29

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 2. 漏洞二&#xff1a; 3. 漏洞三&#xff1a; 4. 漏洞四&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Laykefu客服系统是thinkphp5Gatewayworker搭建的web客服…

Springboot注解@Aspect(二)JoinPoint 使用详解

目录 JoinPoint 的作用 JoinPoint 常用方法 示例 JoinPoint 的子类和关联类 JoinPoint 的作用 在 Spring AOP 中&#xff0c;JoinPoint 接口代表了一个程序执行的点&#xff0c;比如方法执行或异常处理。当使用 AOP 通知&#xff08;Advice&#xff09;时&#xff0c;你可以…

笔记:VS C++ 使用NuGut包管理器下载和使用第三方库

1.打开NuGet包管理器。右键你的项目---->点击“管理NuGet程序包”。 2.根据关键字搜索第三方库&#xff0c;下载和安装。安装后会有绿色的“√”。 3.右键你的项目—>“生成依赖项”—>“生成自定义”&#xff0c;点击&#xff0c;将弹出下面的对话框。然后点击“查看…

Vulnhub靶场DC-3

本机192.168.223.128 靶机192.168.223.139 目标发现nmap -sP 192.168.223.0/24 端口扫描nmap -p- 192.168.223.139 之开启了一个80端口 看一下是什么服务 nmap -sV -p- -A 192.168.223.139是一个apache服务&#xff0c;joomla模板 看一下web 没什么有用信息。 扫描一下后台…

黑马程序员JavaWeb开发|Maven高级

一、分模块设计与开发 分模块设计&#xff1a; 将项目按照功能拆分成若干个子模块&#xff0c;方便项目的管理维护、扩展&#xff0c;也方便模块间的相互调用&#xff0c;资源共享。 注意&#xff1a;分模块开发需要先对模块功能进行设计&#xff0c;再进行编码。不会先将工…

Python基础(二十九、pymsql)

文章目录 一、安装pymysql库二、代码实践1.连接MySQL数据库2.创建表格3.插入数据4.查询数据5.更新数据6.删除数据 三、完整代码示例四、结论 使用Python的pymysql库可以实现数据存储&#xff0c;这是一种连接MySQL数据库的方式。在本篇文章中&#xff0c;将详细介绍如何使用pym…

muduo库的模拟实现——muduo库的介绍

文章目录 一、muduo库介绍二、背景知识1.epoll2.Reactor模式 三、功能模块划分1.工具部分2.Reactor部分3.TCPServer部分 一、muduo库介绍 muduo库是在Linux环境下使用C实现的一个多Reactor多线程的高性能网络服务器&#xff0c;作者陈硕&#xff0c;他还出了一本书《Linux多线…

leetcode:二叉树的中序遍历(外加先序,后序遍历)

题外&#xff1a;另外三种遍历可以看这&#xff1a; 层序遍历&#xff1a; Leetcode:二分搜索树层次遍历-CSDN博客 先序遍历&#xff1a; 二叉树的先序&#xff0c;中序&#xff0c;后序遍历-CSDN博客 后序遍历&#xff1a; 二叉树的先序&#xff0c;中序&#xff0c;后序…

办公技巧:PPT制作技巧分享,值得收藏

目录 1、黑屏/白屏你用过么 2、图形组合替代动画刷 3、等距分布图形元素 4、快速统一字体 5、文本框也是可以改的 6、批量修改形状 7、搞定“怎么也选不中” 8、妙用CtrlD 9、图片阵列怎么做 10、临时放大某一区域 11、Word快速导入PPT 12、炫酷小人怎么做的&#…

HAL STM32基于系统滴答定时器(SysTick)实现多任务时间片轮询

HAL STM32基于系统滴答定时器&#xff08;SysTick&#xff09;实现多任务时间片轮询 &#x1f4d1;RTOS&#xff08;实时操作系统&#xff09;和定时器时间片轮询是两种不同的任务调度和执行方式的差异简介 &#x1f516; 以下部分内容&#xff0c;由AI给出的解答&#xff1a; …

中科星图——MOD11A1 V6是由Aqua中分辨率成像光谱仪获取的地表温度/发射率(LST/E)数据集

数据名称&#xff1a; MYD11A1.006 数据来源&#xff1a; NASA 时空范围&#xff1a; 2000-2022年 空间范围&#xff1a; 全国 数据简介&#xff1a; MOD11A1 V6数据集是由Aqua星搭载的中分辨率成像光谱仪获取的地表温度/发射率(LST/E)产品&#xff0c;以分片方式组织…

SpringBoot activemq收发消息、配置及原理

SpringBoot集成消息处理框架 Spring framework提供了对JMS和AMQP消息框架的无缝集成&#xff0c;为Spring项目使用消息处理框架提供了极大的便利。 与Spring framework相比&#xff0c;Spring Boot更近了一步&#xff0c;通过auto-configuration机制实现了对jms及amqp主流框架…

《动手学深度学习(PyTorch版)》笔记4.5

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…

spring-boot-starter-validation常用注解

文章目录 一、使用二、常用注解三、Valid or Validated &#xff1f;四、分组校验1. 分组校验的基本概念2. 定义验证组3. 应用分组到模型4. 在控制器中使用分组5. 总结 一、使用 要使用这些注解&#xff0c;首先确保在你的 Spring Boot 应用的 pom.xml 文件中添加了 spring-bo…

Facebook 广告帐户:多账号运营如何防止封号?

Facebook目前是全球最受欢迎的社交媒体平台之一&#xff0c;拥有超过27亿活跃用户。因此&#xff0c;它已成为个人和企业向全球受众宣传其产品和服务的重要平台。 然而&#xff0c;Facebook 制定了广告商必须遵守的严格政策和准则&#xff0c;以确保其广告的质量和相关性&…

项目风采展示【TRDa】

桌面功能介绍&#xff1a; 1&#xff1a;支持本地音乐、三方音乐控制播放展示功能&#xff1b; 2&#xff1a;支持陀螺仪 3&#xff1a;支持蓝牙列表显示。

【QT+QGIS跨平台编译】之十二:【libpng+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文件目录 一、libpng介绍二、文件下载三、文件分析四、pro文件五、编译实践一、libpng介绍 PNG(Portable Network Graphics,便携式网络图形),是一种采用无损压缩算法的位图格式,支持索引、灰度、RGB三种颜色方案以及Alpha通道等特性。 PNG使用从LZ77派生的无损数据压缩算…