当前位置: 首页 > news >正文

制作docker镜像文件

技术主题

Docker作为一个开源的应用容器引擎,制作自己的docker镜像文件是使用docker的第一步,这样我们能够更好地管理应用程序。

技术原理

技术原理一:安装Docker

一般都是在官网下载特定的docker文件,然后安装即可

技术原理二:编写dockerfile文件

Dockerfile的主要组成部分如下:
1)FROM: 指定所需的基础镜像。
2)RUN: 在容器内执行的命令。
3)COPY: 将本地文件拷贝到容器中。
4)WORKDIR: 设置工作目录。
5)CMD: 容器启动时执行的命令。
一简单例子:

FROM ubuntu:18.04
RUN apt-get update && \apt-get install -y niginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

1)FROM ubuntu:18.04
这是Dockerfile的第一行,它指定了基础镜像。在这里,基础镜像是Ubuntu 18.04。Docker将在这个基础镜像的基础上构建你的容器。
2)RUN apt-get update && apt-get install -y nginx
这一行包含了两个Dockerfile指令,使用&&运算符将它们连接起来。首先,apt-get update用于更新Ubuntu操作系统的包列表,以确保安装的软件包是最新的。然后,apt-get install -y nginx用于安装Nginx Web服务器。 -y标志用于自动应答所有安装过程中的交互式提示,以便在非交互式环境中安装软件包。
3)EXPOSE 80
这一行指定了容器将会监听的网络端口。在这里,容器将监听80端口,这是HTTP协议的默认端口,用于提供Web服务。但需要注意的是,这只是一个声明,它告诉Docker容器可以监听80端口,但它不会自动将容器的80端口映射到主机的80端口。你需要在运行容器时显式地进行端口映射,以便外部可以访问容器内的Nginx服务。
4)CMD [“nginx”, “-g”, “daemon off;”]
这一行定义了容器启动时要执行的默认命令。在这里,它启动Nginx服务器,并使用-g "daemon off;"参数来告诉Nginx以前台模式运行,以便容器保持运行状态。这是因为Docker容器通常在后台运行,但Web服务器通常需要前台运行以响应请求。
该Dockerfile以Ubuntu 18.04(基础镜像)为基础,并在其中安装NGINX。然后将端口80公开给外部,并在容器启动时启动NGINX

二复杂例子

FROM maven:3.8.5-openjdk-17
ARG user=spring
ARG group=spring
ENV SPRING_HOME=/home/spring
RUN groupadd -g 1000 ${group} \&& useradd -d "$SPRING_HOME" -u 1000 -g 1000 -m -s /bin/bash ${user} \&& mkdir -p $SPRING_HOME/config \&& mkdir -p $SPRING_HOME/logs \&& chown -R ${user}:${group} $SPRING_HOME/config $SPRING_HOME/logs
# Railway 不支持使用 VOLUME, 本地需要构建时,取消下一行的注释
# VOLUME ["$SPRING_HOME/config", "$SPRING_HOME/logs"]
USER ${user}
WORKDIR $SPRING_HOME
COPY . .
#RUN mvn clean package
USER root
RUN mv target/ei-midjourney-2.5.4.jar ./app.jar
#RUN rm -rf target
EXPOSE 8080 9876
ENV JAVA_OPTS -XX:MaxRAMPercentage=85 -Djava.awt.headless=true -XX:+HeapDumpOnOutOfMemoryError \-XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -Xlog:gc:file=/home/spring/logs/gc.log \-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9876 -Dcom.sun.management.jmxremote.ssl=false \-Dcom.sun.management.jmxremote.authenticate=false -Dlogging.file.path=/home/spring/logs \-Dserver.port=8080 -Duser.timezone=Asia/Shanghai
ENTRYPOINT ["bash","-c","java $JAVA_OPTS -jar app.jar"]

