使用记录_Linux和Docker

介绍

为了补充项目开发后部署和运维相关能力,通过自建Linux服务器学习一些相关知识。

(因为过程中包含“白嫖”等可耻行为,所以只记录,不发布)

一、安装CentOS7

准备:闲置笔记本一台(可以使用虚拟机代替,如果使用云服务器,直接跳过前三章节)

下载镜像:https://mirrors.aliyun.com/centos/7/isos/(通过阿里云镜像站下载)

这里使用centos7,常见镜像版本:

DVD — 标准版(含桌面),约4.5个G,新手上路,我选择这个。

Minimal — mini版,(不含桌面),约1个G。

通过UltraISO写入硬盘系统镜像(据说用9.3.6版及以前的会出问题,这里我选择试用最新版,中途无问题,没做排错记录)

接下来,通过写入镜像的U盘给笔记本重做系统,(这里因为是闲置笔记本,所以是硬盘完全格式化,重做单Linux系统。如果打算双系统或者使用虚拟机,操作略有不同,这里不做过多介绍。)

过程: 通过U盘启动后,可选择Install CentOS 7,按“E”,进入编辑。

setparams 'Install CentOS Linux 7' 
linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 xdriver=vesa nomodeset quiet
initrdefi /images/pxeboot/initrd.img

变为

setparams 'Install CentOS Linux 7' 
linuxefi /images/pxeboot/vmlinuz linux dd nomodeset quiet
initrdefi /images/pxeboot/initrd.img

Ctrl+X执行,然后屏幕上就会列出硬盘设备的详细信息,我们从列表中挑出当前作为介质的U盘的代码(比如sda4),然后重起系统,再次进入编辑,修改内容(注意修改成自己的U盘代码)

setparams 'Install CentOS Linux 7'
linuxefi /images/pxeboot/vmlinuz initrd=initrd.img inst.stage2=hd:/dev/sda4 quiet
initrdefi /images/pxeboot/initrd.img

然后Ctrl+X执行,即可进入图形化安装界面。

DVD镜像,默认基本环境是最小化安装(无桌面),所以这里手动选择一些带GUI的服务器。

等待系统安装完成,创建账户,进入系统。截止到写笔记的日期,本人仍然为Linux操作新手,基本指令还需要摸索着来,所以选择了带桌面系统,并且切换为root用户进行操作。

注意,由于是笔记本安装系统做服务器,需要修改一下笔记本合盖时系统状态:

修改 /etc/system/logind.conf 取消HandleLidSwitch=suspend改行注释,并将suspend修改为lock。

至此,一个常规的Linux系统的机器算是装完了。接下来开始边学边用。

执行命令:lsblk 进行查看 硬盘情况

二、配置连接

本人目前并不能很好的掌握Linux系统的常规使用,但是在之前对一些工具有所耳闻,此篇章用于记录工具配置。

1,SSH连接工具:

FinalShell。

Xshell,Xftp。连接Linux系统的和文件传输的软件,官方提供家庭和学校的免费下载链接。

宝塔也有SSH终端,知名度不高,这里不选择使用。

SecureCRT,SecureFX。

Termius。 mac上使用这个,所以windows上也选择了这个。

(目前只是简单使用,差距并未体验到,所以可以按喜好选择)

由于家里和办公室都无法通过外网访问,所以分别在台式机,笔记本,Linux系统笔记本上安装了ZeroTier,这里就可以通过自己工作环境通过分配的虚拟IP直接连接到Linux服务器了,花生壳配置对应端口的内网映射,可以将服务器的对应内容开放外网访问,以后服务器部署项目后又用。

至此,一台自己可用的Linux服务器已经搭建完成了。

通过Xshell连接虚拟IP后,可以通过指令操作服务器了。

三、Linux

Linux的世界里,一切皆文件。

Linux目录结构:级层式树状目录结构

[root@duo /]# ls
bin boot dev etc home install.sh lib lib64 media mnt mydata opt proc root run sbin srv sys tmp usr var www

/bin 常用指令目录

/dev 设备管理

/etc 配置文件

/home 创建普通用户后,会在这里生成对应的文件

/root 系统管理员目录

