【Docker】Docker 的数据管理与镜像创建

news2024/11/8 11:02:15

目录

一.数据管理

1.数据卷

2.数据卷容器

二.端口映射

三.容器互联

四.Docker 镜像的创建

1.基于现有镜像创建

1.1.首先启动一个镜像,基于镜像创建容器,更新容器内容

1.2.将修改后的容器提交为新的镜像,需要使用该容器的 ID 号创建新镜像

2.基于本地模板创建

3.基于Dockerfile 创建

四.Dockerfile概述

1.Docker 镜像结构的分层

2.Dockerfile操作常用的指令

3.Dockerfile案例

3.1.在线源安装nginx案例

3.2.源码编译安装nginx

五.总结


一.数据管理

管理 Docker 容器中数据主要有两种方式:数据卷和数据卷容器

1.数据卷

数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷

的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数

据卷的使用类似于 Linux 下对目录进行的 mount 操作

docker pull centos:7

宿主机目录/var/www 挂载到容器中的/data1

注意:宿主机本地目录的路径必须是使用绝对路径。如果路径不存在,Docker会自动创建相应的路径

docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash  

-v 选项可以在容器内创建数据卷

ls
echo "this is web1" > /data1/abc.txt
exit

#返回宿主机进行查看
cat  /var/www/abc.txt

2.数据卷容器

如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普通的

容器,专门提供数据卷给其他容器挂载使用

docker run -id --name a1 -v /data1 -v /data2 centos:7 bash   #创建一个容器作为数据卷容器
docker run -id --name a2 --volumes-from a1 centos:7 bash
docker run -id --name a3 --volumes-from a1 centos:7 bash
#使用 --volumes-from 来挂载 a1 容器中的数据卷到新的容器
docker exec -it a1 bash
echo 'zx' > data1/zx.txt
echo 'jlh' > data2/jlh.txt

docker exec -it a2 bash
ls data1
ls data2
 
cat /data1/zx.txt
cat /data2/jlh.txt
 
验证

docker exec -it a3 bash
ls data1
ls data2
 
cat /data1/zx.txt
cat /data2/jlh.txt
 
验证

二.端口映射

在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来访问容器内的服务。端口

映射机制将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使得外

部网络访问宿主机的端口便可访问容器内的服务

docker run -d --name test1 -P nginx                    #随机映射端口(从32768开始)
 
docker run -d --name test2 -p 43000:80 nginx           #指定映射端口
 
docker ps -a

浏览器访问:http://192.168.80.103:43000    、http://192.168.80.103:49170

三.容器互联

(使用centos镜像)

默认情况下docker容器重新创建后,对应的容器IP地址可能会改变,这样如果两个容器之间通信就

会变得非常麻烦,每次都要修改通信的IP地址

容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。简单点说,就是会在源容器和

接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息

#创建并运行接收容器取名a4,使用--link选项指定连接容器以实现容器互联
docker run -id --name a4 --link a3:xy101 centos:7 bash   #--link 容器名:连接的别名
 
docker exec -it a4 bash
ping a3
ping a4

重启容器测试(重启后ip会发生改变)

四.Docker 镜像的创建

创建镜像有三种方法,分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建

1.基于现有镜像创建

1.1.首先启动一个镜像,基于镜像创建容器,更新容器内容

docker run -id --name a1 centos:7 bash   #创建一个容器
cd /etc/yum.repos.d
docker cp nginx.repo a1:/etc/yum.repos.d
docker cp CentOS-Base.repo a1:/etc/yum.repos.d    #将nginx包和阿里云镜像传给rq
 
docker exec -it a1 bash
cd /etc/yum.repos.d
yum install  -y nginx    #在线安装nginx
nginx
ps aux

1.2.将修改后的容器提交为新的镜像,需要使用该容器的 ID 号创建新镜像

#常用选项:
-m 说明信息;
-a 作者信息;
-p 生成过程中停止容器的运行。
 
docker commit -m "nginx on centos7" -a "tc 2024-07-15" 824de9ecbd51 nginx:centos7
docker images

docker run -id --name a2 -p 1315:80 nginx:centos7 bash -c "nginx -g 'daemon off;'"
bash -c:在bash环境中执行"nginx -g 'daemon off;'"(前台启动命令)命令;daemon off表示关闭守护进程模式,让 Nginx 在前台作为交互式进程运行。
docker ps -a
 
浏览器验证
http://192.168.80.103:1315   #即可判断镜像是否创建成功

2.基于本地模板创建

通过导入操作系统模板文件,生成镜像,模板可以从OPENVZ开源项目下载,下载地址为

