Docker的实际应用

news/2024/4/20 14:45:36/文章来源:https://blog.csdn.net/anran_06/article/details/130377764

一、 数据持久化

我们什么情况下要做数据持久化呢? 一定是在做容器之前先预判好哪些文件是要永久存储的,
而不会跟着它容器的一个生命周期而消失。

比如说配置文件、 日志文件、 缓存文件或者应用数据等等。 数据初始化有三种类型。 第一种
volumes, 这个是最推荐的, 也是最好的一种方式。 第二种是 bind—mount, 第三种是 tmpfs。

方式一: volumes

是官方比较推荐也是大型的集群比较常见的一种方式。 可以理解为在自己的宿主机或者云端或者在某一个区域创建一块磁盘专门去存放容器里的数据或文件。 把这个容器里边的数据或者文件还有目录等都规划好, 再去启动容器。 正常在老一些的版本里边首先必须要去创建 volumes,否则是没有办法创建成功的。 新版本好像不写命令也可以创建成功, 具体可以查询官方关于 volumes 的文档

使用:

docker volume create test1
docker run -itd -p 8800:80 -v test1:/usr/share/nginx/html nginx:v1
创建: docker volume create
删除某个卷: docker volume rm 卷名
删除所有未使用的卷: docker volume prune
列出所有卷: docker volume ls
查看某个卷的信息: docker volume inspect 卷名
挂载到容器: -v 或–volume。 如果是 Docker17.06 或更高: 推荐使用–mount。 (同 bind mount)
挂载类型: key 为 type, value 为 bind、 volume 或 tmpfs
挂载源: key 为 source 或 src, 对于命名卷, value 为卷名, 对于匿名卷, 则忽略
容器中的挂载点: key 为 destination、 dst 或 target, value 为容器中的路径
读写类型: value 为 readonly, 没有 key
volume-opt 选项, 可以出现多次。 比如 volume-driver=local,volume-opt=type=nfs,…
第一个域: 对于命名卷, 为卷名; 匿名卷, 则忽略, 此时会创建匿名卷
第二个域: 容器中的挂载点
第三个域: 可选参数, 由’ ,'隔开, 如 ro
-v 或—volume: 由 3 个域组成, ’ :’ 分隔
—mount: 由多个’ ,’ 隔开的键值对组成

方式二: bind—mount

将宿主机中的文件、 目录 mount 到容器上。 质上是宿主机、 container 之间共享宿主机文件系
统。 这种持久化方法更导致 container 与宿主机的耦合过于紧密, 所以不推荐使用。

使用:

docker run -itd -p 8801:80 -v /var/log/cont/apache1:/var/log/httpd/
apache:new2
挂载到容器: -v 或—volume。 如果是 Docker17.06 或更高: 推荐使用—mount。 (同 volume
s)
-v 或–volume: 由 3 个域组成, ’ :'分隔
第一个域: 对于命名卷, 为卷名; 匿名卷, 则忽略, 此时会创建匿名卷
第二个域: 容器中的挂载点
第三个域: 可选参数, 由’ ,'隔开, 如 ro
–mount: 由多个’ ,'隔开的键值对=组成:
挂载类型: key 为 type, value 为 bind、 volume 或 tmpfs
挂载源: key 为 source 或 src, value 为主机中文件或目录的路径
容器中的挂载点: key 为 destination、 dst 或 target, value 为容器中的路径
读写类型: value 为 readonly, 没有 key
bind-propagation 选项: key 为 bind-propagation, value 为 rprivate、 private、 rshared、shared、 rslave 或 slave

方式三: tmpfs

将数据存于宿主机内存中。 docker 可将用户名与密码等敏感数据保存在某个数据库中, 当启动需要访问这些敏感数据的 container 或者 service 时, docker 会在宿主机上创建一个 tmpfs,然后将敏感数据从数据库读出写到 tmpfs 中, 再将 tmpfs mount 到 container 中, 安样能保证数据安全。 当容器停止运行时, 则相应的 tmpfs 也从系统中删除。

docker run -itd --name tmptest --tmpfs /root nginx:latest

案例一

1、查看 busybox 镜像,确保是官方镜像

[root@template ~]# docker search busybox

2、拉取并查看镜像