/lib 动态库

/usr/local 用户安装的很多应用程序都在这个目录

/boot 启动Linux时使用的一些文件

/mnt 临时挂载的别的文件系统

/var 目录中存放着不断扩充的文件,习惯将经常修改的目录放在这里,包括各种日志文件

实操篇

vi和vim编辑器

Linux内置vi编辑器,Vim具有程序编辑能力,相当于vi的增强版。

vi和vim的三种模式:

1,正常模式:打开默认这种模式,其他模式状态按ESC返回该模式。可以使用快捷键。

2,插入/编辑模式: 按i启动,

3,命令行模式:按:启动该模式,可以使用命令来完成 读取、存盘、替换、离开 等操作。

快捷键:

拷贝当前行:yy 拷贝下面5行:5yy

粘贴:p

删除

删除当前行:dd 删除下面3行:3dd

撤销操作:u

文件中查询单词(命令行下 ):/关键字 ,回车 。 输入n 就是查找下一个

显示行号(命令行下 ):set nu 隐藏行号:set nonu

快速到达末行:G 首行:gg

移动到指定行:1,显示行号 2,输入目标行数 3,输入G或者gg

Linux常用命令

关机重启:

shutdown -h now:表示立即关机 halt

shutdown -h 1:表示1分钟后关机

shutdown -r now:立即重启 reboot

sync:把内存数据同步到硬盘,推荐关机或重启前执行一下。

用户登录和注销:

1,尽可能少用root账号登录,系统管理员权限过大,避免误操作造成损失。

推荐使用普通用户登录,可以通过“su - 用户名”来切换成系统管理员身份

2,logout 注销登录

用户管理:

1,添加一个用户:useradd <用户名>

会在/home目录下创建 用户名的文件夹,并且默认情况 会让该用户加入同名用户组

useradd -g <用户组名> <用户名>,将用户指定到目标用户组

2,指定用户的密码:passwd <用户名>

回车之后输入密码。

3,删除一个用户:userdel <用户名>

文件目录管理

pwd:查看当前目录绝对路径

ls:查看当前目录下的内容 -a 显示所有 -l 以列表方式显示

cd <目标路径>:前往目标路径。 ~ 自己的家 .. 上一级

mkdir:创建目录 -p 创建多级目录

touch:创建空文件

cp <源目录> <新目录>:拷贝文件到指定目录 -r 递归复制整个文件夹

rm:删除文件或目录 -r 递归删除 -f 强制删除不提示

mv:移动或重命名 (目录相同为重命名,目录不同为移动)

cat:查看文件 -n 显示行号 (只读,通常与more一起使用 cat -n <文件> | more)

more:分页查看文件 (空格键 翻页,Ctrl+B 上一页,Ctrl+F下一页)

less:分页查看文件,不是全部加载,而是根据显示内容加载,大文件效率高

head:显示文件开头部分内容,默认显示10行 -n 5 显示前5行(数字可变)

tail:显示文件末尾部分内容,默认显示10行 -n 5 显示最后5行 -f 实时追踪文档更新

>:输出重定向 (覆盖写入)

>>:追加写入

echo:输出内容到控制台

ln:软链接,类似于快捷方式 ln -s <源文件> <软链接名>

history:查看执行过的历史命令 history 10 查看最近的10条命令 !10 执行编号10的命令

时间日期类:

date:显示当前日期 +%Y显示当前年 +%m显示当前月 +%d显示当前日

date “+%Y-%m-%d %H:%M:%S” 按格式显示时间,连接符可以自己定

date -s “2020-02-02 02:02:02” 设置时间

cal:以日历的方式显示时间 cal 2020 显示一整年日历

搜索查找类

find:从指定目录内遍历搜索,将符合的文件显示在终端。

find <目录> -name <文件名> 在目录下 按文件名查询,可以使用通配符

find <目录> -user <用户名> 按文件所属用户进行查找

find <目录> -size <文件大小限制> 按文件大小限制查找,+n 大于,-n小于,n等于

grep:过滤查找

| :管道符号,将前一个命令的结果传递给后一个命令处理

压缩和解压

