制作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,容器,运维)