Docker镜像构建&优化及上传方式

 更新时间:2026年06月16日 15:41:59   作者:ChatYU.  
这篇文章主要介绍了Docker镜像构建&优化及上传方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

Dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像,另外,使

用 Dockerfile 去构建镜像好比使用 pom 去构建 maven 项目一样,有异曲同工之妙

一.Dockerfile镜像构建

1.Dockerfile基本结构

Dockerfile 是一个包含一组指令的文本文件,用于告诉 Docker 如何构建一个镜像

Dockerfile一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令 

基础镜像指令 (FROM): 指定构建过程中使用的基础镜像。

FROM centos:latest

维护者信息指令 (MAINTAINER) [已过时]: 指定镜像的作者和联系方式。现在更推荐使用标签方式,例如

MAINTAINER Your Name <your-email@example.com>

工作目录指令 (WORKDIR): 设置后续指令的工作目录。

WORKDIR /app

复制文件指令 (COPY): 将本地文件复制到镜像中的指定路径。

COPY . /app

添加文件指令 (ADD):类似于 COPY,但支持更多功能,例如远程文件、URL 自动解压缩等。

ADD https://example.com/file.tar.gz /app/

运行命令指令 (RUN): 在镜像中执行命令,通常用于安装软件包、设置环境等。

RUN apt-get update && apt-get install -y python3

暴露端口指令 (EXPOSE): 声明容器将在运行时监听的端口。

EXPOSE 80

环境变量指令 (ENV): 设置环境变量,用于配置容器的运行时行为。

ENV DATABASE_URL="mysql://user:password@localhost/db"

容器启动命令指令 (CMD or ENTRYPOINT): 定义容器启动时执行的默认命令。

CMD ["python", "app.py"]

或者使用 ENTRYPOINT

ENTRYPOINT ["python", "app.py"]

标签指令 (LABEL): 添加元数据标签到镜像,例如版本信息、作者、描述等。

LABEL version="1.0" \ description="My custom image" \ maintainer="your-email@example.com"

2.基础镜像构建

1.编写基础镜像文件

首先创建一个工作目录文件夹并进入

mkdir software
cd software

在当前目录下编写dockerfile文件(注:名字不能更改,当前操作为编写并创建dockerfile文件)

vim dockerfile

将以下基础信息编写到dockerfile中

From centos
MAINTAINER 2187@qq.com
WORKDIR /test
COPY spring.jar /test

命令详解:From为基础镜像,MAINTAINER为联系者信息,后面的2187...可自行更改,WORKDIR为工作目录,COPY spring.jar /test是将当前目录下的spring.jar(已开发完的项目模块)复制到镜像中 

2.根据当前路径的Dockerfile文件构建镜像

docker build -t spring:v1 .

解析:

  • docker build 镜像构建
  • -t spring 为当前镜像命名(spring)
  • v1 版本号
  • 当前路径

当出现Building Finished时说明构建成功了 

创建并运行新的容器

docker run -it 容器名:版本号

示例

docker run -it spring:v1

3.构建携带JDK镜像

将jdk上传到当前工作目录

将以下命令替换Dockerfile文件的内容

From centos
MAINTAINER 2187@qq.com
WORKDIR /test
COPY spring.jar /test
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

然后重新执行命令构建镜像

docker build -t spring:v2 .

创建并运行容器

docker run -it spring:v2

验证jdk是否安装成功,在当前容器中执行以下命令

echo $JAVA_HOME

出现jdk路径时说明安装成功

4.构建一个创建后自动运行项目的镜像

和上面的操作一样,将Dockerfile文件进行更改,构建镜像然后创建运行容器,当容器运行后,容器中的项目也会跟着运行,不过这里需要注意的是spring.jar为当前项目,根据实际情况替换为自己的项目,

在运行创建新的容器时记得要将容器名进行更改防止重名

From centos
MAINTAINER 2187@qq.com
WORKDIR /test
COPY spring.jar /test
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
CMD  java -jar spring.jar

二.镜像优化

优化思路

1.在上面的构建镜像时可以看到,每一个模块都需要去携带JDK,但是由于jdk的空间占用量过于庞大,当我们的模块数量变多时,对于我们的服务器资源消耗也是巨大的,所以我们采取另一种方案,对于JDK而言,我们更多的是能利用到它是在代码编写方面,但是在服务器中我们并不需要对其进行一个代码编写,而我们运行项目时可以只需要用到JRE,JRE相对于JDK空间占用量就小很多了,可以很好地节省我们的服务器资源

