centos7 乱码

 

centos7  乱码

查看
[root@centos7-clone-001 ~]# echo $LANG
en_US.UTF-8
[root@centos7-clone-001 ~]# locale
LANG=en_US.UTF-8
LC_CTYPE=”en_US.UTF-8″
LC_NUMERIC=”en_US.UTF-8″
LC_TIME=”en_US.UTF-8″
LC_COLLATE=”en_US.UTF-8″
LC_MONETARY=”en_US.UTF-8″
LC_MESSAGES=”en_US.UTF-8″
LC_PAPER=”en_US.UTF-8″
LC_NAME=”en_US.UTF-8″
LC_ADDRESS=”en_US.UTF-8″
LC_TELEPHONE=”en_US.UTF-8″
LC_MEASUREMENT=”en_US.UTF-8″
LC_IDENTIFICATION=”en_US.UTF-8″
LC_ALL=

检查CRT设置

微信图片_20220827181507

 

vi /etc/sysconfig/i18n  粘贴
LANG=”zh_CN.UTF-8″
vi /etc/profile  粘贴
export LANG=”zh_CN.UTF-8″

重启

linux命令 expr

expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。

–格式为:

expr Expression(命令读入Expression 参数,计算它的值,然后将结果写入到标准输出)

–参数应用规则:

用空格隔开每个项;

用 \ (反斜杠) 放在 shell 特定的字符前面;

对包含空格和其他特殊字符的字符串要用引号括起来

–expr用法实例讲解:

(1)、计算字串长度

格式: expr length ‘字符串’

[root@kk bkeep]# expr length "bkeep zbb"   //包含空格在内

9

[kang@master scripts]$ expr length 'thisisatestformela'

18

[kang@node1 ~]$ expr length 'hello world'

11

(2)、抓取字串  

格式:expr substr ‘字符串’  开始字符 字符数量

[root@kk bkeep]# expr substr "bkeep zbb" 4 9

ep zbb

[kang@master scripts]$ expr substr 'thisisatestformela' 5 9

isatestfo

[kang@master scripts]$ expr substr 'thisisatestformela' 5 2

is

[kang@node1 ~]$ expr substr 'hello world' 5 7

o world

[kang@node1 ~]$ expr substr 'hello world' 5 3

o w

(3)、抓取第一个字符数字串出现的位置

 

格式: expr index ‘字符串’ 查找的字符

[root@kk bkeep]# expr index "bkeep zbb" e

3

[kang@master scripts]$ expr index 'thisisatestformela' i

3

[kang@node1 ~]$ expr index 'hello world' l

3

(4)、整数运算

[root@kk bkeep]# expr 14 % 9

5

[root@kk bkeep]# expr 30 / 3 / 2  //运算符与数字间一定要有空格

5

[kang@master scripts]$ expr 30 + 3

33

[kang@master scripts]$ expr 30 / 3

10

[kang@master scripts]$ expr 30 \* 3

90

[kang@master scripts]$ expr 30 % 3

0

(5)、增量计数

说明:expr在循环中用于增量计算。先将变量初始化为0,然后循环值加1,反引号的用法为命令替代。

> LOOP=0

> LOOP=`expr $LOOP + 1`

(6)、数值测试

说明:用expr测试一个数。如果试图计算非整数,则会返回错误。

> rr=3.4

> expr $rr + 1

expr: non-numeric argument

> rr=5

> expr $rr + 1

6

(7)、模式匹配

说明:expr也有模式匹配功能。可以使用expr通过指定冒号选项计算字符串中字符数。

.* 意即任何字符重复0次或多次。

[root@kk bkeep]# expr bkeep.doc : '.*'

9

[kang@master scripts]$ expr thisisatestformela : '.*'

18

[kang@master scripts]$ expr thisisatestformela : ".*"

18

(8)在expr中可以使用字符串匹配操作,这里使用模式抽取.doc文件附属名。

[root@kk bkeep]# expr bkeep.doc : '\(.*\).doc'

bkeep

[kang@master scripts]$ expr thisisatestformela : ".*h\(.*\)at.*"

isis

linux命令shopt

shopt命令用于显示和设置shell中的行为选项,通过这些选项以增强shell易用性。shopt命令若不带任何参数选项,则可以显示所有可以设置的shell操作选项。

