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

目录

一.数据管理

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 data2cat /data1/zx.txt
cat /data2/jlh.txt验证

docker exec -it a3 bash
ls data1
ls data2cat /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包和阿里云镜像传给rqdocker 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/nginxvim /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:7LABEL 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 installCMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]docker build -t nginxsrc:v1 .docker run -id nginx:v1
docker ps -acd /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:v1docker 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.mzph.cn/pingmian/47072.shtml

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

相关文章

算法2--贪心算法

1.老鼠和猫的交易 小老鼠准备了M磅的猫粮&#xff0c;准备去和看守仓库的猫做交易&#xff0c;因为仓库里有小老鼠喜欢吃的五香豆。 仓库有N个房间&#xff1b; 第i个房间有 J[i] 磅的五香豆&#xff0c;并且需要用 F[i] 磅的猫粮去交换&#xff1b; 老鼠不必交换该房间所有的五…

中国星坤X0800HI系列线对板连接器:创新技术连接,引领智能家居未来!

近日&#xff0c;中国星坤推出的X0800HI系列线对板连接器&#xff0c;凭借其独特的设计和卓越的性能&#xff0c;引起了业界的广泛关注。 X0800HI系列线对板连接器在极小空间内实现了线对板的W-B连接&#xff0c;这不仅解决了传统连接方式中剥线和焊接的繁琐步骤&#xff0c;还…

django踩坑(四):终端输入脚本可正常执行,而加入crontab中无任何输出

使用crontab执行python脚本时&#xff0c;有时会遇到脚本无法执行的问题。这是因为crontab在执行任务时使用的环境变量与我们在终端中使用的环境变量不同。具体来说&#xff0c;crontab使用的环境变量是非交互式(non-interactive)环境变量&#xff0c;而终端则使用交互式(inter…

Hyper-V和VMWare使用对比

图片来自互联网 1.起因 最近在学习Linux相关的知识&#xff0c;第一步当然就是装虚拟机了。之前是基于微软Hyper-V平台装的Ubuntu,用起来总是感觉卡卡的。我还一直天真的以为虚拟机都是这个样子的&#xff0c;直到用了VMWare之后…。VMWare我主要装的是VMWare16Pro&#xff0…

224 |《乡下人的悲歌》也是城市中产的呜咽

今天《乡下人的悲歌》和他的作者火了&#xff1a;詹姆斯戴维万斯&#xff08;James David Vance&#xff09;被共和党提名为副总统候选人。 以下是最能代表这本书的一个重要观点&#xff1a; I dont believe in epiphanies. I dont believe in transformativemoments, as trans…

C++:链表插入排序/删除重复节点题解

插入排序 插入排序的思路很简单&#xff0c;基本都知道。 关键是放在链表中&#xff0c; 1.要建立一个哨兵位&#xff0c;这个哨兵位的下一个节点&#xff0c;始终指向val最小的节点。 2.prev指针作为cur的前一个节点&#xff0c;始终指向val最大的节点。它的下一个节点始终…

JavaFX+MySQL实现图书管理系统(包含完整代码)

目录 一、功能介绍 1.ER图 2.学生管理员登陆页面 3.图书馆首页 4.学生图书馆搜索界面 5.学生注册 6.管理员后台 增加书籍 查看借阅记录 ​编辑 修改图书 二、功能分解 1.界面展示 2.点击按钮切换页面 普通按钮点击 复杂按钮点击 3.登录注册 创建登陆注册的页…

逆向学习思路链接分享

学好逆向先学C 然后我们需要学习好 编码问题CTF常见编码及加解密&#xff08;超全&#xff09; - ruoli-s - 博客园 (cnblogs.com) 并且规划好学习路线 CTF逆向Reverse入门学习路线&#xff08;面向小白&#xff09;_逆向reverse 思路-CSDN博客 并且安好反编译的环境 x64d…

【教学类-67-02】20240716毛毛虫ABB排序

