制作docker镜像文件

news/2024/6/3 17:54:41 标签: docker, 容器, 运维

技术主题

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

技术原理

技术原理一:安装Docker

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

dockerfile_5">技术原理二:编写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 是为了区分容器,同一个镜像可以起不同的容器


http://www.niftyadmin.cn/n/5152318.html

相关文章

Redis系统学习(高级篇)-Redis持久化-RDB方式

目录 一、RDB是什么? 二、RDB的执行时机 三、RDB的其他命令 四、RDB的执行原理 五、RDB的优缺点 一、RDB是什么? RDB全称叫Redis Database Backup file(Redis数据备份文件) ,也叫Redis数据快照,就是将…

【多媒体文件格式】AVI、WAV、RIFF

AVI、RIFF AVI:Audio/Video Interleaved(音频视频交织/交错),用于采集、编辑、播放的RIFF文件。由Microsoft公司1992年11月推出,是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式,原先…

提升ChatGPT答案质量和准确性的方法Prompt engineering实用的prompt灵感和技巧

文章目录 1. 实用的prompt灵感和技巧小技巧常用prompt保存到输入法中普通promptprompt通用公式保存到输入法快捷指令中尝试用英语去写prompt沉浸式翻译软件3. 补充1. 实用的prompt灵感和技巧 解释***,并且给出暗喻/隐喻/类比(解释术语、专业名称,用一个词或短语指出常见的一…

linux 查看当前目录下每个文件夹大小

要在 Linux 中查看当前目录下每个文件夹的大小,可以使用 du 命令(磁盘使用情况)结合其他一些选项。下面是几个常用的命令示例: 显示当前目录下每个文件夹的大小——只显示一层文件夹: du -h --max-depth1该命令会以人…

ubuntu 分区 方案

ubuntu 分区 方案 自动分区啥样子的? 手动分区 需要怎么操作? 注意点是啥? swap分区 要和 内存大小 差不多 安装ubuntu系统时硬盘分区方案 硬盘分区概述 一块硬盘最多可以分4个主分区,主分区之外的成为扩展分区。硬盘可以没有…

0006Java安卓程序设计-ssm基于Android的校园二手商品交易平台

文章目录 **摘** **要****目** **录**系统设计开发环境 编程技术交流、源码分享、模板分享、网课教程 🐧裙:776871563 摘 要 随着毕业季的来临以及当代大学生的消费力购买力的不断增强,我们的寝室中囤积了很多二手商品,有很多是…

DeepSORT多目标跟踪——算法流程与源码解析

一、目标检测与目标追踪 1. 目标检测 在目标检测任务中,主要目标是识别图像或视频帧中存在的物体的位置和类别信息。这意味着目标检测算法需要定位物体的边界框(Bounding Box)并确定每个边界框内的物体属于哪个类别(如人、汽车、…

Vue H5页面长按保存为图片

安装依赖&#xff1a;npm install html2canvas -d <template><div class"index"><div id"captureId" class"capture" v-show"firstFlag"><ul><li>1</li><li>2</li><li>3<…