gzip <文件>:压缩文件 后缀 .gz 只压缩文件不压缩目录,不保留原文件
gzip -d <文件>: 解压文件

tar: 打包同时压缩 后缀 .tar.gz 可打包压缩文件目录,保留原文件

zip <文件>: 压缩文件或目录 后缀 .zip 与tar类似,压缩后可被windows识别
unzip <文件>: 解压文件或目录

组管理

Linux中的每个用户必须属于一个组,不能独立于组外。

在Linux中每个文件有 所有者、所在组,其他组的概念。

1,ls -ahl:查看文件或目录所有者、所在组

2,chown <用户名> <文件名> 修改文件所有者,并不改变所在组

3,groupadd <组名>:创建一个组

4,chgrp <组名> <文件名>:修改文件所在组

5,usermod -g <组名> <用户名>:改变用户所在组

6,usermod -d <目录名> <用户名>:改变用户登录的初始目录

权限管理

[root@duo mydata]# ls -l
total 1900
drwxr-xr-x. 5 root root 41 Jul 13 12:40 mysql
drwxr-xr-x. 5 root root 42 Jul 13 12:38 nginx
-rw-r--r--. 1 ljd ljd 1941868 Jul 13 11:25 pgyvpn.rpm
drwxr-xr-x. 5 root root 46 Jul 14 09:36 redis
drwxr-xr-x. 3 root root 21 Jul 20 16:03 tomcat

0~9位说明:

第0位:确定文件类型(d:目录,-:普通文件,l:链接文件,c:字符设备,b:块文件)

第1-3位:所有者权限(r:读权限,w:写权限,-:无权限,x:执行权限)

第4-6位:所属组权限

第7-9位:其他用户权限

.后面数字:目录下文件数

所有者

所在组

文件大小

文件最后修改时间

修改权限

chmod:修改权限 chmod u=rwx,g=rx,o=x 文件/目录名

(u:所有者,g:所在组,o:其他人,a:所有人)

(使用+、-、=变更权限)

(还可以通过数字变更权限:r=4,w=2,x=1)

任务调度

1,crond:任务调度 -e:编辑,-l:显示,-r:删除

磁盘分区

分区的基础概念

1,mbr分区(最多四个主分区,最大支持2TB)

2,gpt分区(支持无限多分区,但是可能被操作系统限制,最大支持18EB)

Linux分区介绍

无论多少个分区,都挂载在根目录。分区只是组成整个文件系统的一部分。

Linux硬盘分为IDE硬盘和SCSI硬盘,目前基本都是SCSI硬盘。

SCSI硬盘的标识符为“sdx”,sd 表示分区所在设备类型,x表示盘号(a为基本盘,b为基本从属盘,c为辅助主盘,d为辅助从属盘)表示分区,1-4是主分区或扩展分区,从5开始时逻辑分区。

lsblk 查看分区挂载情况

添加一块硬盘

1,虚拟机添加硬盘

2,分区 fdisk /dev/sdb

3,格式化 mkfs -t ext4 /dev/sdb1

4,挂载目录 先创建一个目录,然后挂载 mount /dev/sdb1 /newdisk

5,设置自动挂载

vi /etc/fstab 按规则编辑配置文件,

/dev/mapper/centos-root /                         xfs  defaults  0 0
UUID=58f6c38d-be8f-4787-b25d-2331aac9843a /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/sdb1 /mydata/newdisk ext4 defaults 0 0

mount -a 生效

磁盘情况查询

df -h :查询整个系统磁盘使用情况

du -h <目录>:查询指定目录磁盘占用情况 –max-depth=2 子目录深度

Centos调整分区存储大小

例如:将/home下150G 转移到/ 目录下

fdisk -l

查看待挂载硬盘

/dev/sda 274.9 GB
查看物理卷
/dev/mapper/centos-root 53.7 GB
/dev/mapper/centos-home 212.1 GB

