制作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)设置为1000。useradd−d"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,所属用户组为上面创建的 SPRINGHOME,UID(用户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命令,传递了 JAVAOPTS−jarapp.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 的基础上,…...
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的区别,防止有对RxJava还不够熟悉的小伙伴 map的Function指定如何将A转为BflatMap的Function则指定如何将Observable<A>转为Observable<B>map和flatMap最终的转换结果都是Observable<B>flatMap由于可以…...
vue 获取上一周和获取下一周的日期时间
效果图: 代码 <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…...
线性代数 第四章 线性方程组
一、矩阵形式 经过初等行变换化为阶梯形矩阵。当,有解;当,有非零解。 有解,等价于 可由线性表示 克拉默法则:非齐次线性方程组中,系数行列式,则方程组有唯一解,且唯一解为 其中是…...
@DateTimeFormat和@JsonFormat注解
在日常开发中,有用到时间类型作为查询参数或者查询结果有时间参数的一般都会见过这两个注解。 DateTimeFormat(pattern “yyyy-MM-dd HH:mm:ss”)注解用于解析请求接口入参。将入参的字符串按照pattern设置的格式来转换成日期时间对象。 JsonFormat(timezone “G…...
做抖音短视频会经历哪些阶段?
今天来聊聊那些在抖音做大的老板,从开始到后期经历的四个阶段,以及每个阶段的工作重心 1、0—1的阶段 0—1的起步阶段是整个阶段最有难度的一环,很多人对0到1的认知是有错误的,以为爆过几条视频就已经进阶了 想要实现0-1的突破…...
【Mquant】2、量化平台的选择
文章目录 一、选择因素二、常见的量化平台三、为什么选择VeighNa?四、参考 一、选择因素 功能和工具集:量化平台应该提供丰富的功能和工具集,包括数据分析、策略回测、实时交易等。不同的平台可能有不同的特点和优势,可以根据自己…...
iPhone手机如何恢复删除的视频?整理了3个好用方法!
在日常生活中,我们会把各种各样的视频存放在手机里。这些视频记录着我们生活中的点点滴滴,每一帧都承载着珍贵的记忆。但如果我们不小心将这些重要视频删除了该怎么办?如何恢复删除的视频?本文将以iPhone手机为例子,教…...
全网最全的RDMA拥塞控制入门基础教程
RDMA-CC(全网最全的RDMA拥塞控制入门基础教程) 文章目录 RDMA-CC(全网最全的RDMA拥塞控制入门基础教程)DMARDMARDMA举例RDMA优势RDMA的硬件实现方法RDMA基本术语FabricCA(Channel Adapter)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 集群脑裂(Cluster Split Brain)是指在 Redis 集群中,由于网络分区或通信问题,导致集群中的节点无法相互通信,最终导致集群内部发生分裂,出现多个子集群,每个子集群认为自己是有效…...
GEE教程——随机样本点添加经纬度信息
简介: 有没有办法在绘制散点图后将样本的坐标信息(纬度/经度)添加到.CSV表格数据中? 这里我们很多时候我们需要加载样本点的基本信息作为属性,本教程主要的目的就是我们选取一个研究区,然后产生随机样本点,然后利用坐标函数,进行样本点的获取经纬度,然后通过循环注意…...
人机协作新范式:盘点2026年全网爆红的AI论文写作工具
一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具横空出世,覆盖选题构思、文献综述、数据整理、格式排版等全流程,真正帮你高效搞定论文,告别熬夜与焦虑。 一、全流程王者:一站式搞定论文…...
Youtu-VL-4B-Instruct-GGUF模型Git版本管理与协作开发教程
Youtu-VL-4B-Instruct-GGUF模型Git版本管理与协作开发教程 如果你和团队正在折腾像Youtu-VL-4B-Instruct-GGUF这样的多模态大模型项目,八成遇到过这些头疼事:模型权重文件动辄几十GB,用Git直接传直接卡死;同事改了一段推理代码&a…...
Django Admin 后台让邮箱、科目必填 + 下拉选择
Django Admin 自定义用户必填字段 下拉科目选择在使用 Django 自定义用户模型时,默认邮箱是非必填,科目容易输入错误,本文实现:邮箱必填科目从下拉框选择(语文、数学、英语、政治、历史、地理、生物、物理、化学&…...
MacBook Touch Bar个性化:从效率痛点到指尖革命的全面解决方案
MacBook Touch Bar个性化:从效率痛点到指尖革命的全面解决方案 【免费下载链接】pock Widgets manager for MacBook Touch Bar 项目地址: https://gitcode.com/gh_mirrors/po/pock 痛点诊断:被低估的Touch Bar潜能 当你每天打开MacBook时&#x…...
基于 ZOH 离散化与增量 PID 的四旋翼无人机轨迹跟踪控制研究,MATLAB代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...
揭秘XHS-Downloader:如何实现小红书内容高效采集与无水印下载
揭秘XHS-Downloader:如何实现小红书内容高效采集与无水印下载 【免费下载链接】XHS-Downloader 免费;轻量;开源,基于 AIOHTTP 模块实现的小红书图文/视频作品采集工具 项目地址: https://gitcode.com/gh_mirrors/xh/XHS-Downloa…...
SiameseUIE中文信息抽取:Matlab科学计算集成
SiameseUIE中文信息抽取:Matlab科学计算集成 如果你是一位科研人员,每天面对海量的文献、实验报告和调研数据,是不是经常觉得手动整理信息太费时间了?特别是当需要从一大段文字里找出特定的人名、机构、关系或者事件时࿰…...
“Token”有了中文名:词元
作者|周雅3月23日,在中国发展高层论坛2026年年会上,国家数据局局长刘烈宏正式给出Token 的中文名——「词元」。如果只把这件事理解为一次术语翻译,可能会低估它。更值得注意的是,刘烈宏同时给了「词元」一个更明确的产…...
NFC标签技术演进与主流厂商产品选型指南
1. NFC标签技术演进:从Type 1到Type 5的进化之路 NFC标签技术的发展就像智能手机的迭代升级,每一代都在解决前代的痛点。最早的Type 1标签诞生时,就像功能机时代的诺基亚,只能存储96字节数据,读写速度仅有106kbps。我曾…...
别再傻傻分不清了!5分钟搞懂差分信号、共模与差模干扰的本质区别
差分信号与干扰类型:从原理到实战的深度解析 刚接触电路设计时,我也曾被各种"模"搞得晕头转向——差分信号是不是自带抗干扰光环?共模电感能不能随便往电路里塞?为什么同样的滤波器用在某组信号上效果显著,换…...