[root@template ~]# docker pull busybox
[root@template ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
busybox      latest    7cfbbec8963d   5 weeks ago   4.86MB
[root@template ~]# docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
busybox      latest    7cfbbec8963d   5 weeks ago   4.86MB

3、给镜像创建一个软链接并改名 box:v1 并检查是否成功

[root@template ~]# docker tag busybox:latest box:v1
[root@template ~]# docker tag busybox:latest box:v2
[root@template ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
box          v1        7cfbbec8963d   5 weeks ago   4.86MB
box          v2        7cfbbec8963d   5 weeks ago   4.86MB
busybox      latest    7cfbbec8963d   5 weeks ago   4.86MB

查看 ImageID,如果一样则软连接成功

4、删除 box:v2 镜像

[root@template ~]# docker rmi box:v2

至此, 第一个案例就此完成。

案例二

1、下载 centos:7 镜像。并用该镜像启动容器,命名为 centostest,暴露 6446

宿主机端口, 映射容器内 999 端口

[root@template ~]# docker run -it -d --name centostest -p 6449:999 centos:7

2、查看容器是否启动成功

[root@template ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
busybox      latest    7cfbbec8963d   5 weeks ago     4.86MB
centos       7         eeb6ee3f44bd   19 months ago   204MB
[root@template ~]# docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS                                     NAMES
d080931aaf96   centos:7   "/bin/bash"   28 seconds ago   Up 27 seconds   0.0.0.0:6449->999/tcp, :::6449->999/tcp   centostest

3、将宿主机/root/test.txt,复制到容器内/usr/local/

[root@template ~]# touch /root/test.txt
[root@template ~]# docker cp /root/test.txt centostest:/usr/local

4、进入容器查看是否cp过来

[root@template ~]# docker exec -it centostest /bin/bash
[root@d080931aaf96 /]# ll /usr/local/

5、再从该容器内的/root/study.txt 文件复制到宿主机/tmp

[root@d080931aaf96 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  study.txt  sys
[root@d080931aaf96 /]# exit
exit
[root@template ~]# docker cp centostest:/study.txt  /tmp
Successfully copied 1.536kB to /tmp
[root@template ~]# ll /tmp/
total 0
-rw-r--r--. 1 root root 0 Apr 25 20:58 study.txt

6、删除该容器前先停止容器

[root@template ~]# docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS                                     NAMES
d080931aaf96   centos:7   "/bin/bash"   11 minutes ago   Up 11 minutes   0.0.0.0:6449->999/tcp, :::6449->999/tcp   centostest
[root@template ~]# docker stop centostest
centostest
[root@template ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
busybox      latest    7cfbbec8963d   5 weeks ago     4.86MB
centos       7         eeb6ee3f44bd   19 months ago   204MB

7、删除容器和镜像

[root@template ~]# docker rmi centos:7
[root@template ~]# docker images
[root@template ~]# docker ps -a

Dockerfile

1.概述

dockerfile 可以理解为一个制作镜像的脚本, 但远没有脚本复杂。 他根据某种格式自定义内容,就可以快速创建出需求的镜像。

docker 容器启动的时候在最上层挂载了一个可写层, 比如说我在容器里面创建一个文件, 这个文件是存放在可写层的, 这时候容器要是销毁了, 那么我们对容器的一些写入操作也就没了,我这个文件也会随着容器销毁而销毁了, 我们要是想要保存我们对容器的一些写入操作的话,可以使用 commit 命令然后将容器制作成一个镜像, 这样下次 run 起来该镜像的时候, 我们之前的写入操作就还存在了。

除了使用 commit 方式制作镜像, 还有一种方式就是编写 Dockerfile 然后使用 build 命令来制作镜像了。

2.Dockerfile 的规则

格式:
指令建议要大写, 内容小写

执行顺序:
docker 是按照 Dockerfile 指令顺序依次执行的, 也就是说从上到下

3.指令

1) FROM: 底层镜像(如系统)
这个 FROM 指令是 dockerfile 的第一个指令, 然后指定了基础镜像, 后面的所有指令都是运行在该基础镜像环境上的 MAINTAINER 该指令是描述的维护者信息。底层的系统镜像用的是什么, 使用 from 指定, 绝大部分情况都用的底层有个系统或者基础的环境用的是什么, 对 docker 不熟练使用 centos 镜像即可。

2) RUN: 构建时容器内运行的命令。
RUN 指令用于在容器中执行命令。 我们常用来安装基础软件。
镜像安装软件依赖包都可以放在 run 中。

3) COPY: 复制 docker 目录中的文件到镜像中。
COPY 指令类似 ADD 指令, 但是 ADD 指令范围更广些, ADD 能够自动解压文件, 能够访问网络资源, 而 COPY 指令做不到。
非目录需要重新指定, 放在目录中非常便利, 属于好的一种习惯, 值得推荐使用目录。

4) ADD: 复制 docker 目录中的文件到镜像中。 (过程可以解压)
ADD 指令是用来将宿主机某个文件或目录放到(复制) 容器某个目录下面。
官方不推荐 ADD,高级复制功能, 需求不精准, 推荐使用 COPY。

5) EXPOSE: 声明开放端口。
EXPOSE 指令用于暴露容器里的端口, 我们在 3.5 里面演示过了, nginx 暴露的端口是 80, 但是启动容器的时候需要指定宿主机端口来映射你暴露的端口。 需要暴露多个端口的话可以使用
多个 EXPOSE, 也可以一个 EXPOSE 指令后面跟多个端口, 端口之间用空格隔开。声明不是变更, 变更使用-p 构建容器时候使用。