shopt(选项)(参数)

选项
 -s:激活指定的shell行为选项;
 -u:关闭指定的shell行为选项。

参数
 shell选项:指定要操作的shell选项。

实例1

使用shopt命令显示当前所有可以设置的shell操作选项,输入如下命令:
shopt #输出所有可以设置的shell操作选项
cdable_vars off
cdspell off
checkhash off
checkwinsize on
cmdhist on
dotglob off
execfail off
expand_aliases on
extdebug off
…

实例2

选项"cdspell"的状态为"off",即关闭cd拼写检查选项。现在,可以使用shopt命令将其开启,输入如下命令:
shopt -s cdspell #开启cd拼写检查
执行上面的命令后,该选项的状态将变为"on",即开启状态。可以再次通过该命令显示一下shell操作选项即可,输出信息如下:
cdspell on #开启cdspell选项
用户可以通过实际执行cd命令检查该选项是否被成功开启。
[root@localhost ~]# shopt -s cdspell   #把cdspell选项打开
[root@localhost ~]# shopt -p cdspell   #打印cdspell设置
shopt -s cdspell
[root@localhost ~]# cd /raot           #故意拼写错误
/root
[root@localhost ~]# pwd                #查看当前目录
/root
[root@localhost ~]# cd /usr/loca/bin   #故意拼写错误
/usr/local/bin
[root@localhost bin]# pwd              #查看当前目录 
/usr/local/bin
[root@localhost bin]# shopt -u cdspell #把cdspell选项关闭
[root@localhost bin]# shopt -p cdspell #打印cdspell设置
shopt -u cdspell
[root@localhost bin]# cd /raot         #故意拼写错误
-bash: cd: /raot: 没有那个文件或目录     #进入目录错误

实例3

开启shopt命令:shopt -s extglob
关闭shopt命令:shopt -u extglob
开启之后,以下5个模式匹配操作符将被识别:
?(pattern-list) - 所给模式匹配0次或1次;
*(pattern-list) - 所给模式匹配0次以上包括0次;
+(pattern-list) - 所给模式匹配1次以上包括1次;
@(pattern-list) - 所给模式仅仅匹配1次;
!(pattern-list) - 不匹配括号内的所给模式。
实例:

//删除文件名不以jpg结尾的文件:
rm -rf !(*jpg)
//删除文件名以jpg或png结尾的文件:
rm -rf *@(jpg|png)
选项 含义
cdable_vars 如果给cd内置命令的参数不是一个目录,就假设它是一个变量名,变量的值是将要转换到的目录
cdspell 纠正cd命令中目录名的较小拼写错误。检查的错误包括颠倒顺序的字符,遗漏的字符以及重复的字符。如果知道一处修改,正确的路径就打印出,命令将继续。只用于交互式shell
checkhash bash在试图执行一个命令前,先在哈希表中寻找,以确定命令是否存在。如果命令不存在,就执行正常路径搜索
checkwinsize bash在每个命令后检查窗口大小,如果有必要,就更新LINES和COLUMNS的值
cmdhist bash试图将一个多行命令的所有行保存在同一个历史项中。这使得多行命令的重新编辑更方便
dotglob bash在文件名扩展的结果中包括以点(.)开头的文件名
execfail 如果一个交互式shell不能执行指定给exec内置命令作为参数的文件,它不会退出。如果exec失败,一个交互式shell不会退出
expand_aliases 别名被扩展。默认为打开
extglob 打开扩展的模式匹配特征(正常的表达式元字符来自Korn shell的文件名扩展)
histappend 当shell退出时,历史清单将添加到以HISTFILE变量的值命名的文件中,而不是覆盖文件
histreedit 如果readline正被使用,用户有机会重新编辑一个失败的历史替换
histverify 如果设置,且readline正被使用,历史替换的结果不会立即传递给shell解析器。而是将结果行装入readline编辑缓冲区中,允许进一步修改
hostcomplete 如果设置,且readine正被使用,当正在完成一个包含@的词时bash将试图执行主机名补全。默认为打开
huponexit 如果设置,当一个交互式登陆shell退出时,bash将发送一个SIGHUP(挂起信号)给所有的作业
interactive_comments 在一个交互式shell中,允许以#开头的词以及同一行中其他的字符被忽略。默认为打开
lithist 如果打开,且cmdhist选项也打开,多行命令将用嵌入的换行符保存到历史中,而无需在可能的地方用分号来分隔
mailwarn 如果设置,且bash用来检查邮件的文件自从上次检查后已经被访问,将显示消息“The mail in mailfile has been read”
nocaseglob 如果设置,当执行文件名扩展时,bash在不区分大小写的方式下匹配文件名
nullglob 如果设置,bash允许没有匹配任何文件的文件名模式扩展成一个空串,而不是它们本身
promptvars 如果设置,提示串在被扩展后再经历变量和参量扩展。默认为打开
restricted_shell 如果shell在受限模式下启动就设置这个选项。该值不能被改变。当执行启动文件时,不能复位该选项,允许启动文件发现shell是否是受限的
sourcepath 如果设置,source内置命令使用PATH的值来寻找包含作为参数提供的文件的目录。默认为打开
source 点(.)的同义词
shift_verbose 如果该选项设置,当移动计数超过位置参量个数时,shift内置命令将打印一个错误消息