背景需求&#xff1a; 【教学类-67-01】20240715毛毛虫AB排序-CSDN博客文章浏览阅读584次&#xff0c;点赞16次&#xff0c;收藏6次。【教学类-67-01】20240715毛毛虫AB排序https://blog.csdn.net/reasonsummer/article/details/140443310 在AB排序基础上&#xff0c;继续制作…

【Django+Vue3 线上教育平台项目实战】登录功能模块之短信登录与钉钉三方登录

文章目录 前言一、几个关键概念1.HTTP无状态性2.Session机制3.Token认证4.JWT 二、通过手机号验证码登录1.前端短信登录界面2.发送短信接口与短信登录接口3.Vue 设置interceptors拦截器4. 服务端验证采用自定义中间件方式实现5. 操作流程及效果图如下&#xff1a; 三、通过第三…

记录些MySQL题集(9)

MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析 一、MySQL中的死锁现象 所谓的并发事务&#xff0c;本质上就是MySQL内部多条工作线程并行执行的情况&#xff0c;也正由于MySQL是多线程应用&#xff0c;所以需要具备完善的锁机制来避免线程不安全问题的问题产生&#…

手机如何伪装ip网络地址

伪装IP地址是指通过技术手段修改网络设备的IP地址&#xff0c;使其看起来像是来自另一个网络位置。这种技术通常用于隐藏真实的网络活动&#xff0c;以保护隐私。那么&#xff0c;手机如何伪装IP网络地址&#xff1f; 要在手机上伪装IP地址&#xff0c;‌可以通过下载和安装手机…

数据资产通证化,堪比20年前的房地产?

大数据产业创新服务媒体 ——聚焦数据 改变商业 想象一下&#xff0c;一个简单的点击&#xff0c;一次不经意的搜索&#xff0c;一段简短的对话&#xff0c;它们在数字世界里留下了什么&#xff1f;是的&#xff0c;是数据。这些看似微不足道的数字碎片&#xff0c;汇聚成海&a…

【python】PyQt5的窗口界面的各种交互逻辑实现,轻松掌控图形化界面程序

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【中项】系统集成项目管理工程师-第一模块:IT技术和管理-1.1信息与信息化-1.1.2信息系统基础

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&#xff0c;目前涵盖了计算机软件、计算机网络、计算机应…

Office动态水印终于来了

在信息安全日益重要的今天&#xff0c;保护敏感信息变得尤为关键。目前&#xff0c;动态水印甚至是盲水印技术已经在各种企业软件中广泛应用&#xff0c;常见的钉钉和企业微信等都已经支持此类技术&#xff0c;用户查看消息时画面会显示对应用户的姓名和工号等&#xff0c;而作…

小程序-视图与逻辑

一、页面导航 声明式导航 编程式导航 导航传参 1.声明式导航传参 2.编程式导航传参 3.在onload中接收导航参数 二、页面事件 下拉刷新 上拉触底 三、生命周期 分类 生命周期函数分类 1.应用的生命周期函数 2.页面的生命周期函数 四、WXS脚本 基础语法 wxs的特点 五、案…

几何相关计算

目录 一、 判断两个矩形是否相交 二、判断两条线段是否相交 三、判断点是否在多边形内 四、垂足计算 五、贝塞尔曲线 六、坐标系 一、 判断两个矩形是否相交 当矩形1的最大值比矩形2的最小值都小&#xff0c;那矩形1和矩形2一定不相交&#xff0c;其他同理。 struct Po…

华为OD 机试真题 - 分割均衡字符串(Python)

题目描述 均衡串定义:字符串只包含两种字符&#xff0c;且两种字符的个数相同。 给定一个均衡字符串&#xff0c;请给出可分割成新的均衡子串的最大个数。 约定字符串中只包含大写的’X"和’Y’两种字符。 输入描述 均衡串:XXYYXY 字符串的长度[2,10000]。给定的字符…

10.1 标注、注记图层和注记整体说明

文章目录 前言标注、注记图层和注记QGis中的标注QGis中的注释(Annotation)图层QGis中的注记 总结 前言 介绍标注、注记图层和注记说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 标注、注记图层和注记 有时地图需要使用一些文字信息说明其中的地理要素或其…