1)FROM maven:3.8.5-openjdk-17
这一行指定了基础镜像,基于Maven 3.8.5和OpenJDK 17。这是构建这个容器的起点。
2)ARG user=spring 和 ARG group=spring
这些行定义了两个构建参数,user 和 group,它们用于定义容器内的用户和用户组。
3)ENV SPRING_HOME=/home/spring
这一行定义了一个环境变量 SPRING_HOME,它指定了Spring应用程序的安装目录。
4)RUN …
这些行包含了一系列命令,用于在容器中创建一个用户、创建目录并分配权限。具体来说,它们执行以下操作:
groupadd -g 1000 ${group}:创建一个名为 g r o u p 的用户组, G I D (组 I D )设置为 1000 。 u s e r a d d − d " {group} 的用户组,GID(组ID)设置为1000。 useradd -d " group的用户组,GID(组ID)设置为1000useraddd"SPRING_HOME" -u 1000 -g 1000 -m -s /bin/bash ${user}:创建一个用户 ${user},将其主目录设置为 S P R I N G H O M E , U I D (用户 I D )设置为 1000 ,所属用户组为上面创建的 SPRING_HOME,UID(用户ID)设置为1000,所属用户组为上面创建的 SPRINGHOMEUID(用户ID)设置为1000,所属用户组为上面创建的{group}。
mkdir -p $SPRING_HOME/config 和 mkdir -p S P R I N G H O M E / l o g s :创建两个目录, SPRING_HOME/logs:创建两个目录, SPRINGHOME/logs:创建两个目录,SPRING_HOME/config 和 $SPRING_HOME/logs,这些目录用于配置文件和日志。
chown -R u s e r : {user}: user:{group} $SPRING_HOME/config S P R I N G H O M E / l o g s :分配权限,确保 SPRING_HOME/logs:分配权限,确保 SPRINGHOME/logs:分配权限,确保{user}拥有这两个目录及其内容的访问权限。
USER ${user}
这一行切换容器的执行用户为 ${user},即Spring应用程序的运行用户。
5)WORKDIR $SPRING_HOME
这一行将容器的工作目录切换到 $SPRING_HOME,即Spring应用程序的安装目录。
6)COPY . .
这一行将当前构建上下文中的所有文件复制到容器的工作目录中。这通常包括了你的Spring Boot应用程序的源代码、配置文件等。
7)USER root
这一行切换回root用户,用于执行后续的命令。
8)RUN mv target/ei-midjourney-2.5.4.jar ./app.jar
这一行将应用程序的JAR文件从target目录移动到容器的根目录,并将其重命名为app.jar。这通常是Spring Boot应用程序的可执行JAR文件。
9)EXPOSE 8080 9876
这一行声明容器将会监听的网络端口,分别是8080和9876。
10)ENV JAVA_OPTS …
这一行设置了Java应用程序的环境变量 JAVA_OPTS,它包括了一系列Java虚拟机参数和应用程序配置参数,例如堆内存大小、垃圾回收日志、JMX远程监控等。
11)ENTRYPOINT [“bash”,“-c”,"java J A V A O P T S − j a r a p p . j a r " ] 这一行定义了容器启动时要执行的默认命令。它使用 b a s h 来执行 J a v a 命令,传递了 JAVA_OPTS -jar app.jar"] 这一行定义了容器启动时要执行的默认命令。它使用bash来执行Java命令,传递了 JAVAOPTSjarapp.jar"]这一行定义了容器启动时要执行的默认命令。它使用bash来执行Java命令,传递了JAVA_OPTS作为Java应用程序的参数,并启动app.jar,这将启动Spring Boot应用程序。
综合来说,这个Dockerfile用于创建一个包含Spring Boot应用程序的Docker容器,配置了用户、目录结构、环境变量和启动命令,使其能够运行Spring Boot应用程序,并在8080和9876端口上提供服务。容器内的Spring Boot应用程序将以${user}用户的身份运行。

技术原理三:构建镜像