linux 命令df

df 用来检查文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息.

该命令各个选项的含义如下:

-a 显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统.

-k 以k字节为单位显示.

-i 显示i节点信息,而不是磁盘块.

-t 显示各指定类型的文件系统的磁盘空间使用情况.

-x 列出不是某一指定类型文件系统的磁盘空间使用情况(与t选项相反).

-T 显示文件系统类型.

例1:列出各文件系统的磁盘空间使用情况.

$ df

Filesystem 1 K-blocks Used Available Use% Mounted on

/dev/hda2 1361587 1246406 44823 97% /

df命令的输出清单的第1列是代表文件系统对应的设备文件的路径名(一般是硬盘上的分区);第2列给出分区包含的数据块(1024字节)的数目;第3,4列分别表示已用的和可用的数据块数目.用户也许会感到奇怪的是,第3,4列块数之和不等于第2列中的块数.这是因为缺省的每个分区都留了少量空间供系统管理员使用.即使遇到普通用户空间已满的情况,管理员仍能登录和留有解决问题所需的工作空间.清单中Use% 列表示普通用户空间使用的百分比,即使这一数字达到100%,分区仍然留有系统管理员使用的空间.最后,Mounted on列表示文件系统的安装点.

例2:列出各文件系统的i节点使用情况.
$ df -ia

Filesystem Inodes IUsed IFree Iused% Mounted on

/dev/ hda2 352256 75043 277213 21% /

none 0 0 0 0% /proc

localhost:(pid221) 0 0 0 0% /net

df -h

Df命令是linux系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息,命令格式:

df -hl

显示格式为:

文件系统 容量 已用 可用 已用% 挂载点

Filesystem Size Used Avail Use% Mounted on

/dev/hda2 45G 19G 24G 44% /

/dev/hda1 494M 19M 450M 4% /boot

/dev/hda6 4.9G 2.2G 2.5G 47% /home

/dev/hda5 9.7G 2.9G 6.4G 31% /opt

none 1009M 0 1009M 0% /dev/shm

/dev/hda3 9.7G 7.2G 2.1G 78% /usr/local

/dev/hdb2 75G 75G 0 100% /

/dev/hdb2 75G 75G 0 100% /表示的意思为:HD硬盘接口的第二个硬盘(b),第二个分区(2),容量是75G,用了75G,可用是0,因此利用率是100%, 被挂载到根分区目录上(/)。

dd = Disk Dump

df = Disk Free

转自:https://blog.csdn.net/linux_tcpdump/article/details/123463955

 

linux命令du

Linux du命令是对文件和目录磁盘使用的空间的查看。

1、du:查看当前目录、所有子目录大小(以KB为计数单位)

2、du -h :查看当前目录、所有子目录大小,用易读性单位:KB、M、G

3、du -sh :查看当前目录大小。只展示当前目录的大小,所包含的目录统计在内

[root@node1 ~]# du -sh
3.9M .

4、du -sh  * :查看当前目录大小。展示所包含的所有目录大小

5、du -sh  * –time : 查看当前目录大小,并展示最近更新时间

