
🎉🎉欢迎来到我的CSDN主页!🎉🎉
🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚
🌟推荐给大家我的博客专栏《Docker之Dockerfile构建镜像》。🎯🎯
🎁如果感觉还不错的话请给我关注加三连吧!🎁🎁

前言
在上一期有关Docker的博客分享中我们学习到了Docker的一些数据卷和数据卷容器的一些基本的使用以及概念性的学习。本次的博客给大家带来的是有关Docker中的Dockerfile的学习。
一、什么是Dockerfile构建镜像
1. 基本概述
Dockerfile是一个文本文件,其中包含一组用于自动化Docker镜像构建的指令和配置。通过编写Dockerfile,用户可以定义镜像的内容、环境和运行时配置。构建过程基于这个Dockerfile文件,并通过Docker引擎执行一系列指令来生成最终的Docker镜像。
2. Dockerfile指令和它们的作用:
2.1 From :指定基础镜像,构建新镜像的起点。
bash
FROM ubuntu:20.04
2.2 MAINTAINER: 标识镜像的维护者。
bash
MAINTAINER Your Name <your.email@example.com>
2.3 RUN: 在镜像中执行命令,用于安装软件包、更新系统等。
bash
RUN apt-get update && apt-get install -y nginx
2.4 COPY/ADD: 将文件或目录从构建上下文复制到镜像中。
bash
COPY ./app /app
2.5 WORKDIR: 设置工作目录,后续的命令将在该目录下执行
bash
WORKDIR /app
2.6 EXPOSE: 声明容器运行时要监听的端口。
bash
EXPOSE 80
2.7 CMD: 提供容器默认的执行命令,可以被docker run时的参数覆盖。
bash
CMD ["nginx", "-g", "daemon off;"]
2.8 ENTRYPOINT: 设置容器启动时执行的命令,不可被docker run时的参数覆盖。
bash
ENTRYPOINT: 设置容器启动时执行的命令,不可被docker run时的参数覆盖。
简单示例
通过编写Dockerfile,用户可以定义从基础镜像到最终镜像的整个构建过程,确保应用程序在Docker容器中正确运行。构建镜像的命令通常是使用
docker build
,并在构建上下文中包含Dockerfile文件。例如:
bash
docker build -t my_custom_image:tag .
上述命令将使用当前目录的Dockerfile构建一个名为
my_custom_image
的Docker镜像,并指定了一个标签tag
。
3. 基本结构
Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
|------------|-----------------------------------------------------------------------|
| 部分 | 命令 |
| 基础镜像信息 | FROM |
| 维护者信息 | MAINTAINER |
| 镜像操作指令 | RUN 、 ENV 、 COPY 、 ADD 、 EXPOSE 、 WORKDIR 、 ONBUILD 、 USER 、 VOLUME 等 |
| 容器启动时执行指 令 | CMD 、 ENTRYPOINT |
[Dockerfile的基本结构]
图解说明

二、示例使用及说明、
1. 构建镜像文件
接下来为大家讲解如何去根据需求构建一个自定义的镜像文件供自己使用,构建镜像时必须得有一个基础的镜像。我们这里使用的是Centtos(原本没有携带东西),我们输入指令
vim Dockerfile文件进行新建及编辑
bash
vim Dockerfile
输入的内容如下
bash
FROM centos
MAINTAINER 2081718134@qq.com
WORKDIR /test
COPY spring.jar /test
#1.指定基础镜像,并且必须是第一条指令
FROM centos:latest
#2.指明该镜像的作者和其电子邮件
MAINTAINER xx "xx@qq.com"
#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR /usr/local/java
#4.一个复制命令,把jdk安装文件复制到镜像中,注意:jdk*.tar.gz使用的是相对路径
COPY spring.jar /test
输入完成之后按esc按键,输入;wq保存并且退出。接下来是我们进行构建镜像。输入指令:docker build -t spring:v1 .


我们然后我们进行查看我们刚才构建的镜像文件。
输入指令:docker images

我们进入我们的镜像文件的容器中
输入命令:docker run -it spring:v1

我们可以输入指令:ls查看我们文件下所存在的文件

我们运行这个jar包文件,输入指令:java -jar spring.jar

无法运行的原因是因为我们使用的数基础镜像centos没有启动jar包的jdk,因此启动jar该需要我们下载所需的jdk文件。
2. 镜像运行
接下来我们需要去下载我们的jdk环境变量,我们输入指令:vim /etc/profile进行配置环境变量

配置jdk环境变量内容
bash
#java environment
export JAVA_HOME=/javaxl/jdk1.8.0_151(jdk解压路径)
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
这是我们之前在centos中安装时的步骤,在Docker中不一样。
bash
ADD jdk-8u221-linux-x64.tar.gz /test
ENV JAVA_HOME=/test/jdk1.8.0_221
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
我们在我们的镜像配置文件中添加上述的内容在后面,但首先我们先要导入我们的jdk的压缩包和jre的压缩包。

我们对其镜像文件Dockerfile进行编辑

我们将镜像文件重新编译一遍

我们进入该镜像文件中进行查看文件

接下来是检查我们安装的jdk是否生效

接下下我们可以测试运行spring.jar包

我们接下来进行运行项目,我们运行时不是使用run因为我们是等容器打开后再运行因此使用的cmd命令。
bash
CMD ["java -jar spring.jar"]

我们在重新构建一个镜像文件

我们在运行这个文件

我们重新编辑一下我们的Dockerfile文件,重新构建一个镜像文件并且运行


3. 镜像优化
在我们的开发过程中jdk是我们必不可少的,但是在我们的运行项目中所需的是jre,因此接下来的操作就是将jdk修改为jre进行一系列的优化。下面我们首先修改Dockerfile文件内容,然后构建镜像文件
bash
FROM centos
MAINTAINER 2081718134@qq.com
WORKDIR /test
COPY spring.jar /test
ADD jre-8u391-linux-x64.tar.gz /test
ENV JAVA_HOME=/test/jre1.8.0_391
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
CMD java -jar spring.jar



我们接下来就是访问项目,首先清除掉所有的容器,然后创建对应的容器进行运行使用,最后再网页进行访问。


我们接下来的操作时将我们的镜像文件上传到我们的仓库之中,但是默认的仓库是docker.io/library/spring的官网仓库,需要我们去注册。但是我们可以使用阿里的仓库进行上传,上传快还方便。

我们选择个人版示例进行新建对其进行一系列的操作。我们进行一系列操作后的界面如下

我们使用前需要登陆我们的阿里账号

我我们直接执行该命令,然后在输入我们的之前设置的密码即可。
我们对其创建一个命名空间



我们新建完命名空间之后我们还要去新建一个仓库,用于我们上传镜像文件。


我们创建好仓库之后,镜像版本中没有任何东西,需要我们进行手动的推送上去。 推送的操作网页上有

给我们要上传的镜像取一个别名。


我对其要上传的镜像修改为我们阿里的仓库地址

上述图片是修改上传的网址路径,我们在查看我们的镜像。

我们在将其这个进行进行推送到我们的仓库中

我们可以在我们的仓库中查看我们的镜像

下载镜像输入指令
docker pull +镜像名+版本即可
🎉🎉本期的博客分享到此结束🎉🎉
📚📚各位老铁慢慢消化📚📚
🎯🎯下期博客博主会带来新货🎯🎯
🎁三连加关注,阅读不迷路 !🎁
