当前位置: 首页 > 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表格数据中? 这里我们很多时候我们需要加载样本点的基本信息作为属性,本教程主要的目的就是我们选取一个研究区,然后产生随机样本点,然后利用坐标函数,进行样本点的获取经纬度,然后通过循环注意…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...