linux 命令xargs

一、为什么要用xargs:

linux的命令中很多的命令的设计是先从命令行参数中获取参数,然后从标准输入中读取,xargs命令可以通过管道接受字符串,并将接收到的字符串通过空格分割成许多参数(默认情况下是通过空格分割) 然后将参数传递给其后面的命令,作为后面命令的命令行参数;

二、xargs的一些有用的选项:

1. -d 选项

默认情况下xargs将其标准输入中的内容以空白(包括空格、Tab、回车换行等)分割成多个之后当作命令行参数传递给其后面的命令,并运行之,我们可以使用 -d 命令指定分隔符,例如:
echo ’11@22@33′ | xargs echo
输出:
11@22@33
默认情况下以空白分割,那么11@22@33这个字符串中没有空白,所以实际上等价于 echo 11@22@33 其中字符串 ’11@22@33′ 被当作echo命令的一个命令行参数

echo ’11@22@33′ | xargs -d ‘@’ echo
输出:
11 22 33
指定以@符号分割参数,所以等价于 echo 11 22 33 相当于给echo传递了3个参数,分别是11、22、33

2. -p 选项
使用该选项之后xargs并不会马上执行其后面的命令,而是输出即将要执行的完整的命令(包括命令以及传递给命令的命令行参数),询问是否执行,输入 y 才继续执行,否则不执行。这种方式可以清楚的看到执行的命令是什么样子,也就是xargs传递给命令的参数是什么,例如:
echo ’11@22@33′ | xargs -p -d ‘@’  echo
输出:
echo 11 22 33
 ?…y      ==>这里询问是否执行命令 echo 11 22 33 输入y并回车,则显示执行结果,否则不执行
 11 22 33   ==>执行结果

3. -n 选项
该选项表示将xargs生成的命令行参数,每次传递几个参数给其后面的命令执行,例如如果xargs从标准输入中读入内容,然后以分隔符分割之后生成的命令行参数有10个,使用 -n 3 之后表示一次传递给xargs后面的命令是3个参数,因为一共有10个参数,所以要执行4次,才能将参数用完。例如:

echo ’11@22@33@44@55@66@77@88@99@00′ | xargs -d ‘@’ -n 3 echo
输出结果:
11 22 33
44 55 66
77 88 99
00
等价于:
echo 11 22 33
echo 44 55 66
echo 77 88 99
echo 00
实际上运行了4次,每次传递3个参数,最后还剩一个,就直接传递一个参数。

4. -E 选项,有的系统的xargs版本可能是-e  eof-str
该选项指定一个字符串,当xargs解析出多个命令行参数的时候,如果搜索到-e指定的命令行参数,则只会将-e指定的命令行参数之前的参数(不包括-e指定的这个参数)传递给xargs后面的命令
echo ’11 22 33′ | xargs -E ’33’ echo
输出:
11 22

可以看到正常情况下有3个命令行参数 11、22、33 由于使用了-E ’33’ 表示在将命令行参数 33 之前的参数传递给执行的命令,33本身不传递。等价于 echo 11 22 这里-E实际上有搜索的作用,表示只取xargs读到的命令行参数前面的某些部分给命令执行。

注意:-E只有在xargs不指定-d的时候有效,如果指定了-d则不起作用,而不管-d指定的是什么字符,空格也不行。

echo ’11 22 33′ | xargs -d ‘ ‘ -E ’33’ echo  => 输出 11 22 33
echo ’11@22@33@44@55@66@77@88@99@00 aa 33 bb’ | xargs -E ’33’ -d ‘@’ -p  echo  => 输出 11 22 33 44 55 66 77 88 99 00 aa 33 bb

## -0 选项表示以 ‘\0’ 为分隔符,一般与find结合使用

find . -name “*.txt”
输出:
./2.txt
./3.txt
./1.txt     => 默认情况下find的输出结果是每条记录后面加上换行,也就是每条记录是一个新行

find . -name “*.txt” -print0
输出:
./2.txt./3.txt./1.txt     => 加上 -print0 参数表示find输出的每条结果后面加上 ‘\0’ 而不是换行

find . -name “*.txt” -print0 | xargs -0 echo
输出:
./2.txt ./3.txt ./1.txt