1、查看分区大小:df -hl
2、备份home文件:tar cvf /run/home.tar /home
3、终止home文件进程(切换到非home路径下执行这个命令):fuser -km /home
4、卸载home:umount /home
5、删除home所在逻辑卷:lvremove /dev/mapper/centos-home
6、扩大根目录所在的逻辑卷:lvextend -L +150G /dev/mapper/centos-root
7、同步文件:xfs_growfs /dev/mapper/centos-root
8、重建/home文件系统所需要的逻辑卷:lvcreate -L 44G -n /dev/mapper/centos-home
9、创建文件系统:mkfs.xfs /dev/mapper/centos-home
10、挂载/home文件系统:mount /dev/mapper/centos-home
11、恢复/home目录的内容:tar xvf /run/home.tar -C /
12、删除/run下面的备份home文件:rm -rf /run/home.tar

Linux虚拟机增加磁盘大小后如何扩展现有目录空间

例如:lsblk 查看磁盘情况,如何把 sda 中剩余空间 增加到/home文件夹?

sda                                        8:0    0   500G  0 disk  
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 255.5G 0 part
├─centos-root 253:0 0 50G 0 lvm /
├─centos-swap 253:1 0 7.9G 0 lvm [SWAP]
└─centos-home 253:2 0 197.6G 0 lvm /home

步骤1,你可以使用分区管理工具如fdisk或parted来创建新的分区。我将展示如何使用fdisk命令创建新的分区:

fdisk /dev/sda
# 现在你将看到sda的分区表信息。输入 n 来创建一个新分区。
# 选择分区类型。如果你只需将剩余空间用于LVM,你可以选择 p 来创建一个主分区。
# 确定新分区的起始扇区和大小。如果你只需使用默认值以使用整个未分配空间,可以连续按 Enter 键。
# 输入 w 来保存并退出。

步骤2,**将新的分区标记为物理卷(PV)**:使用pvcreate命令将新创建的分区标记为物理卷。

(如果提示Device /dev/sda3 not found.,是因为系统没有识别到新的分区,需要partprobe重新加载一下。 )

pvcreate /dev/sda3

步骤3,**将新的物理卷添加到卷组(VG)**:使用vgextend命令将新创建的物理卷添加到现有的卷组中。

vgextend centos /dev/sda3

步骤4,**扩展逻辑卷(LV)**:使用lvextend命令将/home逻辑卷扩展到新的物理卷上。

lvextend -L +194G /dev/mapper/centos-home

步骤5,重新调整文件系统大小:根据文件系统类型使用适当的工具调整文件系统大小。

xfs_growfs /dev/mapper/centos-home

网络配置

修改配置文件指定固定IP地址,centos7的网络IP地址配置文件在 /etc/sysconfig/network-scripts 文件夹下,ens33网卡对应的配置文件为ifcfg-ens33

vi /etc/sysconfig/network-scripts/ifcfg-ens33

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static" # 使用静态IP地址,默认为dhcp
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="223fbfe1-8732-4032-9cc5-c030dd70b250"
DEVICE="ens33"
ONBOOT="yes" #是否开机启用
IPADDR="192.168.0.58" # 设置的静态IP地址
NETMASK="255.255.255.0" # 子网掩码
GATEWAY="192.168.0.1" # 网关地址
DNS1="119.29.29.29" # DNS服务器

进程管理

1,ps:查看目前系统中哪些正在执行,正在执行的情况

ps -a:显示当前终端的所有进程信息

ps -u:以用户的格式显示进程信息

ps -x:显示后台进程运行的参数

2,kill:终止进程

kill <选项> <进程号> :通过进程号杀死进程。

-9:强制终止

killall <进程名称>:通过进程名称杀死进程,支持通配符。

3,pstree:查看进程树 -p 显示进程PID -u显示进程所属用户

服务管理

服务(service)本质就是线程,但是运行在后台,通常会监听某一端口,等待其他程序请求

systemctl <服务名> [start|stop|restart|reload|status] :操作某一服务

systemctl enable <服务名>:设置服务开机启动

监控

top:监控进程,默认3秒刷新一次

netstat -anp:监控网络

RPM和YUM

RPM(Red-Hat Package Manager)

rpm -qa | grep <软件包名称>:查询软件包是否安装

rpm -qi <软件包名称>:查询软件安装详情

rpm -ql <软件包名称>:查询软件包中的文件所在位置