6) ENV: 设置环境变量。
ENV 指令是用于设置环境变量的 。
底层环境变量需要需提前设置。

7) CMD: 容器启动时执行的命令, 最多只能执行一条。
CMD 指令是你在容器启动的时候帮你运行的命令, 而 RUN 这个指令是构建镜像的时候帮你运行的命令。
容器启动时执行命令, 最多执行一条。

8) WORKDIR: 声明工作目录。 类似 cd。
WORKDIR 是指下面的指令都在 WORKDIR 指定目录下面工作, 这个与 linux 里面的 cd 差不多。
切换目录使用 WORKDIR。
做容器轻量级最好, 比较小就很好, 使用一条命令就不要使用两天命令。

dockerfile案例

1、用 dockerfile 创建并启动一个 centos 的 apache 镜像。 指定自定义内容

[root@template ~]# mkdir dockerfile
[root@template ~]# cd dockerfile/
[root@template dockerfile]# mkdir apache
[root@template dockerfile]# cd apache/
[root@template apache]# vim dockerfile
[root@template apache]#
[root@template apache]# echo "test page ..." >  index.html[root@template apache]# cat dockerfile
FROM centos:7
RUN yum -y install httpd
EXPOSE 80
COPY index.html /usr/share/httpd/noindex/index.html
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

2、构建镜像

[root@template apache]# docker build -t apache:v1 .

3、测试

[root@template apache]# docker run  -it -d --name web1 -p345:80  apache:v1
ee9f31c43a84190d3db5dd85d6d53e799c16224eab5ea18ecabc96c411cc4e71
[root@template apache]# docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                 NAMES
ee9f31c43a84   apache:v1   "/usr/sbin/httpd -D …"   6 seconds ago   Up 6 seconds   0.0.0.0:345->80/tcp, :::345->80/tcp   web1

4、浏览器测试

5、用 dockerfile 创建并启动一个 centos7 的 nginx 镜像

[root@template apache]# cat dockerfile
FROM centos:7
RUN rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
RUN yum -y install nginx
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
[root@template apache]# docker build -t nginx:v1 .
[root@template apache]# docker run  -itd --name web2 -p 789:80 nginx

构建过程

测试截图

最后放平心态, 为自己赚一个好未来,准备秋招,好好沉淀

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

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

相关文章

什么是分库分表?为什么需要分表?什么时候分库分表

不急于上手实战 ShardingSphere 框架,先来复习下分库分表的基础概念,技术名词大多晦涩难懂,不要死记硬背理解最重要,当你捅破那层窗户纸,发现其实它也就那么回事。 什么是分库分表 分库分表是在海量数据下&#xff0…

SCI论文自由投稿Vs专栏投稿,哪个更好中?

我们首先来看下以下几种期刊的发表方式: 正刊 正刊也就是自由投稿方式的发表方式,是期刊正常出版的期刊,比如一本SCI期刊是双月刊,一年出版6期,没有设定主题,包含多个研究方向的文章。每年按照半月/月/双…

100种思维模型之指数对数思维模型-54

对数、指数,生活中的2种增长曲线;对数增长曲线,即在开始时增长很快,但随着时间的推移,收益会减少并变得更加困难;而指数增长曲线,即开始时增长缓慢,但随着时间的推移,收益…

word表格

1 样式入口 插入新的表格 “插入”选项卡 > “表格”光标放在表格内 > 出现“表格工具”选项卡“表设计”选项卡 > “表格样式”栏目 > 在随便一个样式上右键 > 弹出“右键菜单” 常用的是“新建/修改/删除表格样式““设为默认值”:将指定样式设为…

Android studio 使用入门

安装 安装JDK https://www.oracle.com/java/technologies/downloads/ 新增变量JAVA_HOME,值为JDK安装根目录 在path中增加 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 安装 Android studio https://developer.android.google.cn/studio/ 注意:路径尽量不要包…