find . -name “*.txt” -print0 | xargs -d ‘\0’ echo
输出:
./2.txt ./3.txt ./1.txt

xargs的 -0 和 -d ‘\0’ 表示其从标准输入中读取的内容使用 ‘\0’ 来分割,由于 find 的结果是使用 ‘\0’ 分隔的,所以xargs使用 ‘\0’ 将 find的结果分隔之后得到3个参数: ./2.txt ./3.txt ./1.txt  注意中间是有空格的。上面的结果就等价于 echo ./2.txt ./3.txt ./1.txt

实际上使用xargs默认的空白分隔符也是可以的  find . -name “*.txt”  | xargs  echo   因为换行符也是xargs的默认空白符的一种。find命令如果不加-print0其搜索结果的每一条字符串后面实际上是加了换行

统计一个源代码目录中所有php文件的行数:

find . -type f -name “*.php” -print0 | xargs -0 wc -l

5.-I选项(或者-i): 用于将参数用{}替代:

例如:echo ‘test.txt’ | xargs -i  cp  {} /root/

其他应用:

假如你有一个文件包含了很多你希望下载的URL,你能够使用xargs下载所有链接:
cat url-list.txt | xargs wget -c

 

转自:https://www.cnblogs.com/lidabo/p/15662869.html

Docker – 容器存储详解3

销毁 Data Volume

删除数据的基本方法

对于 docker managed volume,在执行 docker rm 删除容器时可带上 -v 参数,docker 会将容器使用到的 volume 删除。

但其前提是没有其它容器 mount 该 volume,目的是保护数据。
docker rm -v web1

删除孤儿  volume
原文:Docker - 容器存储详解3(销毁Data Volume)

如果没有使用 -v 删除容器,而使得 volume 遗留下来的话,可以使用 docker volume rm 命令删除:
docker volume rm bc399624cbb9dbc3837600b02f83ae03ce8360a078f68f8e62d9946b9446e9db

当然我们也可以使用下面命令批量删除所有的孤儿 volume:
虽然该命令是删除所有 volume,但由于数据保护,目前有容器使用的 volume 是不会被删除的。
docker volume rm $(docker volume ls -q)

转自:https://www.hangge.com/blog/cache/detail_2405.html

Docker – 容器存储详解2

volume container

volume container 是专门为其它容器提供 volume 的容器。

volume container 提供的卷可以是 bind mount,也可以是 docker managed volume

与bind mount相比,不必为每个容器指定host path,所有path在volume container中定义好了,容器只需和volume container关联,从而实现与host的解耦。

volume container 的创建

创建volume container ,用bind mount类型

[root@master _data]# docker container create –name vc -v /root/data/html:/usr/share/nginx/html nginx:1.20

a3f4f0bb9e51615b14ed8155f9d711b07dd46804d30b9b0604201d1276bc55fb

[root@master _data]# docker container run –name nginx6 -dit -p 90:80 –volumes-from vc nginx:1.20

8b86786f68ded15b3725f6d8eabd24dabab06898d6251256e349d405187dfe47

下面使用 docker create 命令创建一个名为 vc_data 的 volume container,该容器 mount 了两个 volume(两种类型):

  • 一种是bind mount,存放 Web Server 的静态文件。
  • 另一种是docker managed volume,存放一些实用工具(这个只是用于演示,里面没有东西也没关系)
  • docker create –name vc_data \

    -v ~/htdocs:/usr/local/apache2/htdcocs \

    -v /other/uesful/tool \

    busybox

使用 docker inspect vc_data 命令可以看到这两个 volume
原文:Docker - 容器存储详解2(volume container、data-packed volume container)

volume container 的使用

volume container 创建好之后,其它容器可以通过 –volumes-from 来使用它。比如下面三个 httpd 容器都使用了 vc_data
docker run –name web1 -d –volumes-from vc_data httpd

docker run –name web2 -d –volumes-from vc_data httpd

docker run –name web3 -d –volumes-from vc_data httpd

data-packed volume container

基本介绍

(1) volume container 的数据归根到底还是在 host 里,如果想要将数据完全放到 volume container 中,同时又能与其它容器共享可以使用 data-packed volume container。