rpm -qf <文件名>:查询文件属于哪个软件包

rpm -e <软件包名称>:卸载软件包

rpm -ivh <软件包全路径名称>:安装软件包 install 安装 verbose 提示 hash 进度条

Yum是一个shell前端的软件包管理器。能够从指定远程服务器自动下载包rpm包并安装,并且一次性安装所有依赖。

yum list | grep <软件名>:查询yum服务器上有没有这个软件

yum install <软件名>:安装软件,默认安装最新版本

Shell编程

shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至编写一些程序。

快速入门:

1,脚本以#!/bin/bash开头

2,脚本需要有执行x权限

3,无执行权限 可以通过 sh <脚本文件>,来执行。

四、Docker

开发者学运维,基本都是项目部署驱动学习方向,所以,学Docker是目标,Linux是前置技术,边学边掌握。虽然Windows上也可以用Docker,但是还是跟随主流吧。

1,安装Docker,官网已经很详细了。按照步骤执行对应指令即可。

yum install -y yum-utils

yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#这里已经 替换为阿里云的镜像地址

yum makecache fast

yum install docker-ce docker-ce-cli containerd.io

2,配置阿里云容器镜像加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://z5mv7pwy.mirror.aliyuncs.com"],
"bip": "192.168.200.1/24"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

这里是按照阿里云服务器的容器镜像加速配置进行配置,由于我用的自建Linux系统,配置后是否有加速效果,还未考证。

问题记录

1,宿主机无法访问容器里的服务
curl http://127.0.0.1
报错curl: (56) Recv failure: Connection reset by peer

原因:docker网卡地址冲突 (其中: brctl命令需要安装: yum install -y bridge-utils)

sudo service docker stop
sudo ip link set dev docker0 down %关闭docker虚拟网卡
sudo brctl delbr docker0
sudo iptables -t nat -F POSTROUTING
sudo brctl addbr docker0
sudo ip addr add 192.168.200.1/24 dev docker0
sudo ip link set dev docker0 up %开启docker虚拟网卡
vi /etc/docker/daemon.json
#daemon.json
{"registry-mirrors": ["http://224ac393.m.daocloud.io"],
"bip": "192.168.200.1/24"
}

systemctl restart docker
2,宿主机映射docker容器端口后,宿主机防火墙未开放该端口,外网仍然可以访问。

linux 有两种防火墙:iptables 和 firewall,一般用宝塔或者下面命令都是在firewall中开启对应端口

firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload

原因:docker run新容器的时候 在iptables 新建规则,将容器映射端口开放给0.0.0.0/0 (所有)

如果想要关闭公网访问 需要手动 删除规则

iptables -D DOCKER 2

iptables -D DOCKER 3

3,学习常用的Docker命令

可视化

docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

容器的数据卷使用——MySQL同步数据

docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

Dockerfile 和 docker-compose.yml的区别

Dockerfile 是拿来构建自定义镜像的,并没有直接生成容器。

docker-compose.yml 文件是做容器编排以部署环境,里面包含使用各种镜像创建的容器服务,使用的镜像可以是网络上的,也可以是根据使用Dockerfile文件来生成的镜像。

Dockerfile(脚本)

使用Dockerfile为SpringBoot项目构建docker镜像

Dockerfile 部分指令:

// FROM 指定基础镜像
FROM nginx

// RUN 执行命令。每一条 RUN 都会生成一层,一个需求尽量使用&&,这样就减少了 RUN ,即减少了分层
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
RUN yum update && yum install -y vim python-dev

// COPY: 源路径下的 package.json 复制到新一层的镜像路径/usr/src/app
COPY package.json /usr/src/app/

// WORKDIR 指定工作目录。指定下层工作的目录为容器内的/data,尽量使用绝对目录
WORKDIR /data

// ADD 添加,ADD能自动解压文件。以下例子最终 hello 在/data/test 下
WORKDIR /data
ADD hello test/

// COPY 拷贝 与ADD类似,只是不能解压缩文件。
WORKDIR /DATA
COPY hello test/

// CMD 执行命令
CMD ["python", "app.py"]

