企业门户网站建设 验收,怎样可以提升自己的网站,网站建设需求计划,WordPress卡密充值怎么用1、Dockerfile
1.1、什么是Dockerfile Dockerfile是自动构建docker镜像的配置文件#xff0c;将镜像构建过程通过指令的方式定义在Dockerfile中。配合docker build命令行可以实现自动化的Docker镜像的构建。
1.2、Dockerfile语法解析 我们在学习一门语言或文档语法的时候将镜像构建过程通过指令的方式定义在Dockerfile中。配合docker build命令行可以实现自动化的Docker镜像的构建。
1.2、Dockerfile语法解析 我们在学习一门语言或文档语法的时候最快的学习方式就是看别人是怎么写的。这里这个“「别人」”是谁就很重要跟着臭棋篓子下棋越下越臭。 所以学习Dockerfile语法我们有必要找一个模范大家可以去Dockerhub看一下那些开源软件官方提供的镜像都可以找到对应的Dockerfile看看别人是怎么写的。我们就以上文中的nginx:1.20.2版本docker镜像的Dockerfile 官方提供的我们来逐行解析它的语法及构建过程。本文中涉及的脚本都可以在github:docker-nginx官方渠道获取。
1.3、Dockerfile命令
FROM 一般我们构建镜像的都需要一个基础的linux操作系统的发行版镜像并且在此基础上我们构建自己的镜像。 所以FROM指令的作用就是指定基础镜像nginx这里使用的基础linux镜像是debian:bullseye-slim。其中debian:bullseye是debian的linux发行本操作系统的一个版本版本名称叫做bullseye。slim通常是指这个镜像是该发行版本中的最小安装版本因为我们构建完成的镜像是要在后续的持续集成过程中以及仓库和docker服务器之间网络传播的所以尽可能让镜像的构建结果size最小化。「基础镜像的选择要着重考虑size的大小满足linux基本功能及你的程序运行的前提下越小越好」。
FROM debian:bullseye-slim
LABEL LABEL用于给当前镜像添加一些描述、解释性信息如当前镜像的维护人及联系方式等信息。用键值对的方式自定义一行可以定义多个。
LABEL keyvalue keyvalue keyvalue ...
maintainer、description 也可以定义多行如maintainer维护人信息description镜像描述信息。如果描述信息一行写不下可以用“\”换行。
LABEL maintainerNGINX Docker Maintainers
LABEL descriptionThis is a Docker image \
for nginx 1.20.2. Dockerfile语法中有一个指令叫做MAINTAINER用于描述该镜像的维护人信息但是现在已经不建议使用了统一使用LABEL。
ENV ENV的作用是设置环境变量该环境变量设置之后可以在shell脚本中使用。 使用方法如${NGINX_VERSION}。学过JAVA的同学想想你的JAVA_HOME环境变量怎么设置的以及怎么使用的ENV是同样的道理。只不过放到docker这里语法发生了变化而已语法格式:ENV 环境变量KEY 环境变量Value。
ENV NGINX_VERSION 1.20.2
ENV NJS_VERSION 0.7.0
ENV PKG_RELEASE 1~bullseye
RUN RUN指令的作用就是执行linux的shell脚本通过下图可以看到在shell脚本中可以使用通过ENV定义的环境变量。 对于nginx镜像而言RUN指令的作用就是执行一系列shell命令行来(脚本)完成nginx的安装。所以说要想掌握RUN指令的重点不在于RUN指令本身关键在于
你会不会手动安装nginx你会不会linux的shell脚本语法你能不能把nginx的安装过程写成shell脚本 如果上面三个问题的答案都是肯定的用RUN指令即可执行shell脚本完成软件的安装。这也是Dockerfile编写内容的核心所在linux shell并不是本文要为大家说明的内容。 COPY COPY指令的作用是将本地文件(执行镜像构建所在的服务器)拷贝到镜像文件中。 语法是COPY 本地文件路径:镜像文件路径镜像文件路径也是容器运行时文件系统的路径。
COPY docker-entrypoint.sh /
COPY 10-listen-on-ipv6-by-default.sh /docker-entrypoint.d
COPY 20-envsubst-on-templates.sh /docker-entrypoint.d
COPY 30-tune-worker-processes.sh /docker-entrypoint.d 如果本地文件路径只有文件名就是表示文件和Dockerfile在同一个目录下相对路径语法。即下面的这些文件在同一个目录这些文件在我上文给出的nginx官方Dockerfile连接中都可以看到。 注意如果本地文件路径是目录则只是拷贝目录内部文件到镜像中而不是拷贝目录。
WORKDIR 另外可以使用WORKDIR 指令为 Dockerfile 中跟随它的任何 RUN、CMD、ENTRYPOINT、COPY、ADD 指令设置本地工作目录。 这样上文提到的相对路径就是相对WORKDIR指定路径的相对路径。「但是通常情况下不建议使用WORKDIR因为很难保证执行构建的开发者工作主机的工作路径和Dockerfile编写者的工作路径都是一致。」
WORKDIR /root
EXPOSE
Docker 容器在运行时暴漏指定的网络端口可用于容器端口映射默认协议是 TCP。格式如下
EXPOSE 端口号
EXPOSE 端口号/协议 将容器端口暴露出去后可以与宿主机的端口建立映射关系这样可以通过访问宿主机的端口来访问容器内部的服务。比如同时在 TCP、UDP 上暴露容器的80端口。
EXPOSE 80/tcp
EXPOSE 80/udp
STOPSIGNAL 这个指令笔者也并不常用我查询了docker-nginx在github上的issues里面给出的答案是之所以加上STOPSIGNAL信号的目的是避免docker容器停止后nginx服务不能正确终止造成僵尸进程的存在。
STOPSIGNAL SIGQUIT
CMD CMD指令也是用来执行linux命令或脚本这一点和RUN指令是一致的。二者的区别在于
RUN指令实在镜像构建的时候执行即docker bulid时候执行。CMD指令是在执行docker run指令时被执行也就是在创建容器时执行 也正因为指令的执行期不同RUN命名执行的写入操作被写入到镜像层。CMD指令执行结果包含写入操作被写入到容器层。可以参考我之前文章《镜像分层原理》学习理解。 所以CMD和ENTRYPOINT 指令有点相似都是在创建容器时运行。 需要注意的是「一旦Dockerfile中包含ENTRYPOINT指令CMD指令就作为ENTRYPOINT指定的脚本的参数存在」。
参考下文格式语法。
CMD包含三种格式
第一种为ENTRYPOINT指定的脚本传参上文中的ENTRYPOINT脚本最后一行的exec $就是在执行CMD传递的命令及参数。来完成nginx服务的启动。**这种用法是各官方Dockerfile常用的做法(如:nginx、redis)**就是在ENTRYPOINT指定的脚本中做一些配置准备工作然后在ENTRYPOINT脚本的最后一行通过exec $调用CMD命令进行容器服务的启动。
CMD [nginx, -g, daemon off;]
第二种 执行一个命令或shell脚本可以传参注意是双引号。与第一种格式语法是一样的只是没有ENTRYPOINT指定脚本所以不作为ENTRYPOINT指定脚本的参数存在。
CMD [executable,param1,param2]
第三种为普通的执行shell脚本的语法如执行echo This is a test. | wc -cshell命令行。笔者说「在Dockerfile中这种方法不要用没必要知道为什么」。
CMD echo This is a test. | wc -c
ENTRYPOINT 一个Dockerfile中如果定义多个ENTRYPOINT只有最后一条ENTRYPOINT生效并且每次启动docker容器都会执行ENTRYPOINT指定的脚本。 对于nginx:1.20.2而言/docker-entrypoint.sh脚本中定义了nginx配置检查及nginx服务的启动指令。所以通常情况下「ENTRYPOINT指定的脚本通常都是镜像内核心服务的启动脚本」。
ENTRYPOINT [/docker-entrypoint.sh] 这个脚本中最后执行了nginx服务启动需要配合CMD命令完成参考下文的CMD命令。
1.4、docker操作
具体可以参考3-docker基础操作命令 · linux运维 · 看云 1.生成镜像
# docker build -t springboot-docker . # docker build -f ./Dockerfile -t springboot-docker . # docker build -f ./Dockerfile -t springboot-docker:0.1 .
[rootip-100 dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE springboot-docker 0.1 54dcc83613d7 About a minute ago 682MB springboot-docker latest 54dcc83613d7 About a minute ago 682MB # 注意 # 1命令是在 Dockerfile 所在目录执行 # 2一定不能忘了后面的. 此处的 springboot-docker 是实际生成的镜像名
--tag -t: 镜像的名字及标签通常 name:tag 或者 name 格式可以在一次构建中为一个镜像设置多个标签。-f :指定要使用的Dockerfile路径
参考 https://www.runoob.com/docker/docker-build-command.html
2.运行镜像
-d : 表示容器在后台运行--name : 为容器起一个名字-p : 端口映射格式为宿主机端口:容器端口上文中含义是将容器中的端口80映射到宿主机的端口80对外提供访问服务。
最后一个字段为镜像名称
# docker run --name springboot-docker01 -d -p 8080:8080 springboot-docker
[rootip-100 dockerfile]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 65bb62a54e55 springboot-docker java -Djava.securit… 33 seconds ago Up 31 seconds 0.0.0.0:8080-8080/tcp, :::8080-8080/tcp springboot-docker01
宿主机浏览器 http://192.168.192.128:8080/getIpAndPort 3.查看启动日志
docker logs xxx docker logs -f springboot-docker01 2、Dockerfile多阶段构建
2.1、使用Dockerfile的示例1
FROM openjdk:8-jdk-alpine as build
WORKDIR /workspace/appCOPY mvnw .
COPY .mvn .mvn
COPY pom.xml .
COPY src srcRUN ./mvnw install -DskipTests
RUN mkdir -p target/dependency (cd target/dependency; jar -xf ../*.jar)FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG DEPENDENCY/workspace/app/target/dependency
COPY --frombuild ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY --frombuild ${DEPENDENCY}/META-INF /app/META-INF
COPY --frombuild ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT [java,-cp,app:app/lib/*,hello.Application]
2.2、使用Dockerfile的示例2
在项目根目录创建Dockerfile:
# 拉取编译环境
FROM maven:3.6.1 as builder#拷贝源码到固定的目录注意前面有个 .
COPY . /project# 切换到源码目录
WORKDIR /project# 使用maven进行编译
RUN mvn clean package -Dmaven.test.skiptrue# 拉取运行环境这个镜像打包出的镜像比较小如需要可换成oracle的jre
FROM fabric8/java-alpine-openjdk8-jre# 从编译好的镜像中将jar拷贝到运行时容器
COPY --frombuilder /project/target/your-jar-name.jar /# 容器启动时执行的命令这里可加jvm参数
ENTRYPOINT [java,-jar,/mqtt-rule-engine.jar]# 开放端口根据自己的配置进行开放
EXPOSE 8080
2.3、使用Dockerfile的示例3
# First stage: complete build environment
FROM maven:3.5.0-jdk-8-alpine AS builder# add pom.xml and source code
ADD ./pom.xml pom.xml
ADD ./src src/# package jar
RUN mvn clean package# Second stage: minimal runtime environment
From openjdk:8-jre-alpine# copy jar from the first stage
COPY --frombuilder target/my-app-1.0-SNAPSHOT.jar my-app-1.0-SNAPSHOT.jarEXPOSE 8080CMD [java, -jar, my-app-1.0-SNAPSHOT.jar]
FROM maven:3.6.3-openjdk-8 AS builder# AS builder 起别名RUN mkdir /build
# 创建临时文件ADD src /build/src
#将 src目录复制到临时目录ADD pom.xml /build
# 将 pom文件复制到临时目录RUN cd /build mvn -B -ntp package
# 打包FROM adoptopenjdk/openjdk8:alpine-jre
# 获取jreCOPY --frombuilder /build/target/ems-0.0.1-SNAPSHOT.jar /ems.jar
#从标记点 拷贝jar包 并改名CMD [java, -jar, /ems.jar]# 声明运行方式 在项目根目录执行下面命令
docker build -t name:tag .
3、插件打包
3.1、spring-boot-maven-plugin插件打包 SpringBoot自己内置了一个Docker镜像打包工具在spring-boot-starter-parent中我们无需多余的设置。 优点不需要写DockerFileSpring建议的安全、内存、性能等问题都不需要管。 3.2、jib-maven-plugin插件 来自Google的一款打包插件。 优点不需要本地安装Docker也不需要写DockerFileJib 可以直接推送到指定的Docker仓库。 3.3、dockerfle-maven-plugin插件 需要写DockerFile也需要本地Docker环境但是恰恰是最好用的最稳定的最自由把控的。 优点稳定不受网络限制DockerFile自己写自由度很高想怎么改怎么改个人推荐这个。 插件打包具体例子可参考Java(SpringBoot)项目打包(构建)成Docker镜像的几种方式-腾讯云开发者社区-腾讯云
4、参考
docker编译Dockerfile自动化部署springboot项目的jar包_dockerfile编译jar包_xixiyuguang的博客-CSDN博客
2021年 最新 多阶段构建dockerfile实现java源码编译打jar包并做成镜像-阿里云开发者社区
Java(SpringBoot)项目打包(构建)成Docker镜像的几种方式-腾讯云开发者社区-腾讯云
在docker中编译、打包、部署spring boot项目_docker 部署时编译_csdn_meng的博客-CSDN博客