docker1

前言

技术架构

单机架构

应用数据分离架构

应用服务集群架构



读写分离/主从分离架构


写入主的时候,要同步Mysql从的数据才可以

冷热分离架构


写的时候要写入主和缓存数据库

读的时候先去缓存看有没有,没有的话就去从数据库读数据

主要就是看这个数据是冷门的还是热门的了

缓存数据库就是redis

这个热点的返回数据非常快

缺点就是万一一个表数据太多了,有千万级别,那么一个数据库存的数据就太多了

垂直分库架构

就是分库分表

可以用mycat,tddl来分库分表



我们可以直接用分布式数据库了

最下面的都是集群的东西

数据库都采用了集群化

缺点就是:我们改代码的时候就要停服,重新发布版本

微服务架构





容器编排架构


容器与容器之间不会冲突



如果没有k8s的话,就会布置很多微服务,要把jar包布置6份

有k8s,直接一键式布置这6个微服务,只需要一份,就可以一键式

不然就要慢慢布置了



实战架构

Docker使用

容器技术发展史

jail时代

云时代

云:分布式的

隔离已经用Linux实现了

资源隔离

解决海量数据处理

云原生时代:k8s,docker

虚拟化与容器化

笔记本电脑就是物理机

一台操作系统上装了很多操作系统就是虚拟化

虚拟化出来的叫做虚拟机

容器化:就是虚拟的软件层,操作系统的虚拟化,虚拟化的一种

docker是容器化的一种

虚拟化容器化优点:资源利用率高,因为划的很细

环境一致性

资源可以弹性收缩

物理机上可以装不同的操作系统,环境不同

容器比虚拟机启动更快

docker不需要虚拟内核,相当于不用开机了

而且很容易维护和扩展

应用程序执行环境分层

容器是虚拟化的操作系统

虚拟化常见类别

:虚拟机:伪造的硬件层

:JVM:伪造应用程序层和函数库层

常见虚拟化实现:

主机虚拟化实现:模拟了所有的硬件

容器虚拟化实现

这就是主机虚拟化

就是在物理服务器上安装了一个软件,一个虚拟化层,变成可视化的了

容器虚拟化实现

实现原理:操作系统层的虚拟化

容器是轻量级的

而且容器之间是不影响的

资源之间是隔离的

Namespace

可以只让A进程只看到A的资源,B进程只看到B的资源

这些就是隔离的内核资源

意思就是就算是两个进程运行在同一个主机上,但是可以有不同的主机名和域名

两个进程看到的都是80端口

但是却不是同一个端口

NameSpace实战基础知识

dd命令


if=文件名 ------》输入文件名

of=文件名 ------》输出文件名


sync:将每个输入块填充到ibs个字节,不足部分用空NUL字符补齐

生成镜像文件

我们这个是输入文件

dev/zero是系统的一个特殊的文件设备,它会连续不断地产生空白字符流

生成一个空白的镜像文件

bs就是指定大小

count就是产生文件数量

这样我们就产生了空白的文件

加上 -h 选项后,文件大小会以更直观的单位(如 KB、MB、GB 等)来展示

这样就生成了80M的文件
转换为大写

dd if=in.txt of=out.txt conv=ucase

dd就是完成一个读取转换输出的操作

mkfs

用于在设备上创建Linux文件系统,俗称格式化,比如我们使用 U盘的时候可以格式化。

语法

mkfs [-V] [-t fstype] [fs-options] filesys [blocks]

• 参数

-t fstype:指定要建立何种文件系统;如ext3,ext4 ---》磁盘类型ext4 用的比较多

filesys :指定要创建的文件系统对应的设备文件名;

blocks:指定文件系统的磁盘块数。 -V : 详细显示模式

fs-options:传递给具体的文件系统的参数

-v 表示显示详情

• 实例

#将sda6 分区格式化为ext4格式

mkfs -t ext4 /dev/sda6

#格式化镜像文件为ext4

mkfs -t ext4 ./fdimage.img

把我们镜像的文件格式化为磁盘

mkfs -t ext4 ./test.img

这样就完成了

这个命令就是把硬盘u盘或者空白文件格式化

就是创建了一个指定的Linux文件系统

df

df 命令详解