// ENV 设置环境变量 定义 NAME=Happy Feet,那么之后就可以使用 $NAME 来执行了
ENV VERSION=1.0 DEBUG=on NAME="Happy Feet" // VOLUMES挂载

// EXPOSE 端口暴露
EXPOSE <端口1> [<端口2>...]
Docker compose

docker-compose 是官方开源项目,负责实现对 Docker 容器集群的快速编排,部署分布式应用。通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)

下载Docker Compose

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

修改该文件的权限为可执行:

chmod +x /usr/local/bin/docker-compose
docker-compose version			%查看是否成功

一般使用步骤

1、创建一个空目录。
2、定义 Dockerfile,方便迁移到任何地方
3、编写 docker-compose.yml 文件
4、运行 docker-compose up 启动服务、docker-compose down 关闭服务

编写docker-compose.yml文件

Docker Compose将所管理的容器分为三层,工程、服务及容器。docker-compose.yml中定义所有服务组成了一个工程,services节点下即为服务,服务之下为容器。容器与容器直之间可以以服务名称为域名进行访问,比如在mall-tiny-docker-compose服务中可以通过jdbc:mysql://db:3306这个地址来访问db这个mysql服务。

示例:

version: '3'
services:
# 指定服务名称
db:
# 指定服务使用的镜像
image: mysql:5.7
# 指定容器名称
container_name: mysql
# 指定服务运行的端口
ports:
- 3306:3306
# 指定容器中需要挂载的文件
volumes:
- /mydata/mysql/log:/var/log/mysql
- /mydata/mysql/data:/var/lib/mysql
- /mydata/mysql/conf:/etc/mysql
# 指定容器的环境变量
environment:
- MYSQL_ROOT_PASSWORD=root
# 指定服务名称
mall-tiny-docker-compose:
# 指定服务使用的镜像
image: mall-tiny/mall-tiny-docker-compose:0.0.1-SNAPSHOT
# 指定容器名称
container_name: mall-tiny-docker-compose
# 指定服务运行的端口
ports:
- 8080:8080
# 指定容器中需要挂载的文件
volumes:
- /etc/localtime:/etc/localtime
- /mydata/app/mall-tiny-docker-compose/logs:/var/logs

Docker问题排查:

问题发现:
发版时构建失败(不稳定),
问题分析:
构建编译打包阶段命令执行成功,目标服务器build命令或run命令出问题.
目标服务器中直接执行命令,报磁盘空间不足, 具体分析发现docker目录下磁盘占用非常大

分析磁盘占用参考命令:

1.查看大文件命令:find . -size +500M (只适合当前目录)  

2.du -sh : 查看当前目录总共占的容量。不单独列出各子项占用的容量

3.df -h:查看整体磁盘使用情况、

4.du -lh --max-depth=1 : 查看当前目录下一级子文件和子目录占用的磁盘容量。

5.find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr 查找"/"目录下所有大于100M的所有文件

有效信息如下: 通过查看,主要是 docker目录下vfs文件夹很大

[root@localhost ~]# cd /home/docker  
[root@localhost docker]# du -lh --max-depth=1
104M   ./containers
0       ./plugins
198G   ./vfs
12M     ./image
24K     ./volumes
96K     ./network
0       ./swarm
7.6M   ./buildkit
0       ./tmp
0       ./runtimes
199G   .

思考过程, 多台相同配置, 环境类似的服务器, 仅这一个有次问题, 要对比一下docker配置差异.

对比 docker info发现差异
Storage Driver: devicemapper
Storage Driver: vfs

Storage Driver 不同, 并且 Storage Driver配置为 vfs, 此文件夹会随着时间很快被占用.

临时解决方案如下:

docker system prune -a   清理 docker 容器

暂定方案:

编辑daemon.json追加配置修改storage-driver
vi /etc/docker/daemon.json

{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"],
"storage-driver":"devicemapper"
}

扩展:

1,docker安装方式相同, 并且在/usr/lib/systemd/system/docker.service和 /etc/docker/daemon.json 都没有发现相关额外配置,为啥Storage Driver的默认配置会不同? 是与版本差异么?

一个是23.0.1 一个是 20.10.17