每日学术速递4.25

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Long-Term Photometric Consistent Novel View Synthesis with Diffusion Models 标题:具有扩散模型的长期光度一致的新视图合成 作者:Jason J. Yu, Feresh…

Python 数据存储 ---->方式

我的个人博客主页:如果’真能转义1️⃣说1️⃣的博客主页 关于Python基本语法学习---->可以参考我的这篇博客:《我在VScode学Python》 数据存储是指在数据加工处理过程中将产生的临时文件或加工结果以某种格式保存。 常用的数据存储格式包括 TXT、Exc…

Ansys Zemax | 设计抬头显示器时要使用哪些工具 – 第一部分

本文演示了如何使用OpticStudio工具设计分析抬头显示器(HUD)性能,即全视场像差(FFA)和NSC矢高图。(联系我们获取文章附件) 初始结构 HUD简介 以下为HUD的示意图。液晶显示器作为光源发光,光线被HUD的两个反射镜反射,然后通过风挡玻璃反射&am…

【MySQL】MES中,发货计划取数逻辑

系列文章 C#底层库–MySQLBuilder脚本构建类(select、insert、update、in、带条件的SQL自动生成) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库操作辅助类(推荐阅读&#xff0…

聊聊 IP packet 的 TTL 与 tcp segment 的 MSL

聊聊 IP packet 的 TTL 与 tcp segment 的 MSL 1 前言 - 网络知识的重要性 近几年在排查解决应用系统在客户现场遇到的复杂问题时,越来越觉得除了扎实的LINUX操作系统知识,对TCP/IP网络知识的深入理解也是至关重要的。 有鉴于此,后续笔者会…

启英泰伦智能语音芯片在语音控制吸顶灯上的应用解决方案

随着智能控制技术的不断发展,人们对于家用电器的功能需求越来越多,智能吸顶灯是一种常见的照明设备,通常被安装在室内房顶上面,除了具有传统吸顶灯的照明功能外,还添加了智能控制和自动化功能,如远程控制、…

必须要知道的hive调优知识(下)

Hive如果不用参数调优,在map和reduce端应该做什么 1、map阶段优化 Map阶段的优化,主要是确定合适的map数。那么首先要了解map数的计算公式 num_reduce_tasks min[${hive.exec.reducers.max}, (${input.size}/${hive.exec.reducers.bytes.per.reducer…

《一次性分割一切》阅读笔记

目录 0 体验 1 摘要 2 十个问题 参考文献 0 体验 体验地址:SEEM - a Hugging Face Space by xdecoder 体验结果: 将哈士奇和汽车人从图片中分割出来。 1 摘要 尽管对于交互式人工智能系统的需求不断增长,但在视觉理解(例如…

Qt5.9学习笔记-事件(一)

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三…

对git的简单总结

Git的基本使用 配置用户名和邮箱常见的操作查看仓库的状态远端仓库整体流程分支本地分支命令远端分支命令 这几天在做毕业设计,需要用到git,所以简单总结一下git的基本使用。 配置用户名和邮箱 git config --global user.name "Your Name" g…

ai模型训练生成效果 chilloutmix_NiPrunedFp32Fix.safetensors

模型名称: chilloutmix_NiPrunedFp32Fix.safetensors 关键词 extremely detailed CG unity 8k wallpaper,(masterpiece),(best quality),(ultra detailed),(ultra realistic),(Best character details:1.2),dynamic angle,professional lighting, photon mapping, …

【22-23 春学期】人工智能基础--AI作业6-误差反向传播

老师发布作业链接:(429条消息) 【22-23 春学期】AI作业6-误差反向传播_HBU_David的博客-CSDN博客 目录 老师发布作业链接:(429条消息) 【22-23 春学期】AI作业6-误差反向传播_HBU_David的博客-CSDN博客 1.梯度下降 2.反向传播 3.计算图 4.使用Numpy…

【代理设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

简介 代理模式(Proxy Pattern)是一种结构型设计模式,用一个类来代理另一个类或几个类的功能。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 延迟初始化(虚拟代理)。如…

FPGA基础知识 LCMXO3LF-6900C-6BG400I FPGA可编程逻辑简介

FPGA是英文Field-Programmable Gate Array的缩写,即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定…

喜报 | ScanA内容安全云监测获评“新一代信息技术创新产品”

4月20日,在赛迪主办的2023 IT市场年会上,“年度IT市场权威榜单”正式发布。 知道创宇的ScanA内容安全云监测产品荣获“新一代信息技术创新产品”奖项。作为中国IT业界延续时间最长的年度盛会之一,历届IT市场年会公布的IT市场权威榜单已成为市…