使用Docker命令将其构建为可用的容器映像。我们可以使用以下命令构建一个名为“test-nginx”的镜像:

docker build -t ceshi .

技术原理四:运行容器

docker run -p 80:8080 -d --name ei-1.0  ei-midjourney-2:0.1

机器的端口是80映射的docker容器的端口8080,需要特别注意
–name 是为了区分容器,同一个镜像可以起不同的容器

相关文章:

制作docker镜像文件

技术主题 Docker作为一个开源的应用容器引擎,制作自己的docker镜像文件是使用docker的第一步,这样我们能够更好地管理应用程序。 技术原理 技术原理一:安装Docker 一般都是在官网下载特定的docker文件,然后安装即可 技术原理…...

JAVA 中 Socket 和 WebSocket 区别

区别: Socket: Socket是位于java.net包下的一个类,是 Java 提供的用于在客户端和服务器之间建立网络通信的底层套接字接口,用于传输层的网络通信。 WebSocket: WebSocket 是一种基于 TCP 协议的通信协议,建立在 Socket 的基础上&#xff0c…...

python 接收到一个接口的数据 是json格式 ,然后把其中键值对的一个值改掉 再返回给接口

先上代码 import json import requests # 发送请求获取接口数据 response requests.get(http://example.com/api/data) # 解析JSON数据 data json.loads(response.text) # 更改某个键值对的值 new_value new_value data[key_to_change] new_value # 将更改后…...

⌈C++11⌋实现一个简易计算器

原理: 数据栈:有数据就直接入栈 运算符栈:设遍历到当前的运算符位e,如果栈不为空,比较栈顶与当前运算符优先级e,当栈顶运算符优先级大于或者等于e的优先级,则出栈,并将两个数据栈的…...

面试算法45:二叉树最低层最左边的值

题目 如何在一棵二叉树中找出它最低层最左边节点的值?假设二叉树中最少有一个节点。例如,在如图7.5所示的二叉树中最低层最左边一个节点的值是5。 分析 可以用一个变量bottomLeft来保存每一层最左边的节点的值。在遍历二叉树时,每当遇到新…...

Could not find org.jetbrains.kotlin:kotlin-stdlib-jre7:1.5.21.

前两天下了一个demo,运行时候报了一个这样的错,特此记录一下。 先看下报的错。 Caused by: org.gradle.internal.resolve.ModuleVersionNotFoundException: Could not find org.jetbrains.kotlin:kotlin-stdlib-jre7:1.5.21. Searched in the following…...

LoRaWan之LoRaMAC 的快速入门指南

概述 本快速入门指南简要介绍了 LoRaMAC 层的重要操作。示例部分提供了不同设备类别的完整示例。 初始化 LoRaMAC层的初始化函数是LoRaMacInitialization( LoRaMacPrimitives_t *primitives, LoRaMacCallback_t *callbacks, LoRaMacRegion_t region )。该函数具有三个参数:L…...

中国教育企业出海 新兴技术助力抢占先机

继游戏、电商、短视频等领域轮番出海之后,国内教育企业纷纷开启了出海之路。近日发布的《2023年教育应用出海市场洞察》报告显示,在中国教育企业出海市场中,语言学习是最主要的赛道,但赛道竞争更为激烈。 报告指出,全…...

IntelliJ IDEA2023旗舰版和社区版下载安装教程(图解)

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...

【RxJava】map过程中各个Observable生命周期分析

map和flatMap的区别 首先说下map和flatMap的区别&#xff0c;防止有对RxJava还不够熟悉的小伙伴 map的Function指定如何将A转为BflatMap的Function则指定如何将Observable<A>转为Observable<B>map和flatMap最终的转换结果都是Observable<B>flatMap由于可以…...

vue 获取上一周和获取下一周的日期时间

效果图&#xff1a; 代码 <template><div><div style"padding: 20px 0;"><div style"margin-left: 10px; border-left: 5px solid #0079fe; font-size: 22px; font-weight: 600; padding-left: 10px">工作计划</div><di…...