Linux df(英文全拼:disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使

用情况统计。

• 语法

df [OPTION]... [FILE]...----》看这个目录的文件占有情况

• 常见参数

○ -a, --all 包含所有的具有 0 Blocks 的文件系统

○ -h, --human-readable 使用人类可读的格式(预设值是不加这个选项的...)

○ -H, --si 很像 -h, 但是用 1000 为单位而不是用 1024

○ -t, --type=TYPE 限制列出文件系统的 TYPE

○ -T, --print-type 显示文件系统的形式

• 案例

#查看磁盘使用情况

df -h

#查看磁盘的系统类型

df -Th




指定要ext4类型的

打印了类型

df -T /data

这样就是指定目录下的文件系统的详细信息

H与h就是容量的单位变了

mount

mount 命令详解

mount 命令用于加载文件系统到指定的加载点(相当于查u盘的时候,添加了一个盘,windows是自动挂载上去的)。此命令的也常用于挂载光盘,使我们

可以访问光盘中的数据,因为你将光盘插入光驱中,Linux 并不会自动挂载,必须使用

Linux mount 命令来手动完成挂载。

Linux 系统下不同目录可以挂载不同分区和磁盘设备,它的目录和磁盘分区是分离的,

可以自由组合(通过挂载)

不同的目录数据可以跨越不同的磁盘分区或者不同的磁盘设备。

挂载的实质是为磁盘添加入口(挂载点)。

• mount 常见用法

mount [-l]

mount [-t vfstype] [-o options] device dir

• 常见参数

-l:显示已加载的文件系统列表;

-t: 加载文件系统类型支持常见系统类型的 ext3,ext4,iso9660,tmpfs,xfs 等,大部分情况

可以不指定,mount 可以自己识别

-o options 主要用来描述设备或档案的挂接方式。

loop:用来把一个文件当成硬盘分区挂接上系统

ro:采用只读方式挂接设备

rw:采用读写方式挂接设备

device: 要挂接(mount)的设备。就是u盘的文件系统,相当于u盘

dir: 挂载点的目录,挂在哪个目录下面,挂载u盘的地方

• 案例

#将 /dev/hda1 挂在 /mnt 之下。

mount /dev/hda1 /mnt

#将镜像挂载到/mnt/testext4 下面,需要确保挂载点也就是目录存在

mkdir -p /mnt/testext4

mount ./fdimage.img /mnt/testext4

挂载之前需要一个文件系统,就是磁盘

我们可以格式化一下test.img

这个问的是已经有了一个ext4的文件系统

这样就格式化成功了

这样就是一个空白的文件系统了

就可以挂载了

挂载到某个目录就要先创建这个目录

mount ./test.img /data/testmymount/

这个就是把./test.img挂载到/data/testmymount/

df -h就可以查看了

这样我们就把一个空白的镜像文件,挂载成了一个磁盘

然后这个磁盘可以正常的读写

unshare

unshare 命令详解

unshare 主要能力是使用与父程序不共享的名称空间运行程序。就是不共享Namespace

• 语法

unshare [options] program [arguments]

program 是具体的程序--》与父程序不共享命名空间

options是参数

• 常用参数

参数 含义

-i, --ipc 不共享 IPC 空间,进程间通信

-m, --mount 不共享 Mount 空间,文件系统

-n, --net 不共享 Net 空间,网络

-p, --pid 不共享 PID 空间,进程

-u, --uts 不共享 UTS 空间,主机名,网络名

-U, --user 不共享用户,用户信息

-V, --version 版本查看,

--fork 执行 unshare 的进程 fork 一个新的子进程,在子进

程里执行 unshare 传入的参数。启动一个新的子进程,而不是让现在这个进程作为父进程

--mount-proc 执行子进程前,将 proc 目录优先挂载过去

proc 目录下有很多进程,不写这个的话就会看到proc下的所有进程信息

• 案例

#hostname 隔离

root@139-159-150-152:~# unshare -u /bin/bash

root@139-159-150-152:~# hostname test1

root@139-159-150-152:~# hostname

test1

root@139-159-150-152:~# exit

exit

root@139-159-150-152:~# hostname

139-159-150-152

root@139-159-150-152:

我们用的主机隔离

unshare -u /bin/bash

bash是一个程序

现在已经进入了一个子进程的命令空间了

hostname test1

指定主机名

这个是查看主机名

我们在启动一个xshell

可以看到主机名不是新的

这里退出的是子进程

我们发现名字又变回去了

注意如果要显示ip的话

就是要写hostname -I

所以unshare就是做到了命名空间的隔离

PID隔离

  1. 在主机上执行 ps -ef,可以看到进程列表如下,其中启动进程 PID 1 为 init 进程
  2. 我们打开另外一个 shell ,执行下面命令创建一个 bash 进程,并且新建一个 PID
    Namespace:
    --fork 新建了一个 bash 进程,是因为如果不建新进程,新的 namespace 会用 unshare
    的 PID 作为新的空间的父进程,而这个 unshare 进程并不在新的 namespace 中,所
    以会报个错 Cannot allocate memory
    --pid 表示我们的进程隔离的是 pid,而其他命名空间没有隔离
    mount-proc 是因为 Linux 下的每个进程都有一个对应的 /proc/PID 目录,该目录包含
    了大量的有关当前进程的信息。 对一个 PID namespace 而言,/proc 目录只包含当前
    namespace 和它所有子孙后代 namespace 里的进程的信息。创建一个新的 PID
    namespace 后,如果想让子进程中的 top、ps 等依赖 /proc 文件系统的命令工作,还
    需要挂载 /proc 文件系统。而文件系统隔离是 mount namespace 管理的,所以 linux
    特意提供了一个选项--mount-proc 来解决这个问题。如果不带这个我们看到的进程还
    是系统的进程信息。
    Shell
    unshare --fork --pid --mount-proc /bin/bash
  3. 执行 ps -ef 查看进程信息,我们可以看到此时进程空间内的内容已经变了,而且
    启动进程也变成了我们的 bash 进程。说明我们已经看不到主机上的进程空间了,我们
    的进程空间发生了隔离。
    4.执行 exit 退出进程

这里报了一个错

因为我们这里的父进程是shell,它有PID

shell内部新启动的bash进程,看不见shell的信息,因为PID已经发生了隔离,因为是shell

所以bash启动的时候,没有自己的父进程,因为已经隔离了,就会报这个错

如果要正常运行的话,就要床加你一个全新的进程

加一个参数,让你和启动你的这个进程没有什么关系

先exit退出

unshare -p --fork /bin/bash

这样就完成了PID的隔离了

接下来我们来看我们启动的新进程和我们宿主机上的进程是否一样

启动的新进程就是bash

我们再打开另一个xshell

两个均执行ps-ef


我们可以发现进程是一样的说明进程并没有隔离

因为proc目录下有很多进程的PID

执行ps -ef的时候

全部都列了出来

这时候就要用--mount-proc这个了

这个就是执行子进程前,先把proc目录挂载在过去

挂载过去之后,我们的proc目录就没有这些现有的信息了

再次exit

unshare -p --fork --mount-proc /bin/bash

可以发现现在的proc目录下的进程id就很少了

原来的是很多的

现在在执行ps -ef

看的PID为一的就是我们自己指定的程序

这样就实现了PID的隔离

-p表示隔离pid

--fork表示我们要启动新的一个进程

Mount 隔离

  1. 打开第一个 shell 窗口 A,执行命令, df -h ,查看主机默认命名空间的磁盘挂载情
  2. 打开一个新的 shell 窗口 B,执行 Mount 隔离命令
  3. 在窗口 B 中添加新的磁盘挂载
  4. 在窗口 B 挂载的磁盘中添加文件
  5. 查看窗口 B 中的磁盘挂载信息
  6. 查看窗口 A 中的磁盘挂载信息
  7. 查看窗口 B 中的文件信息
  8. 查看窗口 A 中的文件信息,可以看到窗口 B 中新建的文件和磁盘挂载在主机的窗
    口中并没有,说明我们实现了文件系统隔离。
  9. 窗口 B 执行 exit,退出

我们先创建一个mount隔离的进程

unshare --mount --fork /bin/bash

在进程里面创建一个空白文件

dd if=/dev/zero of=data2.img bs=8k count=10240

然后挂载为一个磁盘--》挂载点

先格式化

mkfs -t ext4 ./data2.img

然后就是挂载了

这是我们全部的挂载点

挂载之前我们还要先指定我们挂在点目录

mkdir -p /data/maxhou/data2mount

然后开始挂载

mount -t ext4 ./data2.img /data/maxhou/data2mount/

这样就挂载成功了

df -h

这样就说明了我们完成了data2mount的挂载点的创建了

然后我们在外面能不能看见这个挂载点

df -h

这个就说明了我们创建的挂载点在外面是看不到的,这就是mount隔离

我们在这个挂载点里面写文件

外面都看不见的


可以发现文件根本找不到,但是目录确实可以找到的

这个磁盘的挂载点也是看不见的

往里面放文件别人就看不见了

删除挂载点

使用 umount 命令

语法格式:umount [选项] 挂载点或umount [选项] 设备。例如要卸载/mnt/data这个挂载点,可以执行umount /mnt/data。如果知道挂载的设备,也可以使用umount /dev/sdb1来卸载,前提是/dev/sdb1对应的挂载点没有被其他进程占用。

常用选项

-l:lazy unmount,即延迟卸载。如果设备忙,它会将卸载操作推迟到设备不再忙的时候。

-f:强制卸载,一般在正常卸载失败时使用,但可能会导致数据丢失或文件系统损坏,需谨慎使用。

值得注意的就是,这个挂载点是从根目录开始设置的

与当前所在文件没有关系

当你在执行 rm -fr data 命令时遇到 rm: cannot remove 'data/testmymount': Device or resource busy 错误,这表明 data/testmymount 是一个挂载点,并且当前有进程正在使用该挂载点上的资源,所以无法直接删除它。你可以按照以下步骤解决这个问题:

  1. 确定挂载信息
    使用 mount 命令查看系统的挂载信息,确认 data/testmymount 是否为挂载点以及挂载的设备。
    mount | grep data/testmymount
    这个命令会过滤出与 data/testmymount 相关的挂载信息,你可以从中了解到挂载的设备(例如 /dev/sdb1)等详细内容。
  2. 找出占用挂载点的进程
    使用 lsof 命令找出正在使用该挂载点的进程:
    lsof +D data/testmymount
    该命令会列出所有正在访问 data/testmymount 目录及其子目录的进程。你会看到输出中包含进程的 PID(进程 ID)、进程名等信息。
  3. 终止占用挂载点的进程
    根据上一步得到的 PID,使用 kill 命令终止这些进程。例如,如果 PID 为 1234 的进程正在占用挂载点,你可以执行:
    kill 1234
    如果该进程无法正常终止,可以使用强制终止的方式:
    kill -9 1234
    不过,使用 -9 选项强制终止进程可能会导致数据丢失或其他问题,所以要谨慎使用。
  4. 卸载挂载点
    在终止所有占用挂载点的进程后,使用 umount 命令卸载挂载点:
    umount data/testmymount

如果卸载时仍然提示设备忙,可以尝试使用 umount -l 进行延迟卸载:

umount -l data/testmymount

-l 选项会将卸载操作推迟到挂载点不再被使用时执行。

  1. 删除目录

在成功卸载挂载点后,你就可以安全地删除 data 目录了:

rm -fr data

通过以上步骤,你应该能够解决因挂载点被占用而无法删除目录的问题。

总结

相关推荐
Macle_Chen6 小时前
Mac服务器上创建Docker并安装宝塔环境
服务器·macos·docker
ChinaRainbowSea6 小时前
Linux: Centos7 Cannot find a valid baseurl for repo: base/7/x86_64 解决方案
java·linux·运维·服务器·docker·架构
Hellc0077 小时前
Docker 部署 MongoDB 并持久化数据
mongodb·docker·容器
云上艺旅9 小时前
K8S学习之基础十五:k8s中Deployment扩容缩容
学习·docker·云原生·kubernetes·k8s
三天不学习12 小时前
Windows 系统 Docker Desktop 入门教程:从零开始掌握容器化技术
运维·docker·容器
mumu-hn12 小时前
Docker基础篇——Ubuntu下Docker安装
运维·docker·容器
自律的蜗牛14 小时前
在 Docker 中安装并配置 MySQL
mysql·docker·容器
xy1230614 小时前
Kubernetes (K8s) 集群部署指南:从环境准备到应用部署(脚本部署)
docker·kubernetes
蜜獾云14 小时前
redisinsight 默认端口改成5540了
linux·docker·容器·redisinsight
Golinie20 小时前
【GoTeams】-5:引入Docker
docker·docker-compose·dockerfile