2.替换更加实用且更简洁的镜像文件(将centos替换成jeanblanchard/alpine-glibc)

1.构建携带JRE版本镜像

将jre压缩包上传到当前目录

替换Dockerfile文件

From jeanblanchard/alpine-glibc
MAINTAINER 2187@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 build -t spring:v6 .

2.对比所有镜像

对比所有镜像,明显不同版本的所需容量不同,可以节省很多服务器资源 

三.镜像上传

以实际实施情况为例,当我们需要给客户安装镜像时,有时我们会采用镜像仓库的方式去对客户进行安装,那么我们就需要将我们提前准备好的镜像上传到仓库中

这里以阿里云为例

容器镜像服务 (aliyun.com)

根据链接 进入到阿里云镜像服务,因为隐私原因,所以使用个人版进行演示

注意:提前设置一个固定密码

我们进入到访问凭证中,复制当前命令到虚拟机中进行一个登录

执行命令后填写密码,当出现Loin Succeed说明登录成功

然后重新回到阿里云创建命名空间

然后去根据命名空间创建我们的仓库 

创建仓库时我们可以选择不同的仓库例如github、本地仓库等等,这里我们选择本地仓库

根据官方为我们提供的方法为我们原本存在的镜像取一个别名并创建

 我们输入命令 docker images 查看我们所有镜像的images_id

将我们所需要上传的镜像id对下面的命令镜像替换,版本号默认输入v1(注意要把中括号一起替换掉)

docker tag [ImageId] registry.cn-heyuan.aliyuncs.com/medical_yu/outpatient:[镜像版本号]

执行完成后我们可以继续查看我们的镜像,就会新生成一个以阿里云规则命名的镜像

然后执行命令准备开始进行推送

docker push 镜像名:版本号

示例

docker push registry.cn-heyuan.aliyuncs.com/medical_yu/outpatient:v1

点击阿里云镜像版本,可以看到我们推送的镜像

镜像拉取

docker pull镜像名:版本号

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • docker容器互联的实现步骤

    docker容器互联的实现步骤

    容器互联是除了端口映射外另一种可以与容器通信的方式,本文就来介绍一下docker容器互联的实现步骤,感兴趣的可以了解一下
    2023-12-12
  • Docker常用命令与小技巧汇总

    Docker常用命令与小技巧汇总

    这篇文章主要给大家介绍了关于Docker常用命令与小技巧的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Docker具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10
  • 完美解决docker安装mysql后Navicat连接不上的问题

    完美解决docker安装mysql后Navicat连接不上的问题

    这篇文章主要介绍了完美解决docker安装mysql后Navicat连接不上的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 利用Volume在主机和Docker容器文件传输的方法

    利用Volume在主机和Docker容器文件传输的方法

    这篇文章主要介绍了利用Volume在主机和Docker容器文件传输的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • docker-compose 配置spring环境的方法步骤

    docker-compose 配置spring环境的方法步骤

    这篇文章主要介绍了docker-compose 配置spring环境的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • docker search mysql报错问题分析及解决

    docker search mysql报错问题分析及解决

    Docker是现在非常流行的一种容器化技术,能够方便开发者将应用程序打包进入容器,做到跨平台的部署,这篇文章主要介绍了docker search mysql报错问题分析及解决的相关资料,需要的朋友可以参考下
    2025-11-11
  • Docker配置本地仓库web访问的实现

    Docker配置本地仓库web访问的实现

    本文主要介绍了Docker配置本地仓库web访问的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • 浅析Docker如何创建自定义容器(附通用Python 3.12模板)

    浅析Docker如何创建自定义容器(附通用Python 3.12模板)

    这篇文章主要为大家详细介绍了Docker如何创建自定义容器,并附上通用Python 3.12模板,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2025-11-11
  • docker服务假死的解决方法

    docker服务假死的解决方法

    工作中使用docker-compose部署容器,有时候会出现使用docker-compose stop或docker-compose down命令想停掉容器,但是依然无法停止或者一直卡顿在停止中的阶段,所以本文给大家介绍了docker服务假死的解决方法,需要的朋友可以参考下
    2023-12-12
  • Docker构建pinpoint部署的方法

    Docker构建pinpoint部署的方法

    这篇文章主要介绍了Docker构建pinpoint部署的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03

最新评论