Docker自定义构建镜像dockerfile和使用数据卷

embedded/2024/9/25 7:13:28/

Docker自定义构建镜像dockerfile和使用数据卷

DockerFile

Dockerfile 是一个文本文件,包含了一系列用于构建 Docker 镜像 的指令和配置信息。通过编写
Dockerfile ,用户可以定义镜像的构建过程,包括基础镜像、运行命令、设置环境变量、暴露端口等。
Dockerfile Docker 镜像的构建蓝图,通过执行 docker build 命令可以根据 Dockerfile 构建出一个完整的
镜像。每个指令都会生成一个镜像层,这些镜像层会被堆叠在一起以构建最终的镜像。
DockerFile指令
说明
FROM
指定基础镜像,用于后续的指令构建。
MAINTAINER
指定 Dockerfile 的作者 / 维护者。(已弃用,推荐使用 LABEL 指令)
LABEL
添加镜像的元数据,使用键值对的形式。
RUN
在构建过程中在镜像中执行命令。
CMD
指定容器创建时的默认命令。(可以被覆盖)
ENTRYPOINT
设置容器创建时的主要命令。(不可被覆盖)
EXPOSE
声明容器运行时监听的特定网络端口。
ENV
在容器内部设置环境变量。
ADD
将文件、目录或远程 URL 复制到镜像中。
COPY
将文件或目录复制到镜像中。
VOLUME
为容器创建挂载点或声明卷。
WORKDIR
设置后续指令的工作目录。
USER
指定后续指令的用户上下文。
ARG
定义在构建过程中传递给构建器的变量,可使用 "docker build" 命令设置。
ONBUILD
当该镜像被用作另一个构建过程的基础时,添加触发器。
STOPSIGNAL
设置发送给容器以退出的系统调用信号。
HEALTHCHECK
定义周期性检查容器健康状态的命令。
SHELL
覆盖 Docker 中默认的 shell ,用于 RUN CMD ENTRYPOINT 指令。
构建步骤
先创建一个dockerfile的文件,用来创建我们的docker镜像,我们需要的tar包要放在同级目录下
编辑文件
FROM centos:7 
# 基础镜像是centos7# 作者
MAINTAINER cxy 2099289294@qq.com# 设置环境变量
ENV MYPATH /usr/local
# 指定工作目录
WORKDIR $MYPATH# 修改yum源   阿里的yum源
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 清理缓存并生成新的缓存
RUN yum clean all && yum makecache# vim
RUN yum -y install vim# net-tools
RUN yum -y install net-tools
#jdk
# 	1.解压tar 包  自动解压 
RUN mkdir /usr/local/java
ADD jdk-23_linux-x64_bin.tar.gz /usr/local/java/# 设置环境变量ENV JAVA_HOME /usr/local/java/jdk-23
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATHEXPOSE 80# 要运行的程序
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

from拉过来基础镜像centos,下载我们需要的vim和net-tools,解压jdk包和设置jdk的环境变量,放出来一个80端口

创建镜像

语法:Docker build 【-f 文件的名字】-t 镜像的名字 .

docker build -t mycentos .

文件的名字不写的时候默认使用的是dockerfile

创建好之后使用命令查看

查看所有镜像

docker images

创建容器运行容器,并进入到容器内部

docker run -it --name=容器名字  镜像名字  bash

导出镜像
docker save -o mycentos.tar mycentos

可以看到~目录下会出现我们的镜像

导入镜像

将镜像远程传递给另一台服务器

scp ./mycentos.tar root@192.168.184.35:/usr/aaa

进入到另一台的服务器中加载镜像

cd /usr/aaa
docker load -i mycentos.tar 

查看镜像是否加载

docker images

导入成功

数据卷