(2)data-packed volume container 原理是将数据打包到镜像中,然后通过 docker managed volume 共享。

使用场景

由于 data-packed volume container 是自包含的,不依赖 host 提供数据,具有很强的移植性,非常适合只使用静态数据的场景。比如应用的配置信息、Web server 的静态文件等。

data-packed volume container 的创建

首先我们创建一个 Dockerfile 文件用于构建镜像,内容如下:

[root@master dockerfile]# ls

_data  dockerfile1  dockerfile2

[root@master dockerfile]# vi dockerfile2

FROM httpd

ADD _data  /usr/local/apache2/htdocs

VOLUME [“/usr/local/apache2/htdocs”]

dockerfile2 中第二行ADD将_data目录文件添加到容器录/usr/local/apache2/htdocs

第三行 VOLUME 作用等同于-v,用来创建docker managed volume ,mount point 为/usr/local/apache2/htdocs,这个目录是ADD添加的目录,所以会将已有数据复制到volume中。

创建 标签为httpd:v13的镜像。

[root@master dockerfile]# docker image build -t httpd:v13 -f dockerfile2 .

用这个镜像创建一个data-packed volume container 。

[root@master dockerfile]# docker container create –name vc httpd:v13

创建一个container使用 –volumes-from

[root@master dockerfile]# docker container run -d –name httpd2 –volumes-from vc -p 8080:80 httpd:latest

 

转自 https://www.hangge.com/blog/cache/detail_2404.html

 

Docker – 容器存储详解1

对于有些容器,我们可能会有持续化数据的需求,也就是容器启动时需要加载已有的数据,容器销毁时希望保留产生的数据,也就是说这类容器是有状态的。这个就需要用到 Docker 的 Data Volume 存储机制。Data Volume 本质上是 Docker Host 文件系统中的目录或文件,能够直接被 mount 到容器的文件系统。 在具体的使用上,docker 提供了两张类型的 volume:bind mount 和 docker managed volume。下面分别进行介绍。

一、bind mount

1,基本用法

(1)下面在容器启动时通过 -v 参数将 docker host 上的 $HOME/htdocs 目录 mount到 httpd 容器里。

docker run -d -v ~/htdocs:/usr/local/apache2/htdocs httpd
(2)这里的 /usr/local/apache2/htdocs 就是 Apache Server 存放静态文件的地方。mount 后,容器中 /usr/local/apache2/htdocs 里原有数据会被隐藏起来,取而代之的是 host $HOME/htdocs/ 中的数据。

注意:当我们 mount 一个目录时,如果更改宿主机目录里的内容,容器内对应的内容也会同步更新,不需要重启容器。

2,指定数据的读写权限

默认情况下 mount 的数据是可读可写的。我们可以添加 ro 参数设置成只读权限,此时:

  • 在容器中无法对 bind mount 数据进行修改。
  • 只有 host 有权修改数据。
原文:Docker - 容器存储详解1(使用Data Volume实现数据持久化)

3,bind mount 单个文件

如果只需要向容器添加文件,不希望覆盖整个目录,可以使用 bind mount 单个文件。下面样例,我们将一个 html 文件添加到 apache 中,同时也保留了容器原有的数据后。

注意:如果我们 mount 的是单个文件的话,不同于 mount 整个目录,运行后如果宿主机的这个文件进行了修改,容器内对应的文件内容是不会同步变化的,必须重启容器才会更新。

docker run -d -v ~/htdocs/index.html:/usr/local/apache2/htdocs/new_index.html httpd

二、docker managed volume

1,基本用法

(1)docker managed volume 和 bind mount 在使用上最大的区别是不需要指定 mount 源,指明 mount point 就好。
(2)同样以 httpd 容器为例。我们通过 -v 告诉它需要一个 data volume,并将其 mount 到 /usr/local/apache2/htdocs。

docker run -d -v /usr/local/apache2/htdocs httpd
(3)上面执行后,docker 就会自动在 host 的 /var/lib/docker/volumes 下生成一个目录,这个目录就是 mount 源。同时还会将容器里中 /usr/local/apache2/htdocs 数据复制到 mount 源中。

2,查找 data volume 的具体位置