线性代数 第四章 线性方程组

一、矩阵形式 经过初等行变换化为阶梯形矩阵。当&#xff0c;有解&#xff1b;当&#xff0c;有非零解。 有解&#xff0c;等价于 可由线性表示 克拉默法则&#xff1a;非齐次线性方程组中&#xff0c;系数行列式&#xff0c;则方程组有唯一解&#xff0c;且唯一解为 其中是…...

@DateTimeFormat和@JsonFormat注解

在日常开发中&#xff0c;有用到时间类型作为查询参数或者查询结果有时间参数的一般都会见过这两个注解。 DateTimeFormat(pattern “yyyy-MM-dd HH:mm:ss”)注解用于解析请求接口入参。将入参的字符串按照pattern设置的格式来转换成日期时间对象。 JsonFormat(timezone “G…...

做抖音短视频会经历哪些阶段?

今天来聊聊那些在抖音做大的老板&#xff0c;从开始到后期经历的四个阶段&#xff0c;以及每个阶段的工作重心 1、0—1的阶段 0—1的起步阶段是整个阶段最有难度的一环&#xff0c;很多人对0到1的认知是有错误的&#xff0c;以为爆过几条视频就已经进阶了 想要实现0-1的突破…...

【Mquant】2、量化平台的选择

文章目录 一、选择因素二、常见的量化平台三、为什么选择VeighNa&#xff1f;四、参考 一、选择因素 功能和工具集&#xff1a;量化平台应该提供丰富的功能和工具集&#xff0c;包括数据分析、策略回测、实时交易等。不同的平台可能有不同的特点和优势&#xff0c;可以根据自己…...

iPhone手机如何恢复删除的视频?整理了3个好用方法!

在日常生活中&#xff0c;我们会把各种各样的视频存放在手机里。这些视频记录着我们生活中的点点滴滴&#xff0c;每一帧都承载着珍贵的记忆。但如果我们不小心将这些重要视频删除了该怎么办&#xff1f;如何恢复删除的视频&#xff1f;本文将以iPhone手机为例子&#xff0c;教…...

全网最全的RDMA拥塞控制入门基础教程

RDMA-CC&#xff08;全网最全的RDMA拥塞控制入门基础教程&#xff09; 文章目录 RDMA-CC&#xff08;全网最全的RDMA拥塞控制入门基础教程&#xff09;DMARDMARDMA举例RDMA优势RDMA的硬件实现方法RDMA基本术语FabricCA&#xff08;Channel Adapter&#xff09;Verbs 核心概念Me…...

分布式消息队列:RabbitMQ(1)

目录 一:中间件 二:分布式消息队列 2.1:是消息队列 2.1.1:消息队列的优势 2.1.1.1:异步处理化 2.1.1.2:削峰填谷 2.2:分布式消息队列 2.2.1:分布式消息队列的优势 2.2.1.1:数据的持久化 2.2.1.2:可扩展性 2.2.1.3:应用解耦 2.2.1.4:发送订阅 2.2.2:分布式消息队列…...

Redis集群脑裂

1. 概述 Redis 集群脑裂&#xff08;Cluster Split Brain&#xff09;是指在 Redis 集群中&#xff0c;由于网络分区或通信问题&#xff0c;导致集群中的节点无法相互通信&#xff0c;最终导致集群内部发生分裂&#xff0c;出现多个子集群&#xff0c;每个子集群认为自己是有效…...

GEE教程——随机样本点添加经纬度信息

简介: 有没有办法在绘制散点图后将样本的坐标信息(纬度/经度)添加到.CSV表格数据中? 这里我们很多时候我们需要加载样本点的基本信息作为属性,本教程主要的目的就是我们选取一个研究区,然后产生随机样本点,然后利用坐标函数,进行样本点的获取经纬度,然后通过循环注意…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...