当前位置: 首页 > news >正文

Docker镜像制作

目录

一. Docker 镜像管理

1. Docker 镜像结构

2. Dockerfile 介绍

二. Dockerfile 语法基础

1. 基础指令

2. 环境设置指令

3. 文件操作指令

4. 执行命令指令

5. 网络和暴露端口指令

6. 容器挂载指令

三. dockerfile案例

1. 构建nginx容器

2. Tomcat容器

四. Dockerfile 语法注意事项

1. 指令书写规范

2. 基础镜像选择

3. 文件操作注意

4. 执行命令要点

5. 环境变量和参数设置

6. 缓存利用与清理


一. Docker 镜像管理

Docker 镜像除了是 Docker 的核心技术之外,也是应用发布的标准格式。一个完整的 Docker 镜像可以支撑一个 Docker 容器的运行,在 Docker 的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用服务。 如果要把已经安装的服务进行迁移,就需要把环境以及搭建的服务生成新的镜像。

1. Docker 镜像结构

镜像不是一个单一的文件,而是有多层构成。可以通过 docker history 命令查看镜像中各层内容及大小,每层对应着Dockerfile 中的一条指令。Docker镜像默认存储在/var/lib/docker/<storage-driver>目录中。容器其实是在镜像的最上面加了一层读写层, 在运行容器里做的任何文件改动,都会写到这个读写层。如果删除了容器,也就删除了其最上面的读写层,文件改动也就丢失了。Docker 使用存储驱动管理镜像每层内容及可读写层的容器层。Docker镜像是分层的

  • Dockerfile 中的每个指令都会创建一个新的镜像层;
  • 镜像层将被缓存和复用;
  • 当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;
  • 某一层的镜像缓存失效,它之后的镜像层缓存都会失效;
  • 镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在 Docker 容器中不可见了。

2. Dockerfile 介绍

Dockfile 是一种被 Docker 程序解释的脚本,Dockerfile 由多条的指令组成,每条指令对应Linux 下面的一条命令。Docker 程序将这些 Dockerfile 指令翻译成真正的Linux 命令。Dockerfile有自己书写格式和支持的命令,Docker 程序解决这些命令间的依赖关系,类似于Makefile。Docker 程序将读取 Dockerfile,根据指令生成定制的镜像。相比镜像这种黑盒子,Dockerfile 这种显而易见的脚本更容易被使用者接受,它明确的表明镜像是怎么产生的。有了 Dockerfile,当有定制额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成镜像。

二. Dockerfile 语法基础

Dockerfile 是一个文本文件,其中包含了一系列用于构建 Docker 镜像的指令。通过编写Dockerfile,可以自动化地创建自定义的 Docker 镜像。以下为你详细介绍 Dockerfile 的常用语法:

1. 基础指令

(1)FROM

指定基础镜像,所有的 Dockerfile 都必须以 FROM 指令开头,它定义了新镜像基于哪个基础镜像构建。

(2)MAINTAINER(已弃用,推荐使用 LABEL)

用于指定镜像的维护者信息。不过在较新的 Docker 版本中,推荐使用 LABEL 指令来替代。

(3)LABEL

为镜像添加元数据,这些元数据可以是任何信息,如作者、版本、描述等,方便对镜像进行管理和知识

2. 环境设置指令

(1)ENV

设置环境变量,这些环境变量会在容器运行时持续存在,并且可以被容器内的应用程序使用。

(2)ARG

定义在构建镜像时可以传递的参数,这些参数只在镜像构建过程中有效。

3. 文件操作指令

(1)CPOY

将本地文件或目录复制到镜像中。

(2)ADD

与 COPY 类似,也是将文件或目录复制到镜像中,但 ADD 还支持从远程 URL 下载文件和自动解压压缩文件。

(3)WORKDIR

设置工作目录,后续的 RUN、CMD、ENTRYPOINT、COPY 和 ADD 等指令都会在这个工作目录下执行。

4. 执行命令指令

(1)RUN

在构建镜像的过程中执行命令,常用于安装软件包、配置环境等操作。

(2)CMD

为容器提供默认的执行命令。一个 Dockerfile 中只能有一个 CMD 指令,如果有多个,只有最后一个会生效。当使用 docker run 启动容器时,如果没有指定其他命令,就会执行CMD 指定的命令。

(3)ENTRYPOINT

配置容器启动时执行的命令,与CMD 类似,但 ENTRYPOINT 的命令不会被 docker run 后面的命令覆盖,而是将 docker run 后面的命令作为参数传递给 ENTRYPOINT 命令。

5. 网络和暴露端口指令

(1)EXPOSE

声明容器在运行时会监听的端口,但这只是一个声明,并不会实际进行端口映射。在使用 dockerrun 启动容器时,需要使用-p或-P 选项进行端口映射。

6. 容器挂载指令

(1)VOLUME

创建一个可以从本地主机或其他容器挂载的挂载点,用于持久化数据或共享数据。

三. dockerfile案例

1. 构建nginx容器

拉取镜像 这里使用的脚本导入的   可以用命令docker pull nginx拉取

创建dockerfile工作目录

在工作目录中拉取所需的压缩包

创建dockerfile

编写启动脚本

用dockerfile创建镜像

启动容器

注意:此处不带-t选项,容器中有一个run.sh 的脚本,带上-t选项,这个脚本就不执行了或者
[root@localhost nginx]# docker run -d -it -p 8081:80 --name nginx02 -v /www/html:/webmynginx /bin/bash -c /run.sh
此处使用 bash 执行 run.sh 的脚本