(1)当容器申请 mount docker managed volume 时,docker 会在 /var/lib/docker/volumes 下生成一个目录作为 mount 源。要找到它我们先执行 docker inspect 查看容器配置信息:

原文:Docker - 容器存储详解1(使用Data Volume实现数据持久化)

(2)在 Mounts 这部分的信息中会显示容器当前所使用的所有 data volume,包括 bind mount 和 docker managed volume。

原文:Docker - 容器存储详解1(使用Data Volume实现数据持久化)

(3)我们进这个文件夹可以看到,容器里中 /usr/local/apache2/htdocs 数据确实已经复制到这个 mount 源中。

原文:Docker - 容器存储详解1(使用Data Volume实现数据持久化)

附:bind mount 与 docker managed volume 的区别

这两种 data volume 实际上都是使用 host 文件系统的中的某个路径作为 mount 源。它们不同之处在于:

 不同点 bind mount docker managed volume
 volume 位置 可任意指定 /var/lib/docker/volumes/…
 对已有mount point 影响 隐藏并替换为 volume 原有数据复制到 volume
 是否支持单个文件 支持 不支持,只能是目录
 权限控制 可设置为只读,默认为读写权限 无控制,均为读写权限
 移植性 移植性弱,与 host path 绑定 移植性强,无需指定 host 目录

原文出自:www.hangge.com  转载请保留原文链接:https://www.hangge.com/blog/cache/detail_2403.html

 

CDN

CDN也就是内容分布网络(Content Delivery Network),它是构筑在现有Internet上的一种先进的流量分配网络。
CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率

原来CDN并非网络基础设施,而是构建在实体网络基础设施的一个”应用层”,来看看为什么需要它。

互联网中的三个一公里

这幅图展示了互联网通信领域中常说的”三公里”:

第一公里
网站服务器接入互联网公网的链路,这里的带宽也决定了网站的负载能力,也称为网站的接入带宽。

中间一公里
中间一公里主要是接入网、城域网、骨干网组成的链路实体,其中会涉及多家运营商,也就出现了运营商之间互联互通的数据交换问题。

最后一公里
这是用户接入互联网获取信息的最后环节,换句话说就是你们小区的网络、你们家楼的网,往往这部分的带宽不高,影响也比较明显。

运营商的互联互通问题

运营商之间数据的互联互通问题,比如A市联通要访问A市电信的数据资源,按照互联互通的规则限制,不同运营商的数据要在指定的交换中心进行数据交换,假如交换中心位于较远的B市,那么就存在如下图的关系:

换句话说,本来两个运营商是同一个城市的,但由于运营商的网络差异需要到几百公里之外的交换中心所在的城市进行数据交换,实现资源的访问。

对于不同运营商间的互联互通,一般是采用BGP peering(对等)的方式进行。两家运营商相互协商,在特定地点建立连接,通过一系列的配置,运营商A的用户就能访问运营商B的资源了。
在中国,运营商之间通过“国家级互联网骨干直联点”进行连接,2001到2014年,国内只有北上广三个直联点,导致跨网访问体验极差,流量无法本地中转需要长途迂回,大大增加了延迟。
三批国家级互联网骨干直联点:
第一批2001年投入使用:北京、上海、广州
第二批2014年投入使用:成都、郑州、武汉、西安、沈阳、南京、重庆
第三批2017年投入使用:杭州、贵阳、福州

网站服务器的接入带宽是有限的,对于海量用户的接入访问非常容易出现拥塞,这样很容易把网站服务器压垮。

对于运营商来说也很糟糕,骨干网充斥着大量相同的请求,网络基建压力很大,如果把这些请求在本地处理掉该多好!

可见,如果没有CDN这一层Cache应用,网站、用户、运营商都会很崩溃。

CDN的思想和某东物流建立的区域仓库、前置仓库很像,用户下单后优先在最近的仓库配货,极限情况下几小时就可以送到用户手里,用户体验好、物流压力小。

假如没有CDN,我们访问资源时会使用DNS进行解析获取资源服务器的IP地址进行数据交互。

传统模式下DNS的调度过程

图中我们看到用户从LocalDNS开始查询,如果找不到就到根权威DNS服务器,再向顶级权威DNS服务器访问,依次迭代最终获取待访问域名的IP地址。