http://openvz.org/Download/template/precreated    #模板网站
docker import debian-7.0-x86-minimal.tar.gz -- debian:7.0
docker images
docker run -id debian:7.0 sh
docker ps -a
docker exec -it e27f822c4f4c sh
cat /etc/*release

将容器导出再导入成镜像

浏览器访问测试:http://192.168.80.103:1316

3.基于Dockerfile 创建

UnionFS(联合文件系统)

Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改

作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。AUFS、

OverlayFS 及 Devicemapper 都是一种 UnionFS

Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜

像),可以制作各种具体的应用镜像。

特性

一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层

文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

我们下载的时候看到的一层层的就是联合文件系统

镜像加载原理

补充

为什么Docker里centos的大小才200M

对于精简的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以了。因为底层

直接用宿主机的kernel,自己只需要提供rootfs就可以。由此可见对于不同的linux发行版,

bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs

四.Dockerfile概述

1.Docker 镜像结构的分层

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

2.Dockerfile操作常用的指令

  • FROM                            指定基础镜像(是Dockerfile的第一行指令)
  • MAINTAINER|LABEL    指定镜像维护人的信息和元数据(可选)
  • RUN                              指定linux命令,尽量将多条命令合并在一个RUN指令里,用 ; 或 && 或 <<EOF 串起来使用
  • EXPOSE                      指定容器要开启的端口号
  • ENV                              指定容器的环境变量
  • ADD|COPY                  复制本地文件或目录到镜像里
  • VOLUME                     指定容器的匿名数据卷(作用类似于 docker run -v /var/lib/docker/volumes/容器ID/:容器数据卷目录/)
  • USER                          指定容器的运行用户
  • WORKDIR                  指定镜像层后续的工作目录
  • ARG                             指定构建镜像时传入的参数变量(docker build --build-arg 变量=值)
  • CMD|ENTRYPOINT     指定容器启动时执行的命令和参数
     

ADD 和 COPY 的区别?

  • 共同点:都可以将本地的文件或目录复制到镜像里
  • 区别:ADD可以通过URL地址下载文件并复制到镜像里,还能将本地的压缩包文件解压后再复制到镜像里(URL下载和压缩包解压特性不能同时生效,即通过URL下载的压缩包只能以压缩包的形式复制到镜像里)。而COPY没有URL下载和压缩包解压的特性

CMD 和 ENTRYPOINT 的区别?

  • 共同点:都可以用来指定容器的启动命令
  • 区别:ENTRYPOINT指定的容器启动命令优先级更高,如果ENTRYPOINT和CMD同时存在,那么CMD指定的内容将作为ENTRYPOINT指定的容器启动命令的参数使用

3.Dockerfile案例

3.1.在线源安装nginx案例

建立工作目录

mkdir  /opt/nginx
cd  /opt/nginx

制作Dockerfile文件,并编写构建镜像过程

cd /etc/yum.repos.d/
cp CentOS-Base.repo nginx.repo /opt/nginx
 
vim /opt/nginx/Dockerfile 
 
#指定基础镜像
FROM centos:7
 
#设置镜像维护信息(可选)
MAINTAINER this is nginx image <tc 2024-07-15>
 
#复制宿主机阿里云和nginx包到容器
COPY CentOS-Base.repo /etc/yum.repos.d/
COPY nginx.repo /etc/yum.repos.d/
 
#编写构建镜像的过程
RUN yum install -y nginx
 
#暴露容器中应用程序的端口
EXPOSE 80
 
#指定容器前台启动nginx服务,CMD默认使用的命令
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
 
docker build -t nginx:v1 .   #构建镜像
 
docker run -id nginx:v1   #启动容器
 
docker run -id -p 1314:80 nginx:v1   #映射端口

浏览器访问测试:http://192.168.80.103:1314

如何修改访问页面出现的内容?

cd /opt/nginx
mkdir html
docker cp 99ac0870d1a5:/usr/share/nginx/html ./
docker rm -f 99ac0870d1a5   #删除原先
docker run -id -p 1315:80 -v /opt/nginx/html/:/usr/share/nginx/html/ nginx:v1
echo 'zx like jlh' > html/index.html
cat html/index.html
 
浏览器访问
http://192.168.80.103:1315

3.2.源码编译安装nginx

cd /opt
mkdir nginx_bian
cd nginx_bian/
上传nginx压缩包
cd /etc/yum.repos.d/
cp CentOS-Base.repo /opt/nginx_src/
 
cd /opt/nginx_bian/
vim Dockerfile
FROM centos:7
 
LABEL author="tc" createtim="2024-07-15" usage="nginx image"
 
ADD nginx-1.24.0.tar.gz /opt/
ADD CentOS-Base.repo /etc/yum.repos.d/
 
RUN yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make && \
    useradd -M -s /sbin/nologin nginx && \
    cd /opt/nginx-1.24.0/ && \
    ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && \
    make && \
    make install
 
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
 
 
docker build -t nginxsrc:v1 .
 
docker run -id nginx:v1
docker ps -a
 
cd /opt/nginx
cp -r html /opt/nginx_bian/
 
docker run -id --name a1 -p 1314:80 -v /opt/nginx_bian/html/:/usr/local/nginx/html/ nginx:v1
 
docker ps -a

浏览器访问测试:http://192.168.80.103:1314

五.总结

容器启动命令的优先级排行

docker run --entrypoint="命令"  >  镜像里的ENTRYPOINT指令指定的"命令"  >  docker run .... 镜

像 "命令"  >  镜像里的CMD指令指定的"命令"

使用Dockerfile构建镜像的步骤

  1. 编写Dockerfile文件,在第一行用 FROM 指令指定基础镜像
  2. 用 MAINTAINER 或 LABEL 指令指定镜像的元数据信息(可选)
  3. 用 RUN COPY ADD ENV EXPOSE 等指令编写操作镜像的过程
  4. 最后用 CMD 或 ENTRYPOINT 指令指定容器启动命令
  5. 完成Dockerfile文件的编写后,用 docker build -t 镜像名:标签 .  命令来构建镜像

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1928228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git取消合并:--hard 或 --merge

第一步&#xff1a;查了git日志 git reflog如下&#xff0c;运行上述命令后&#xff0c;可以看见所有的提交哈希&#xff08;id&#xff09; 第二步 查看到上述所有的提交记录后&#xff0c;有如下方法去回退 方法1&#xff1a;--hard 确定上一次提交的哈希值 git reset…

低空经济持续发热,无人机培训考证就业市场及前景剖析

随着科技的不断进步和社会需求的日益增长&#xff0c;低空经济已成为全球及我国经济增长的新引擎。作为低空经济的重要组成部分&#xff0c;无人机技术因其广泛的应用领域和显著的经济效益&#xff0c;受到了社会各界的广泛关注。为满足市场对无人机人才的需求&#xff0c;无人…

object-C 解答算法:两数之和(leetCode-1)

两数之和(leetCode-1) 题目如下图:(也可以到leetCode上看完整题目,题号1) 解答方法一: 最简单的方法就是双指针遍历数组.代码如下 - (NSMutableArray *)sumOfTwoNumbers:(NSMutableArray *)array target:(int)target {NSMutableArray * resultArray [[NSMutableArray alloc…

怎样去除视频上的水印和文字,视频水印文本移除教程

在观看和分享视频时&#xff0c;我们经常会遇到带有水印或额外文字的情况。这些标记有时是为了版权保护&#xff0c;有时则是平台的标识&#xff0c;但在某些情况下&#xff0c;它们可能会干扰视频的观赏体验。本文将向你介绍常见的视频水印类型以及如何使用简鹿水印助手去除这…

漏洞复现 | Showdoc反序列化

非常简单的一个靶场 靶场地址&#xff1a;https://hack.zkaq.cn/ 打开靶场&#xff0c;弹出了这种登录框&#xff0c;这也成为了后面的一个坑点&#xff0c;记住这个登录框。 看到了注册功能&#xff0c;showdoc有注册功能我们就不用尝试前台SQL注入了&#xff0c;直接注册…

—张pdf怎么分割成多页,怎么把一个pdf分割

在数字化时代&#xff0c;pdf文件已经成为我们工作和生活中不可或缺的一部分。然而&#xff0c;有时候我们可能会遇到需要将一张pdf文件分割成多页的情况。无论是为了便于分享&#xff0c;还是为了满足特定的文档格式要求&#xff0c;这个任务都可能变得相当棘手。但别担心&…

python数据可视化(5)——绘制饼图

课程学习来源&#xff1a;b站up&#xff1a;【蚂蚁学python】 【课程链接&#xff1a;【【数据可视化】Python数据图表可视化入门到实战】】 【课程资料链接&#xff1a;【链接】】 Python绘制饼图分析北京天气 饼图&#xff0c;是一个划分为几个扇形的圆形统计图表&#xff…

深入解析Spring Cloud:构建分布式微服务架构的最佳实践

导语&#xff1a;随着互联网业务的快速发展&#xff0c;传统的单体应用已无法满足高并发、高可用、可扩展的需求。微服务架构以其轻量级、独立性、灵活性的特点&#xff0c;逐渐成为大型分布式系统的首选架构。Spring Cloud作为构建微服务架构的重要框架&#xff0c;为开发者提…

ElementUI el-select 组件动态设置disabled后,高度变更的问题解决办法

问题描述 Vue2 项目在使用 el-select 组件时&#xff0c;动态将disabled变更为了 true&#xff0c;元素的高度发生了变化。 问题原因 通过浏览器开发人员工具面板&#xff0c;发现&#xff0c;组件内的 input 元素被动态设置了height的样式&#xff1a; 在项目中检查后并…

利用MODBUS协议读取温湿度传感器的时间

因为项目需求&#xff0c;需要使用RS485接口的温湿度传感器&#xff0c;简单的记录一下。 我选用的传感器是冀欧速传感器&#xff0c;它的产品采用的是MODBUS协议。MODBUS是一个非常老的协议&#xff0c;1979年成为事实上的国际标准&#xff0c;目前有个国际组织进行维护&…

第七天 SpringBoot与SpringCloud微服务项目交付

Spring Cloud微服务项目交付 微服务扫盲篇 微服务并没有一个官方的定义&#xff0c;想要直接描述微服务比较困难&#xff0c;我们可以通过对比传统WEB应用&#xff0c;来理解什么是微服务。 单体应用架构 如下是传统打车软件架构图&#xff1a; 这种单体应用比较适合于小项…

纯css实现语音播报动画效果

先来看看效果图 黑色以下代码 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAAYCAYAAAAF6fiUAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAO8SURBVGiB1ZlPaBxVHMe/v7fbkmUZErRs9/1moUtYBBfxklZR8aYg5KAgvcT25MFDvUhPTaGnHoKIlOpJ0VsPUvAgKNjSS0EPAVGKya…

AI安全系列——[第五空间 2022]AI(持续更新)

最近很长时间没有更新&#xff0c;其实一直在学习AI安全&#xff0c;我原以为学完深度学习之后再学AI安全会更加简单些&#xff0c;但是事实证明理论转实践还是挺困难的&#xff0c;但是请你一定要坚持下去&#xff0c;因为“不是所有的坚持都有结果&#xff0c;但总有一些坚持…

处理在 electron 中使用开启了懒加载的 el-image 后,窗口最大化或窗口尺寸变化后图片无法显示的问题

文章目录 1、问题描述2、详情动图3、解决思路4、解决方案5、效果展示 1、问题描述 在 electron 中使用 el-image 时&#xff0c;开启了懒加载后&#xff0c;发现只有当窗口滚动后&#xff0c;图片才会显示&#xff0c;即便图片已经处于窗口的可视区域。当拖动窗口使其尺寸变大…

CentOS配置时钟服务

一、ntp协议 1.1 基础 NTP&#xff08;Network Time Protocol&#xff0c;网络时间协议&#xff09;是用于同步计算机网络中各个设备时间的协议。 下面了解一下 ntp 的配置选项 1.) iburst 功能: 通过发送一组八个数据包来加速初始同步。 用法: server 0.pool.ntp.org i…

设计模式学习(二)工厂模式——抽象工厂模式+注册表

设计模式学习&#xff08;二&#xff09;工厂模式——抽象工厂模式注册表 前言使用简单工厂改进使用注册表改进参考文章 前言 在上一篇文章中我们提到了抽象工厂模式初版代码的一些缺点&#xff1a;①客户端违反开闭原则②提供方违反开闭原则。本文将针对这两点进行讨论 使用…

uniapp 微信小程序根据后端返回的文件链接打开并保存到手机文件夹中【支持doc、docx、txt、xlsx等类型的文件】!

项目场景&#xff1a; 我们在使用uniapp官方提供的uni.downloadFile以及uni.saveFile时&#xff0c;会发现这个文件下载的默认保存位置和我们预想的不太一样&#xff0c;容易找不到&#xff0c;而且没有提示&#xff0c;那么我们就需要把文件打开自己保存并且有提示保存到哪个…

python机器学习6-----图表函数库Matplotlib

1.Matplotlib介绍 Matplotlib是Python著名的绘图函数库&#xff0c;它提供了一整套图表的API&#xff0c;可以将数据绘制成图表&#xff0c;而且也可以方便地将它作为绘图控件&#xff0c;嵌入GUI应用程序中。Matplotlib是很大的Python库&#xff0c;而pyplot是Matplotlib中的一…

Day53:图论 岛屿数量 岛屿的最大面积

99. 岛屿数量 时间限制&#xff1a;1.000S 空间限制&#xff1a;256MB 题目描述 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成&#xff0c;并且四周…

MBTI答题应用小程序

源代码 calmthink/mbti小程序 (gitee.com) 实现方案 题目结构 [{"options": [{"result": "I","value": "独自工作","key": "A"},{"result": "E","value": "与他…