或者
[root@localhost nginx]# docker run -dit -p 8082:80 --name nginx83 -v /www/html:/web
mynginx
此处为容器创建了一个容器卷,并挂在到 docker 主机的/www 目录下

查看

这个时候/var/www/htm/自动生成

浏览器也可以访问

2. Tomcat容器

创键工作目录

创建dockerfile文件

创建启动脚本 如果后面启动不成功添加后面标橙的地方

用dockerfile生成镜像

运行容器

浏览器访问http://192.168.10.101:8082

四. Dockerfile 语法注意事项

在编写 Dockerfile 时,掌握基础语法的注意事项能够帮助你构建出高效、可靠且易于维护的Docker 镜像。

1. 指令书写规范

(1)大小写

Dockerfile 中的指令不区分大小写,但建议使用大写,以增强可读性。例如,使用 FROM、RUN 而非 from、 run.

(2)顺序

指令的顺序非常重要,因为 Docker 会按顺序依次执行这些指令。合理安排指令顺序有助于提高构建效率和镜像的可维护性。例如,将不常变动的指令放在前面,充分利用Docker 构建缓存机制。

(3)注释

可以使用 #来添加注释,这有助于解释 Dockerfile 中各部分的作用,提高代码的可读性。

2. 基础镜像选择

(1)稳定性与安全性

选择稳定、官方且维护良好的基础镜像,这样能保证镜像的安全性和可靠性。例如,官方的 ubuntu、alpine 等镜像都有较好的维护和更新机制。

(2)镜像大小

如果对镜像大小有严格要求,可选择轻量级的基础镜像,如 alpine 镜像,它体积小巧,适合构建资源占用少的容器。

3. 文件操作注意

(1)COPY 与 ADD 的区别

  • COPY 仅用于简单的文件和目录复制,语法清晰,性能较好,推荐优先使用。
  • ADD 除复制功能外,还支持从 URL 下载文件和自动解压压缩文件,但功能复杂可能带来安全风险和不可预测性,所以仅在确实需要这些额外功能时使用。

(2)文件路径

使用相对路径时要确保路径在构建上下文中是正确的。构建上下文是指执行 docker build 命令时指定的目录,只有该目录下的文件和子目录才能被复制到镜像中。

4. 执行命令要点

(1)RUN 命令优化

尽量将多个相关的命令合并成一个 RUN 指令,减少镜像的层数,从而减小镜像体积。例如,使用 && 连接多个命令

(2)清理临时文件和缓存

要及时清理临时文件和缓存,避免将不必要的文件包含在镜像中

(3)CMD与 ENTRYPOINT 搭配:

  • CMD 为容器提供默认执行命令,ENTRYPOINT配置容器启动时执行的命令。当两者搭配使用时

CMD 通常作为 ENTRYPOINT 的默认参数。

例如:

ENTRYPOINT ["python3"]

CMD ["app.py"]

  • 若在 docker run 时指定了命令,CMD 的内容会被覆盖,而 ENTRYPOINT 的命令不会被覆盖,指定的命令会作为参数传递给 ENTRYPOINT。

5. 环境变量和参数设置

(1)ENV 与 ARG 的区别:

  • ENV 设置的环境变量在容器运行时持续存在,可被容器内的应用程序使用。
  • ARG 定义的参数仅在镜像构建过程中有效,用于传递构建时的参数。

(2)安全性

避免在 ENV 或 ARG 中设置敏感信息(如密码、密钥等),若确实需要,可以在运行容器时通过环境变量传递。

(3)网络和端口声明

EXPOSE 指令: EXPOSE 只是声明容器监听的端口,不会进行实际的端口映射。在使用 docker run 启动容器时,需使用-p或-P 选项进行端口映射。

6. 缓存利用与清理

(1)缓存机制

Docker 构建镜像时会利用缓存,若某条指令的内容未发生变化,会直接使用之前的缓存结果,加快构建速度。因此,将不常变动的指令放在前面,可充分利用缓存。

(2)缓存清理

当需要强制重新构建镜像、不使用缓存时,可使用 docker build --no-cache 命令。

相关文章:

  • 从Java API调用者到架构思考:我的Elasticsearch认知升级之路
  • 【Linux篇章】线程同步与互斥2:打破多线程并发困境,开启高效程序运行新境界
  • libwebsockets编译
  • 【机器学习1】线性回归与逻辑回归
  • SQLite FTS4全文搜索实战指南:从入门到优化
  • Python Django全功能框架开发秘籍
  • 设计模式精讲 Day 11:享元模式(Flyweight Pattern)
  • 计算机操作系统(十六)进程同步
  • 笔试强训:Day8
  • PillarNet: Real-Time and High-PerformancePillar-based 3D Object Detection
  • Crawl4ai实操2
  • 【项目管理】项目管理资料文档模板(ZIP,PPT,WORD)
  • 国产免费的k8s管理平台
  • 测试设计方法:正交试验原理分析与实践
  • Maven 之 JUnit 测试体系构建全解析
  • JS 大整数相加
  • Matlab自学笔记六十:符号表达式的缩写和简化
  • VitePress搭建静态博客
  • 一文汇总电子电气架构的成本优化方向
  • 关于华为Pura70Pro+升级鸿蒙NEXT和回退
  • 杭州科技学校网站建设/seo关键词排名系统
  • app推荐网站/新闻博客软文自助推广
  • 怎样做触屏版手机网站/网站快速收录付费入口
  • 电脑有了外网是不是就可以做网站/全国疫情排名一览表
  • WordPress清除ID沉余/邹平县seo网页优化外包
  • 做网站大流量/网站流量统计工具