卷就是目录或文件,存在于一个或多个容器中,是 Docker 容器中用于持久化数据的一种机制,它可以将
容器内的数据存储到宿主机中,由 docker 挂载到容器,但不属于联合文件系统,因此能够绕过
UnionFS ,提供一些用于持续存储或共享数据。
特性
卷设计的目的就是数据的持久化,完全独立于容器的生存周期,因此 Docker 不会在容器删除时删除其挂
载的数据卷。
特点
数据卷可以在容器之间共享或重用数据
卷中的更改可以直接实施生效
数据卷中的更改不会包含在镜像的更新中
数据卷的生命周期一直持续到没有容器使用它为止

作用:

1. 数据的共享

2. 容器删除的时候数据不丢失

添加数据卷

直接添加

docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
 docker run -it -v /opt/myvolume:/opt/v1 --name=mycentos2 mycentos bash

运行了一个容器mycentos2  容器中opt/v1目录下面的所有的内容全部都挂载到了宿主目录中的opt/myvolume 里面

测试

进入容器内部

docker exec -it 容器名/id bash

进入刚和宿主机绑定的文件夹v1里,输出并创建一个文件,看宿主文件夹是否会同步创建

可以看到在我们的宿主机的文件夹里也同样会创建

即使容器被删除后也可以留下文件


http://www.ppmy.cn/embedded/116501.html

相关文章

sprintf()函数的介绍及其用法

目录 前言 一:sprintf()函数的介绍 二:sprintf()函数的原型 三:sprintf()函数的用法 1.控制输出格式 2.将数字转化成字符串 3.拼接字符串 4.当然,也可…

window.onload什么时候执行

window.onload 事件在页面的所有资源(包括样式表、脚本文件、图片等)都加载完成后立即执行。这意味着,在 window.onload 事件的处理函数中,你可以安全地引用页面上的所有元素,因为此时它们都已经加载到DOM中&#xff0…

OpenMV与STM32通信

在现代嵌入式系统中,图像处理和微控制器的结合成为一种重要趋势。OpenMV模块能够快速处理图像数据,并通过串行接口与STM32微控制器进行通信,从而实现复杂的多功能应用。本指南将介绍如何配置OpenMV与STM32通信,并通过实际案例使读…

0基础学习HTML(十七)字符字体

HTML 字符实体 HTML 中的预留字符必须被替换为字符实体。 一些在键盘上找不到的字符也可以使用字符实体来替换。 HTML 实体 在 HTML 中&#xff0c;某些字符是预留的。 在 HTML 中不能使用小于号&#xff08;<&#xff09;和大于号&#xff08;>&#xff09;&#xff…

JetLinks物联网学习(前后端项目启动)

前后端项目启动 1、后端1.1 pgsql改mysql报错2、elasticSearch7.0版本以上_doc格式取消 2、前端 1、后端 环境准备&#xff1a; 1、window系统7,8&#xff0c;10 。 硬件资源最低要求4c8G&#xff0c;硬盘40G 2、JDK 1.8.0_2xx (需要小版本号大于200) 3、Maven3.6.3 4、Redis …

Go版数据结构 -【1.1 数据结构的分类与基本概念】

1.1 数据结构的分类与基本概念 本节我们将对数据结构的基本概念以及分类进行讲解&#xff0c;数据结构有很多种&#xff0c;但是主要也就是集中于几种类型&#xff0c;本节我们将进行逐一讲解。 什么是数据结构&#xff1f; 按照标准说法&#xff0c;数据结构指的是在计算机…

毕设基于SSM+Vue3实现设备维修管理系统四:后台框架及基础增删改查功能实现

本章介绍后端基础框架及基础的增删改查功能实现&#xff0c;创建基础的dao、service即controller层相关的基类&#xff0c;并实现基础的增删改查相关功能。 源码下载&#xff1a;点击下载 讲解视频&#xff1a; SMMVUE3实现设备维修管理系统毕设&#xff1a;后端框架搭建及表外…

Qt 类型选择器和类选择器的区别

概念上的区别请查看此篇博客&#xff1a;Qt 样式表、选择器、盒子模型&#xff0c;下面我直接举例说明。 示例界面&#xff1a; 1、类型选择器&#xff1a; QWidget {background-color: rgb(255, 85, 127); }运行结果&#xff08;因为QPushButton是QWidget的子类&#xff0…