2,Storage Driver的vfs模式, 明细感觉对磁盘的利用方式不一样,有何优势?

2.1 Docker Storage Driver的devicemapper和vfs模式是两种不同的存储驱动程序,它们各自具有一些优势和特点。
Devicemapper是一种高级存储管理器,它使用了Linux内核提供的设备映射技术。它的优势在于支持高级的存储功能,如快照和克隆。Devicemapper还可以使用不同的存储池来管理容器的镜像和数据,提供了更好的隔离性和可管理性。然而,使用Devicemapper可能需要更多的配置和管理工作,并且在处理大量写入操作时可能会出现性能瓶颈。
VFS(Virtual File System)是Docker的默认存储驱动程序,它直接使用主机操作系统的文件系统来管理容器的镜像和数据。VFS的优势在于简单易用,无需额外的配置和管理。它适用于开发和测试环境,但在生产环境中可能会遇到性能和可扩展性方面的限制。 综上所述,Devicemapper适用于需要高级存储功能和更好隔离性的场景,但需要更多的配置和管理。而VFS适用于简单的开发和测试环境。选择哪种存储驱动程序取决于您的具体需求和环境。

2.2 在多次构建镜像后,Devicemapper对主机磁盘的占用较少,而VFS占用较多的原因是它们的存储机制不同。
Devicemapper使用了写时复制(Copy-on-Write)的机制。当使用Devicemapper构建镜像时,它会创建一个基础镜像和一个写入层。每次构建镜像时,只有更改的部分会被写入到写入层,而不会对基础镜像进行修改。这样可以节省磁盘空间,因为多个镜像可以共享相同的基础层。因此,Devicemapper对主机磁盘的占用相对较少。 相反,VFS直接使用主机操作系统的文件系统来管理镜像和数据。每次构建镜像时,VFS会在主机文件系统上创建一个完整的镜像副本,包括所有的更改和文件。这导致每个构建都会占用更多的磁盘空间,因为每个镜像都是完整的副本。 因此,如果您需要在多次构建镜像后节省磁盘空间,Devicemapper可能是更好的选择。但请注意,Devicemapper可能需要更多的配置和管理工作,并且在处理大量写入操作时可能会出现性能瓶颈

3,网上有主动指定vfs模式的配置教程,相关参数具体作用是什么?

{
“storage-driver”: “vfs”,
“storage-opts”: [“size=256M”]
}


2024年8月6日14:00:00
Linux虚拟机 yum update报错:

Loading mirror speeds from cached hostfile
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; 未知的错误"


One of the configured repositories failed (未知),
and yum doesn't have enough cached data to continue. At this point the only
safe thing yum can do is fail. There are a few ways to work "fix" this:

1. Contact the upstream for the repository and get them to fix the problem.

2. Reconfigure the baseurl/etc. for the repository, to point to a working
upstream. This is most often useful if you are using a newer
distribution release than is supported by the repository (and the
packages for the previous distribution release still work).

3. Run the command with the repository temporarily disabled
yum --disablerepo=<repoid> ...

4. Disable the repository permanently, so yum won't use it by default. Yum
will then just ignore the repository until you permanently enable it
again or use --enablerepo for temporary usage:

yum-config-manager --disable <repoid>
or
subscription-manager repos --disable=<repoid>

5. Configure the failing repository to be skipped, if it is unavailable.
Note that yum will try to contact the repo. when it runs most commands,
so will have to try and fail each time (and thus. yum will be be much
slower). If it is a very temporary problem though, this is often a nice
compromise:

yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true

Cannot find a valid baseurl for repo: base/7/x86_64

经过排查,虚拟机可访问外网,但还是是用不了yum命令,说明是yum镜像没有了,那么就得下载一个来更新。
在安装完CentOS后一般需要修改yum源,才能够在安装更新rpm包时获得比较理想的速度。国内比较快的有阿里源、163源。这里以阿里源为例子。

  1. cd /etc/yum.repos.d
  2. mv CentOS-Base.repo CentOS-Base.repo.backup
  3. wget https://mirrors.aliyun.com/repo/Centos-7.repo
  4. mv Centos-7.repo CentOS-Base.repo
  5. yum clean all