前面我们曾经提到CDN是构建在承载网上的一个Cache应用层,也就是CDN作为用户和网站服务器之间的Cache来参与整个过程。

这样就出现一个问题:用户如何获取CDN资源节点的IP地址呢?

没错,其中一种常见的调度方案就是DNS调度,如图所示:

有CDN参与的DNS调度过程

前半部分和传统模式类似,重要的区别在于专用DNS调度服务器的出现,图中为TenCent DNS Server,这台CDN服务商提供的专用DNS调度服务器根据CDN系统内部节点的位置、负载情况、资源分配等因素选出最优的CDN资源节点IP地址返回给用户。

专用CDN调度过程

要实现CDN资源节点的调度,需要网站做一些准备工作:

网站去CDN服务商进行域名加速

比如为源站abc.com到阿里云进行域名加速,配置完成后阿里云会自动关联生成加速域名的别名如abc.com.aliyuncdn.net,这个别名也称为CNAME。

这里我们提两个重要的概念:CNAME和A记录,它们是理解CDN的基础概念。

CNAME记录,也叫别名记录,比如http://www.xx.com的别名是http://www.yy.com,CNAME记录是一种指向关系,把http://www.yy.com指向了http://www.xx.com,一个域名可以有多个别名,存在多对一的关系。
A记录,即Address记录,我们可以把它理解为一种域名和IP地址的映射关系。

由于加速域名已经进行了CDN的CNAME配置,在权威DNS服务器的解析下得到的并不是IP地址,而是CNAME。

权威DNS服务器的请求转发

当用户访问http://abc.com时,传统的权威DNS服务器对http://abc.com进行解析时得到的是http://abc.com.aliyuncdn.net这个配置的CNAME,从而通过CNAME顺利将请求转到CDN服务商专用的DNS服务器,由该服务器返回CDN的资源节点。

其他调度模式

除了DNS调度,还有httpDNS调度、302调度等场景,来简单看一下。

httpDNS调度

HTTPDNS技术是一种针对DNS防劫持的有效手段,以HTTP的方式代替传统DNS协议传递解析结果,能够有效避开DNS层面的拦截和故障。该方案可以根据客户端的来访IP,直接通过Httpdns服务器获取最精准的解析结果,避免因为DNS多出口,DNS攻击导致的DNS解析失败的问题。
客户端直接调用HttpDNS接口获取缓存服务器IP组,再择优向IP组中的缓存服务器发送请求,替代常规DNS调度策略,适用于客户端,且客户端需稍作修改进行HttpDNS接口调用。

302调度

基于终端用户的IP,做HTTP的精确重定向,需要协议支持、具有相当的时延,一般用于流媒体类加速场景。
该调度方式是通过DNS解析获得CDN的GLSB集群的IP地址,用户发送HTTP请求,GLSB服务器返回302 Found,将访问重定向到合适的服务节点。
该方式也存在着一些不足:
1、仅限HTTP的应用,可拓展性不足 2、调度过程多了302跳转的重定向过程,相对DNS调度时延较长

httpsDNS和302调度都有自己的优势和使用场景,不同的网站可以采用一种或者多种调度方案来综合实施加速,三种方案并不对立,而是相互补充。

目前CDN都以缓存网站中的静态数据为主,如CSS,JS,图片和静态页面等数据。
用户在先从主站服务器请求到动态内容后,再从CDN上下载这些静态资源,从而加速网页数据内容的下载速度。

一个用户访问某个静态文件(如CSS文件),这个静态文件的域名假如是cdn.jb51.net,那么首先要向Local DNS服务器发起请求,一般经过迭代解析后回到这个域名的注册服务器去解析,一般每个公司都会有一个DNS解析服务器。

这时这个DNS解析服务器通常会把它重新CNAME解析到另一个另外一个域名,
而这个域名最终会被指向CDN全局中的DNS负载均衡服务器,再由这个GTM来最终分配是哪个地方的访问用户,返回给离这个访问用户最近的CDN节点。

拿到DNS解析结果,用户就直接去这个CDN节点访问这个静态资源文件了,
如果这个节点中所请求的文件不存在,就会再回到源站去获取这个文件,然后再返回给用户。

转自:https://zhuanlan.zhihu.com/p/467540509