Linux

TIP

最后更新时间:2019年10月2日

字数:43722

本部分主要以CentOS和Ubuntu为主

学习资源

操作系统

  • 操作系统(Operation System,OS)
  • 我们计算机专业必修课程就有一门课程叫做《计算机操作系统》
  • 操作系统(Operating System)简称OS,是直接管理计算机硬件、软件资源,合理地对各类作业进行调度,以方便用户使用的程序集合,任何软件都必须在操作系统的支持下才能运行
  • 操作系统举例:Windows、Mac OS、DOS、UNIX、Linux、Android、iOS

操作系统的地位

  • 操作系统是安装在计算机"裸机"之上的,用户是不能直接和操作系统打交道的,用户必须让计算机安装操作系统,才能使用计算机
  • 就类似于我们平时购买电脑的时候,都会要求销售给我们安装操作系统,用户会直接和操作系统以及安装在操作系统上面的计算机软件进行打交道,但是不会直接和计算机裸机打交道,所以操作系统非常重要

操作系统的目标

有效性

  • 提高系统资源的利用率
  • 提高系统的吞吐量

方便性

早期可以使用操作系统的都是非常专业的技术人士,现在三岁小孩都可以使用

可扩充性

适应计算机软件和硬件的发展

开放性

开放性:兼容性,可以兼容各个厂商的设备

操作系统的作用

  • 作为用户和计算机之间的接口
  • 作为计算机系统资源的管理者 系统资源:CPU、内存、IO设备、数据资源文件
  • 实现了对计算机资源的抽象

操作系统基本特性

并发(Concurrence)

  • 并发:指两个或者多个事件,在同一时间间隔内发生,例如:两个人同一时间段进教室,是可以的,宏观同一时间,微观上看是不同时间
  • 并行:指两个或多个事件在同一时刻发生,例如:说话的同时,看着对方,同一时刻,微观方面也是同时,同一时刻发生的

共享(Sharing)

  • 指系统中的资源供内存中的多道程序所共同使用
  • 互斥共享方式 比如:打印机
  • 同时访问方式 比如:硬盘(并发:宏观相同时间,微观也有先后顺序)

虚拟(Virtual)技术

  • 指通过某种技术,把一个物理实体变成若干个逻辑上的对应物(一边玩游戏,一边听歌),例如:分时系统将一机虚拟为多机
  • 空分复用共享
  • 时分复用共享

异步性(Asynchronism)

  • 由于共享资源,系统中并发执行的多道程序“走走停停(因为相互影响)”以不可预知的速度向前推进。

操作系统的功能

  • 处理机管理功能
  • 存储器管理功能
  • 设备管理功能
  • 文件管理功能
  • 用户接口

OS定义:OS是直接控制和管理计算机硬件和软件资源,合理地对各类作业进行调度,以方便用户使用的程序集合

操作系统的结构设计经历了以下几代

传统的操作系统机构

  • 无结构操作系统
  • 模块化OS结构
  • 分层式OS结构

现代操作系统结构

  • 微内核的OS结构

推动操作系统发展的主要动力

  • 不断提高计算机资源的利用率
  • 方便用户
  • 元器件的不断更新换代
  • 计算机体系结构的不断发展

Linux介绍

  • Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统
  • 它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件
  • Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统
  • Linux操作系统诞生于1991 年10 月5 日(这是第一次正式向外公布时间)。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。
  • 严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统

来源:百度百科

Linux内核

内核

  • 内核,英文:kernel
  • linux内核是开源的,是一个用C语言写成,符合POSIX标准的类Unix操作系统
  • 内核是操作系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序
  • 内核提供了一个在裸设备与应用程序间的抽象层

linux内核

  • Linux 内核版本又分为 稳定版开发版
  • 稳定版
    • 具有工业级强度,可以广泛地应用和部署。
    • 新的稳定版相对于较旧的只是修正一些 bug 或加入一些新的驱动程序
  • 开发版
    • 由于要试验各种解决方案,所以变化很快

TIP

linux内核版本的是唯一的,由Linus领导,每隔一段时间会发布新的版本或者修改版本

linux内核源码网站

linux内核发行版本

  • Linux 发行版(也被叫做 GNU/Linux 发行版)
  • 仅有内核而没有应用软件的操作系统是无法使用的,所以许多公司或社团将内核、源代码及相关的应用程序组织构成一个完整的操作系统,让一般的用户可以简便地安装和使用Linux,这就是所谓的发行版本(distribution)
  • 注意:一般谈论的Linux系统便是针对这些发行版本的

TIP

  • 虽然我们现在讨论和使用的一般都是各种linux发行版,但是有一linux内核版本是唯一的,这些发行版本也只是在linux内核版的基础上进行的一些修改添加

  • 所以我们学习linux基础的东西一般也都是通用的,不要担心兼问题

Linux知名发行版本

Debian Linux

  • 广义的Debian是指一个致力于创建自由操作系统的合作组织及其作品
  • 由于Debian项目众多内核分支中以Linux宏内核为主,而且 Debian开发者 所创建的操作系统中绝大部分基础工具来自于GNU工程 ,因此 “Debian” 常指Debian GNU/Linux
  • Debian的发行及其软件源有五个分支:
    • 旧稳定分支(oldstable)
    • 稳定分支(stable)
    • 测试分支(testing)
    • 不稳定分支(unstable)
    • 实验分支(experimental)

Ubuntu

  • Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,
  • Ubuntu基于Debian发行版和GNOME桌面环境
  • 其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,类似儒家“仁爱”的思想,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观

Red Hat Linux

  • Red Hat Enterprise Linux 是 Red Hat 公司的 Linux 发行版,面向商业市场,包括大型机
  • 红帽公司从 Red Hat Enterprise Linux 5 开始对企业版 Linux 的每个版本提供 10 年的支持,而 Red Hat Enterprise Linux 常简称为 RHEL
  • RHEL 是商业版本,并不提供免费下载和使用。需要购买 Red Hat 公司的商业服务才能合法取得,并得到商业支持
  • 可以使用 RHEL 的开源衍生版本来取得除了商业支持之外一样的软件,比如:CentOS

CentOS

  • CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一
  • 它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成
  • 由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用
  • 两者的不同,在于CentOS并不包含封闭源代码软件

TIP

  • CentOS是完全开源免费的,每个版本的 CentOS都会获得十年的支持(通过安全更新方式)

  • CentOS在2014初,宣布加入Red Hat

其余一些发行版

  • openSUSE
  • Fedora
  • Linux Mint
  • Manjaro
  • Mageia
  • Arch

操作系统分类

  • 根据同一时间用户的使用数量区分:
    • 单用户操作系统
    • 多用户操作系统
  • 根据统一时间可以运行的任务数量区分:
    • 单任务操作系统
    • 多任务操作系统

单用户和多用户操作系统

  • 根据在同一时间使用计算机用户的多少,操作系统可分为单用户操作系统和多用户操作系统
  • 单用户操作系统是指一台计算机在同一时间只能由一个用户使用,一个用户独自享用系统的全部硬件和软件资源,而如果在同一时间允许多个用户同时使用计算机,则称为多用户操作系统

单任务和多任务操作系统

  • 用户在同一时间可以运行多个应用程序(每个应用程序被称作一个任务),则这样的操作系统被称为多任务操作系统
  • 如果一个用户在同一时间只能运行一个应用程序,则对应的操作系统称为单任务操作系统

发展历程

  • 个人计算机操作系统早期一般都是单用户操作系统,其主要特点是在某一时间为单个用户服务
  • 早期的DOS操作系统是单用户单任务操作系统,Windows XP则是单用户多任务操作系统
  • 现在常用的Windows操作系统都是多用户、多任务的操作系统,使用最广泛的win7,win10都是多用户,多任务操作系统
  • Linux、UNIX是多用户多任务操作系统

文件系统

  • window有盘符的概念,但是Ubuntu是没有的
  • Ubuntu目录结构如下:

TIP

Ubuntu(Linux)只有一个根目录/,其余所有的文件和目录都在该目录下面

主要目录

Filesystem Hierarchy Standard文件系统层次结构标准

Linux目录结构是一个树形结构,和Windows目录结构存在很大的不同

根目录

  • 只有root用户具有该目录下的写权限,所有的目录都是由根目录衍生出来的
  • 根目录和/root目录不同,/root目录是root用户的主目录

TIP

尽量不要在根目录下新建文件或文件夹,要在自己对应的用户目录下面操作

/bin

  • 存放二进制可执行文件
  • 在/bin底下的指令可以被root与一般账号所使用,主要有:cat,chmod,chown,date,mv,mkdir,cp,bash等常用的命令

/boot

  • 存放用于系统引导时使用的各种文件
  • 包括Linux核心文件以及开机选单与开机所需配置文件等

/dev

  • 用于存放设备文件
  • 在Linux系统上,任何装置与接口设备都以文件的型态存在于这个目录当中
  • 比较重要的文件有/dev/null,/dev/zero,/dev/tty,/dev/lp*,/dev/hd*,/dev/sd*等

/etc

  • 存放系统管理和配置文件,例如人员的账号密码文件、各种服务的启始档等
  • 一般来说,这个目录下的各文件属性是可供一般使用者查阅的,但是只有root有权力修改
  • FHS建议不要放置可执行文件(binary)在这个目录中

/home

  • 这是系统默认的用户家目录(home directory),新增一个一般使用者账号时,默认的用户家目录都会在此目录创建

  • home目录是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示

/lib

  • 存放系统动态链接共享库,几乎所有的应用程序都会用到该目录下的共享库,如没有该目录,系统将无法正常运行
  • 通过共享库,许多程序可以重复使用相同的代码,并且这些库可以存储在一个公共的位置上,因此能减小运行程序的大小

/media、/mnt和/misc

  • /mnt:
    • /mnt 如果你想要暂时挂载某些额外的装置,可以放置到这个目彔中
    • 期初,这个目录的用途与/media 相同,但是有了/media 之后,这个目录就用来临时挂载了
  • /media:
    • media (媒体):/media 底下放置的就是可移除的装置,包括软盘、光盘、DVD等等装置都暂时挂载于此
  • /misc:
    • 挂载一些杂七杂八,用途或者含义不明的文件,可以挂载到这里

TIP

总结起来可以这么理解:

/mnt:一般是挂载镜像和硬盘一类的目录,或者临时挂在

/media:是挂载多媒体设备的目录,如默认情况下的光盘、优盘、硬盘等设备都挂载在此目录

/misc:挂载一些杂七杂八,用途或者含义不明的文件

/opt

  • 用来存放第三方软件的目录
  • 第三方软件在安装时默认会找到这个目录,所以如果你没有安装此类软件时,它是空的
  • 用户调用软件包程序放在目录/opt/package_name/bin下,package_name是安装软件包的名称

TIP

很多软件例如oracle,websphere等不认为自己是第三方软件,反而认为自己是linux下的一员,所以都安装在了usr目录下

/proc

  • 用于存储内核与进程信息相关的虚拟文件系统,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态
  • /proc是一种伪文件系统(也即虚拟文件系统),它属于虚拟的目录,是系统内存的映射,可直接访问这个目录来获取系统信息

TIP

/proc目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间

/rofs

  • read only file system

/root

  • 存放root用户(即管理员用户)相关文件的目录
  • 在Linux系统中,斜杠字符“/”是整个系统的根目录,而非超级用户的主目录

TIP

  • 在生产环境下,一般非专业人士,不推荐使用root用户来做一些操作!
  • 我们允许的各个服务,有些情况下,也要用非root用户来开启,安全第一!

/run

  • 存放自系统启动以来描述系统信息的文件,比较常见的用途是daemon进程(Linux的一些系统服务,它们是一些常驻内存的进程)将自己的pid保存到这个目录
  • /run 目录里面的东西是系统运行时需要的,不能随便删除,但是重启的时候应该抛弃,下次系统运行时重新生成
  • 在我们的电脑中, /run是个tmpfs, /var/run是个指向/run的链接, 换句话说他俩是同一个东西

/sbin

  • 用来存放管理员才能使用的命令,即具有一定权限才可以使用的命令,只有root才能够利用来“设定”系统,其他用户最多只能用来“查询”
  • 放在/sbin目录下的命令是开机过程中所需要的,里面包括了开机、修复、还原系统所需要的命令
  • 至于某些服务器软件程序,一般则放置到/usr/sbin/当中
  • 至于本机自行安装的软件所产生的系统执行文件(system binary),则放置在/usr/local/sbin/
  • 常见的指令包括:fdisk,fsck,ifconfig,init,mkfs等

/selinux

  • selinux是一种基于域-类型模型(domain-type)的强制访问控制(MAC)安全系统
  • 它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SELinux的补丁,最后还有一个相应的安全策略

/srv

  • 系统启动服务时可以访问的数据库目录
  • 例如:启动 www 服务需要访问的网页数据存放在 /srv/www 内

/sys

  • 作为虚拟文件系统(sysfs,类似于 /proc,一个procfs),它存储且允许修改连接到系统的设备
  • 该目录不能直接操作,存放类似于/proc的文件系统
  • 在linux2.6内核中最新出现,包含的文件用于获得硬件状态并反映内核看到的系统设备树

/tmp

  • 临时文件的主目录,任何人都能够存取该目录
  • 重要数据一定不要放在该目录下

/usr

  • User System Resources
  • 这是系统存放程序的目录,比如命令、帮助文件等,当我们安装一个Linux发行版官方提供的软件包时,大多就安装在这里
  • 比较重要的目录/usr/local 本地系统管理员软件安装目录(安装系统级的应用)
  • /usr是最庞大的目录,要用到的应用程序和文件几乎都在这个目录
  • 子目录:
    • /usr/bin:存放应用程序
    • /usr/share:存放共享数据
    • /usr/lib:存放不能直接运行的,却是许多程序运行所必需的一些函数库文件
    • /usr/local:存放软件升级包
    • /usr/share/doc:系统说明文件存放目录
    • /usr/share/man:程序说明文件存放目录

/var

  • 存储在正常运行的系统中内容不断变化的文件,如日志,脱机文件和临时电子邮件文件

/initrd.img

  • initrd 的含义是initialized ram disk. ramdisk是用一部分内存模拟成磁盘,让操作系统访问
  • initrd.img文件就是个ram disk的映像文件,可以理解为:initrd.img是一个小的映象,包含一个最小的linux系统
  • 通常的步骤是先启动内核,然后内核挂载initrd.img,并执行里面的脚本来进一步挂载各种各样的模块,然后发现真正的root分区,挂载并执行/sbin/init… …,然后巴拉巴拉一大堆支持顺序
  • initrd.img当然是可选的了,如果没有initrd.img,内核就试图直接挂载root分区
  • 之所以要有initrd,那是为了启动的时候有更大的灵活性,可以使用自己的一些配置操作等

/vmlinuz

  • vmlinuz是Linux 内核的镜像文件,可以被引导程序加载,从而启动Linux系统

Linux常见命令

SSH

ssh root@服务器ip
1
  • root是用户名
  • 第一次登陆输入yes
  • 输入密码:密码输入后是隐藏的,直接输入完成后回车即可

uname

uname可显示电脑以及操作系统的相关信息

语法

uname [-amnrsv][--help][--version]
1

参数说明

  • -a或--all  显示全部的信息。
  • -m或--machine  显示电脑类型。
  • -n或-nodename  显示在网络上的主机名称。
  • -r或--release  显示操作系统的发行编号。
  • -s或--sysname  显示操作系统名称。
  • -v  显示操作系统的版本。
  • --help  显示帮助。
  • --version  显示版本信息。

whois

whois指令会去查找并显示指定帐号的用户相关信息,因为它是到Network Solutions的WHOIS数据库去查找,所以该帐号名称必须在上面注册方能寻获,且名称没有大小写的差别

语法

whois [帐号名称]
1

参数

  • . 强制执行“仅按名称”搜索,查找Name参数指定的名称。

  • ! 显示在 Name 参数中指定的别名或句柄标识的帮助信息。

  • 星号 显示一个组或组织的完整会员资格列表。如果有很多成员,这可能要花费一些时间。

  • ? 向 ARPANET 主机请求帮助。

  • -h HostName 指定一个备用的主机名。在 ARPANET 上的缺省主机名是 internic.net。

  • 通过指定 -h HostName 标志,可以联系其他主要的 ARPANET 用户名数据库(nic.ddn.mil)。

  • -p 连接到指定端口

ls

用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)

语法

 ls [-alrtAFR] [name...]
1

参数

  • -a 显示所有文件及目录 (ls内定将文件名或目录名称开头为"."的视为隐藏档,不会列出)
  • -l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
  • -r 将文件以相反次序显示(原定依英文字母次序)
  • -t 将文件依建立时间之先后次序列出
  • -A 同 -a ,但不列出 "." (目前目录) 及 ".." (父目录)
  • -F 在列出的文件名称后加一符号;例如可执行档则加 "*", 目录则加 "/"
  • -R 若目录下有文件,则以下之文件亦皆依序列出

cd

用于切换当前工作目录至 dirName(目录参数)

语法

cd [dirName]
1

参数

  • dirName:要切换的目标目录。

touch

用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件

语法

touch [-acfm][-d<日期时间>][-r<参考文件或目录>] [-t<日期时间>][--help][--version][文件或目录…]
1

参数

  • a 改变档案的读取时间记录。
  • m 改变档案的修改时间记录。
  • c 假如目的档案不存在,不会建立新的档案。与 --no-create 的效果一样。
  • f 不使用,是为了与其他 unix 系统的相容性而保留。
  • r 使用参考档的时间记录,与 --file 的效果一样。
  • d 设定时间与日期,可以使用各种不同的格式。
  • t 设定档案的时间记录,格式与 date 指令相同。
  • --no-create 不会建立新档案。
  • --help 列出指令格式。
  • --version 列出版本讯息。

mkdir

用于建立名称为 dirName 之子目录

语法

mkdir [-p] dirName
1

参数

  • -p 确保目录名称存在,不存在的就建一个。

vim

使用vim打开或创建一个文档

语法

vim 文件路径

sudo

以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行

语法

sudo 参数
1

参数

  • -V 显示版本编号
  • -h 会显示版本编号及指令的使用方式说明
  • -l 显示出自己(执行 sudo 的使用者)的权限
  • -v 因为 sudo 在第一次执行时或是在 N 分钟内没有执行(N 预设为五)会问密码,这个参数是重新做一次确认,如果超过 N 分钟,也会问密码
  • -k 将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟)
  • -b 将要执行的指令放在背景执行
  • -p prompt 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称
  • -u username/#uid 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(#uid 为该 username 的使用者号码)
  • -s 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell
  • -H 将环境变数中的 HOME (家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管理者 root )
  • command 要以系统管理者身份(或以 -u 更改为其他人)执行的指令

su

用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码

语法

su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]]
1

参数

  • -f 或 --fast 不必读启动档(如 csh.cshrc 等),仅用于 csh 或 tcsh
  • -m -p 或 --preserve-environment 执行 su 时不改变环境变数
  • -c command 或 --command=command 变更为帐号为 USER 的使用者并执行指令(command)后再变回原来使用者
  • -s shell 或 --shell=shell 指定要执行的 shell (bash csh tcsh 等),预设值为 /etc/passwd 内的该使用者(USER) shell
  • --help 显示说明文件
  • --version 显示版本资讯
  • - -l 或 --login 这个参数加了之后,就好像是重新 login 为该使用者一样,大部份环境变数(HOME SHELL USER等等)都是以该使用者(USER)为主,并且工作目录也会改变,如果没有指定 USER ,内定是 root
  • USER 欲变更的使用者帐号
  • ARG 传入新的 shell 参数

whoami

显示当前用户

whereis

  • 用于查找文件
  • 该指令会在特定目录中查找符合条件的文件。这些文件应属于原始代码、二进制文件,或是帮助文件。
  • 该指令只能用于查找二进制文件、源代码文件和man手册页,一般文件的定位需使用locate命令。

语法

whereis [-bfmsu][-B <目录>...][-M <目录>...][-S <目录>...][文件...]
1

参数

-b  只查找二进制文件。

-B<目录>  只在设置的目录下查找二进制文件。

-f  不显示文件名前的路径名称。

-m  只查找说明文件。

-M<目录>  只在设置的目录下查找说明文件。

-s  只查找原始代码文件。

-S<目录>  只在设置的目录下查找原始代码文件。

-u  查找不包含指定类型的文件。

mv

用来为文件或目录改名、或将文件或目录移入其它位置。

语法

mv [options] source dest
mv [options] source... directory
1
2

参数

  • -i: 若指定目录已有同名文件,则先询问是否覆盖旧文件;
  • -f: 在mv操作要覆盖某已有的目标文件时不给任何指示;
命令格式 运行结果
mv 文件名 文件名 将源文件名改为目标文件名
mv 文件名 目录名 将文件移动到目标目录
mv 目录名 目录名 目标目录已存在,将源目录 移动到目标目录;目标 目录不存在则改名
mv 目录名 文件名 出错

scp

  • 什么是scp

    • secure copy
    • 用于在Linux下进行远程拷贝文件,scp传输是加密的
    • 需要输入密码
  • 优点

    • 远程服务器既不需要配置ftp服务器
    • 不需要开启web服务器
    • 也不需要开启共享
  • 命令

// 上传文件到远程服务器
scp -r 本地需要上传的文件的路径 root@服务器ip:服务器文件路径

// 下载远程服务器文件到本地
scp -r root@服务器ip:服务器文件路径 本地文件路径
1
2
3
4
5

TIP

scp上传文件到服务器是在我们本地电脑运行命令,不是登录服务器

unzip

zip压缩文件的解压缩程序

unzip 文件
1
  • 参数:
    • -P<密码> 使用zip的密码选项
    • -d<目录> 指定文件解压缩后所要存储的目录
    • -n 解压缩时不要覆盖原有的文件
    • -o 不必先询问用户,unzip执行后覆盖原有文件
    • 等等

TIP

解压unzip命令很常见

du

  • Linux du命令也是查看使用空间的

  • 但是与df命令不同的是Linux du命令是查看当前指定文件或目录(会递归显示子目录)占用磁盘空间大小

df

  • linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况
  • 可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息

file

查看文件类型

file[OPTIONS...] [FILE...]
1
  • -b,--brief         不显示文件名字

  • -f,--files-fromFILE      显示指定文件的类型(可指定多个用" "分开)

  • -F,--seperatorSTRING    使用字符串作为分隔符,不再使用“:”

  • -i,--mime           显示文件的mime类型

  • --mime-type

  • --mime-encoding

  • -L,--dereference       显示符号链接所指向文件信息

  • -h,--no-dereference

# 查看当前路径下所有文件信息

file *

# 不显示文件名称

file --brief 1.txt

# 显示文件mime类型

file --mime 1.txt

# 显示名称列表所列文件信息

file -f 1.txt

# 显示符号链接所指向类型

file -L 1.txt

# 显示帮助信息

file --help

# 显示版本信息

file--version
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

ln

  • ln的功能是为某一个文件在另外一个位置建立一个同步的链接
  • 当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间
 ln [参数][源文件或目录][目标文件或目录]
1
  • Linux文件系统中,链接(link)可以将其视为档案的别名

  • 链接分为两种 :

    • 硬链接(hard link)
    • 硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置
    • 软链接(symbolic link)
      • 硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统
  • 软链接:

    • 软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式

      • 软链接可以 跨文件系统 ,硬链接不可以

      • 软链接可以对一个不存在的文件名进行链接

      • 软链接可以对目录进行链接

  • 硬链接:

    • 硬链接,以文件副本的形式存在。但不占用实际空间。

    • 不允许给目录创建硬链接

    • 硬链接只有在同一个文件系统中才能创建

  • 注意点:

    • ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化
    • ln的链接又分软链接和硬链接两种
      • 软链接就是ln –s 源文件 目标文件,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间
      • 硬链接 ln 源文件 目标文件,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件
      • 无论是软链接还是硬链接,文件都保持同步变化

Node.js

nvm

使用nvm管理和安装nodejs

TIP

按照下面的命令一个一个的走下就好了

下载安装nvm

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
1
  • nvm官网:nvm官网

  • 下载完成后加入系统环境,否则有时候会出现关掉终端后,node命令无法识别

source   ~/.bashrc
1

查看是否成功

  • 安装完成后关闭终端,重新打开终端(有些系统不用重新打开)
  • 输入 nvm 验证一下是否安装成功
  • 当出现 Node Version Manager 时,说明已安装成功
nvm

输出的结果
Node Version Manager

Note: <version> ....
1
2
3
4
5
6

TIP

如果现实 command not found: nvm 可能是环境变量没有配置成功,或者没有重新打开终端

安装需要的node版本

nvm install  v8.11.3

// 或者安装node的最新稳定版
nvm install stable
1
2
3
4

查看已经安装的nodejs版本

nvm list
1

根据版本号切换node版本

nvm use v8.11.3
1

设置默认的node版本

nvm alias default v8.11.3
1

查看nodejs版本

node -v
npm -v
1
2

都能正常显示即可

切换淘宝镜像源

  • 临时使用
npm --registry https://registry.npm.taobao.org
1
  • 持久使用
npm config set registry https://registry.npm.taobao.org
1
  • 配置后可通过下面方式来验证是否成功
npm config get registry
1

找到taobao关键字即可

通过cnpm使用

npm install -g cnpm --registry=https://registry.npm.taobao.org
1
  • 使用示例
cnpm install express
1

常见NodeJs服务管理工具

  • pm2和forever是启动Nodejs服务常用到的两个工具

  • 使用这两个指令可以使node服务在后台运行(类似于linux的nohup)

  • 它们可以在服务因异常或其他原因被杀掉后进行自动重启

  • 由于Node的单线程特征,自动重启能很大程度上的提高它的健壮性

TIP

pm2官网

forever官网

Linux后台执行

使用&符号后台执行,并利用nohup命令实现进程禁止挂起

nohup node app.js &

pm2

PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单

pm2特性

  • 日志管理:应用程序日志保存在服务器的硬盘中~/.pm2/logs/

  • 负载均衡:PM2可以通过创建共享同一服务器端口的多个子进程来扩展您的应用程序。这样做还允许您以零秒停机时间重新启动应用程序。

  • 终端监控:可以在终端中监控您的应用程序并检查应用程序运行状况(CPU使用率,使用的内存,请求/分钟等)。

  • SSH部署:自动部署,避免逐个在所有服务器中进行ssh。

  • 静态服务:支持静态服务器功能

  • 多平台支持:适用于Linux(稳定)和macOS(稳定)和Windows(稳定)

pm2安装(全局)

# npm安装
npm install pm2 -g
# mac 系统:添加sudo

# yarn安装
yarn global add pm2
1
2
3
4
5
6

启动服务

pm2 start app.js                //启动app.js应用
pm2 start app.js --name demo    //启动应用并设置name
pm2 start app.sh                //脚本启动
1
2
3

监听服务

pm2 start app.js --watch    //当文件发生变化,自动重启
1

查看启动列表

pm2 list
1

查看每个应用程序占用情况

pm2 monit
1

显示应用程序所有信息

pm2 show [Name]      //根据name查看
pm2 show [ID]        //根据id查看
1
2

日志查看

pm2 logs            //查看所有应用日志
pm2 logs [Name]     //根据指定应用名查看应用日志
pm2 logs [ID]       //根据指定应用ID查看应用日志
1
2
3

停止服务

pm2 stop all               //停止所有应用
pm2 stop [AppName]         //根据应用名停止指定应用
pm2 stop [ID]              //根据应用id停止指定应用
1
2
3

删除应用

pm2 delete all               //关闭并删除应用
pm2 delete [AppName]         //根据应用名关闭并删除应用
pm2 delete [ID]              //根据应用ID关闭并删除应用
1
2
3

重启应用

pm2 restart app.js        // 重启app.js进程
pm2 restart all           // 重启所有进程
1
2

0秒停机重新加载

pm2 reload app.js         //重启 app.js应用
pm2 reload all            //重启 cluster mode下的所有应用
pm2 gracefulReload all    //优雅地以群集模式重新加载所有应用程序
1
2
3

创建开机自启动

pm2 startup // 创建开机自启动命令
1

保存当前应用列表

pm2 save 
1

重启保存的应用列表

pm2 resurrect
1

清除保存的应用列表

pm2 cleardump
1

更新pm2

pm2 save  // 保存当前应用列表
npm install pm2 -g  // 使用npm全局安装pm2  macOS,添加sudo
pm2 update  // 最后更新内存中的PM2进程
1
2
3

pm2 update

pm2 update // Save processes, kill PM2 and restore processes
1

静态服务器

pm2 serve ./dist 8080        //将目录dist作为静态服务器根目录,端口为8080
1

pm2 配置文件

  • 配置文件里的设置项,跟命令行参数基本是一一对应的
  • 可以选择yaml或者json文件,就看个人洗好
  • json格式的配置文件,pm2当作普通的js文件来处理,所以可以在里面添加注释或者编写代码,这对于动态调整配置很有好处
  • 如果启动的时候指定了配置文件,那么命令行参数会被忽略。(个别参数除外,比如--env)
  • pm2配置文件参考文档

配置文件使用步骤

  • 创建配置json文件
  • 启动 pm2 start config.json (通过配置文件启动)

配置文件详解

配置文件官方参考文档

// 配置文件详解
{
    /**
    * apps多个服务,依次放到apps对应的数组里,每一个数组成员就是对应一个pm2中运行的应用
    */
    apps : [
    	// 第一个应用
        {
          "name": "app1",  // 应用名称
          "script": "./bin/www",  // 实际启动脚本
          "cwd": "./",  // 当前工作路径
          "args": "",   // 传递给脚本的参数
          "interpreter": "", // 指定的脚本解释器
          "interpreter_args": "", // 传递给解释器的参数
          "watch": [    // 监控变化的目录,一旦变化,自动重启
            "bin",
            "routers"
          ],
          "ignore_watch" : [  // 从监控目录中排除
            "node_modules", 
            "logs",
            "public"
          ],
          "exec_mode": "cluster_mode",// 应用启动模式,支持fork和cluster模式
          "exec_interpreter":"node", // 应用程序的脚本类型,这里使用的shell,默认是nodejs
          "instances": 4, // 应用启动实例个数,仅在cluster模式有效 默认为fork,或者 max
          "max_memory_restart": 8, // 最大内存限制数,超出自动重启
          "watch_options": {
            "followSymlinks": false
          },
          "min_uptime": "60s", // 应用运行少于时间被认为是异常启动
          "max_restarts": 30, // 最大异常重启次数,即小于min_uptime运行时间重启次数
          "autorestart": true, // 默认为true, 发生异常的情况下自动重启
          "pid_file": "pids/node-geo-api.pid",// 自定义应用程序的pid文件
          "log_date_format": "YYYY-MM-DD HH:mm Z",// 指定日志文件的时间格式
          "error_file" : "./logs/app-err.log",  // 错误日志路径
          "out_file"   : "./logs/app-out.log",  // 普通日志路径
          "merge_logs": true, // 设置追加日志而不是新建日志
          "cron_restart": "", // crontab时间格式重启应用,目前只支持cluster模式
          "restart_delay": "60s", // 异常重启情况下,延时重启时间
          "vizion": false, // 启用/禁用vizion特性(版本控制)
          "env": {
              "NODE_ENV": "production"  // 环境参数,当前指定为生产环境
          },
          "env_test": {  // 环境参数,当前指定为测试环境 pm2 start app.js --env_test
            "NODE_ENV": "test",
            "REMOTE_ADDR": "参数"
          }
        }
    ]
 }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

foreverjs

一个简单的CLI工具,用于确保给定脚本连续运行(即永久运行)

forever的用途就是帮我们更好的管理我们node App服务,本质上就是在forever进程之下,创建一个node app的子进程

forever Github

安装

npm install -g
mac系统 添加sudo
1
2

使用方式

  • 命令行用法
  • JSON配置文件

命令行使用

常见使用举例

forever app.js #前台进程

forever start app.js  #启动应用,后台进程
forever stop app.js   #关闭应用

forever restartall    #重启所有应用

#输出日志和错误
forever start -l forever.log -o out.log -e err.log app.js   

# 指定forever信息输出文件,当然,默认它会放到~/.forever/forever.log
forever start -l forever.log app.js  

# 指定app.js中的日志信息和错误日志输出文件,  
# -o 就是console.log输出的信息,-e 就是console.error输出的信息
forever start -o out.log -e err.log app.js 

# 追加日志,forever默认是不能覆盖上次的启动日志,  
# 所以如果第二次启动不加-a,则会不让运行  
forever start -l forever.log -a app.js

# 监听当前文件夹下的所有文件改动(不太建议这样)  
forever start -w app.js  

# 显示所有运行的服务 
forever list  

# 停止所有运行的node App  
forever stopall  
  
# 停止其中一个node App  
forever stop app.js  

# 当然还可以这样  
# forever list 找到对应的id,然后:  
forever stop [id]

# 开发环境下  
NODE_ENV=development forever start -l forever.log -e err.log -a app.js  

# 线上环境下  
NODE_ENV=production forever start -l ~/.forever/forever.log -e ~/.forever/err.log -w -a app.js
#上面加上NODE_ENV为了让app.js辨认当前是什么环境用的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

TIP

命名后可以跟文件名也可以直接跟启动的服务ID

服务ID是启动后,通过forever list 可以获取到

子命令action介绍

start:启动守护进程
stop:停止守护进程
stopall:停止所有的forever进程
restart:重启守护进程
restartall:重启所有的foever进程
list:列表显示forever进程
config:列出所有的用户配置项
set <key> <val>: 设置用户配置项
clear <key>: 清楚用户配置项
logs: 列出所有forever进程的日志
logs <script|index>: 显示最新的日志
columns add <col>: 自定义指标到forever list
columns rm <col>: 删除forever list的指标
columns set<cols>: 设置所有的指标到forever list
cleanlogs: 删除所有的forever历史日志
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

配置参数options介绍

-m MAX: 运行指定脚本的次数
-l LOGFILE: 输出日志到LOGFILE
-o OUTFILE: 输出控制台信息到OUTFILE
-e ERRFILE: 输出控制台错误在ERRFILE
-p PATH: 根目录
-c COMMAND: 执行命令,默认是node
-a, –append: 合并日志
-f, –fifo: 流式日志输出
-n, –number: 日志打印行数
–pidFile: pid文件
–sourceDir: 源代码目录
–minUptime: 最小spinn更新时间(ms)
–spinSleepTime: 两次spin间隔时间
–colors: 控制台输出着色
–plain: –no-colors的别名,控制台输出无色
-d, –debug: debug模式
-v, –verbose: 打印详细输出
-s, –silent: 不打印日志和错误信息
-w, –watch: 监控文件改变
–watchDirectory: 监控顶级目录
–watchIgnore: 通过模式匹配忽略监控
-h, –help: 命令行帮助信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

配置文件使用

我们可以创建一个config.json配置文件,通过配置文件启动项目

[
  {
    // App1
    "uid": "app1", // 这个永久进程的自定义uid
    "append": true, // 合并日志
    "watch": true, // 监控文件改变
    "script": "index.js", // 启动脚本
    "sourceDir": "/home/myuser/app1", // 源码所在目录
  },
  {
    // App2
    "uid": "app2",
    "append": true,
    "watch": true,
    "script": "index.js",
    "sourceDir": "/home/myuser/app2",
    "args": ["--port", "8081"] // 配置参数
  }
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

启动:forever config.json

nginx部署

nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务

安装nginx的依赖

yum -y install gcc-c++  
yum -y install pcre pcre-devel  
yum -y install zlib zlib-devel  
yum -y install openssl openssl--devel
1
2
3
4

下载

wget -c https://nginx.org/download/nginx-1.14.0.tar.gz
1

解压

tar -zxvf nginx-1.14.0.tar.gz
cd nginx-1.14.0
1
2

使用默认配置

./configure
1

编译安装

make
make install
1
2

找到nginx路径

whereis nginx
结果:/usr/local/nginx
1
2

启动

cd /usr/local/nginx/sbin/
./nginx :启动
./nginx -s stop:此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程
./nginx -s quit:此方式停止步骤是待nginx进程处理任务完毕进行停止。
./nginx -s reload:重启
1
2
3
4
5

TIP

在浏览器中输入启动nginx的服务器的ip地址即可

查看nginx进程

ps aux|grep nginx
1

重启nginx

如果nginx不是全局命令,那么进去sbin目录用./nginx 运行命令
先停止再启动(推荐):
对 nginx 进行重启相当于先停止再启动,即先执行停止命令再执行启动命令。如下:

cd /usr/local/nginx/sbin/
./nginx -s quit
./nginx
1
2
3
4
5
6
7

此时,nginx安装启动完毕,我们可以通过服务器IP访问我们的网站了!!!

访问网站注意事项

TIP

正常情况下,启动nginx就可以访问我们的网站,这个时候是通过IP访问,因为没有配置域名等 但是,有时候需要在阿里云后台设置安全组,放开我们的80端口,不然有时候是无法访问网站的

默认网站位置

以小峰哥的CentOS7+为例,默认网站目录在

# 这个html目录就是默认nginx网站存放目录
/usr/local/nginx/html
1
2

重新加载配置文件

1.当 ngin x的配置文件 nginx.conf 修改后,要想让配置生效需要重启 nginx
2.使用-s reload不用先停止nginx再启动 nginx 即可将配置信息在 nginx 中生效,命令如下:

./nginx -s reload
1
2
3
4

配置文件

vim /usr/local/nginx/conf/nginx.conf
1
  • main:用于进行nginx全局信息的配置
  • events:用于nginx工作模式的配置
  • http:用于进行http协议信息的一些配置
  • server:用于进行服务器访问信息的配置
    • 一个网站配置就是一个serve,可以参考小峰哥的NGINX配置
  • location:用于进行访问路由的配置
  • upstream:用于进行负载均衡的配置
# 这里我时候用的是root用户,正常情况下是不可取的
# 配置用户或者组,默认为nobody nobody
user  root;

# 允许许生成的进程数,默认为1
worker_processes  2;

# 制定日志路径,级别
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

# 指定nginx进程运行文件存放地址
#pid        logs/nginx.pid;


events {
    # 最大连接数,默认为512
    worker_connections  1024;
}


http {
    # 文件扩展名与文件类型映射表
    include       mime.types;
    # 默认文件类型,默认为text/plain
    default_type  application/octet-stream;

    # 日志服务的设置
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    # 允许sendfile方式传输文件,默认为off
    sendfile        on;
    # 让nginx在一个数据包中发送所有的头文件,而不是一个一个单独发
    #tcp_nopush     on;

    # 连接超时时间
    keepalive_timeout  65;
    # 开启gzip压缩
    gzip  on;

    # 服务1
    server {
        # 监听的端口
        listen       80;
        # 指定ip地址或者域名,多个配置之间用空格分隔
        server_name  xuefeng666.com www.xuefeng666.com;
        # 网站存储地址
        root /usr/local/nginx/xxx;
        # 用户访问web网站时的全局首页
        index index.html index.htm;
        # 用于配置路由访问信息
        location / {
           
        }
    }


    # 服务2
    server {
        # 监听的端口
        listen       80;
        # 网站存储地址
	    root /usr/local/nginx/xxx2;
        # 指定ip地址或者域名,多个配置之间用空格分隔
        server_name xuefeng66.com www.xuefeng66.com;
        # 用户访问web网站时的全局首页
	    index index.html index.htm;
        # 用于配置路由访问信息
        location / {
           
        }
	    # 定义错误页面码,如果出现相应的错误页面码,转发到那里。
	    error_page  404 403 500 502 503 504  /404.html;
	    # 承接上面的location。
	    location = /404.html {
	        # 放错误页面的目录路径
	        root  /usr/local/nginx/xuefeng66;
	    }
    }

    # HTTPS服务配置
    # HTTPS server
    
    #server {
    #    监听443端口 默认是ssl方式            
    #    listen       443 ssl;

    #    指定ip地址或者域名,多个配置之间用空格分隔
    #    server_name  localhost;

    #    证书(公钥.发送到客户端的)
    #    ssl_certificate      cert.pem;

    #    私钥
    #    ssl_certificate_key  cert.key;

    #    设置存储session参数的缓存的类型和大小

    #    参考资料:
    #    使用ssl_session_cache优化https下Nginx的性能
    #    https://www.ioperat.com/news/operation/43.html
    #    可选项;off,none,builtin,shared
    #    ssl_session_cache    shared:SSL:1m;

    #    客户端可以重用会话缓存中ssl参数的过期时间,内网系统默认5分钟太短了,可以设成30m即30分钟甚至4h
    #    设置较长的keepalive_timeout也可以减少请求ssl会话协商的开销,但同时得考虑线程的并发数问题
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    配置路由信息
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125

MongoDB

mongodb介绍

  • MongoDB 是一个基于分布式文件存储的数据库
  • 由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
  • MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的

MongoDB安装(CentOS)

相关信息

  • 系统:CentOS 7.4
  • MongoDB版本:3.4

配置yum源

// 打开或者创建文件
vim /etc/yum.repos.d/mongodb-org-3.4.repo

// 添加一下内容
[mongodb-org-3.4]  
name=MongoDB Repository  
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/  
gpgcheck=1  
enabled=1  
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc

这里可以修改 gpgcheck=0, 省去gpg验证

安装之前先更新所有包 :yum update (可选操作)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

安装MongoDB

yum -y install mongodb-org
1

查看mongo安装位置

whereis mongod
1

配置文件

/etc/mongod.conf
1

开启和停止服务

启动mongodb :systemctl start mongod.service
停止mongodb :systemctl stop mongod.service
重启mongodb :systemctl restart mongod.service
1
2
3

设置开机启动

systemctl enable mongod.service
1

启动mongodb shell

mongo
1

macOS启动mongodb

# 一个终端
sudo mongod

# 另一个终端
sudo mongo
1
2
3
4
5

数据库操作

创建数据库

use DATABASE_NAME
1

如果数据库不存在,则创建数据库,否则切换到指定数据库。

注意事项

  • show dbs查看数据库,会费想爱你数据库没有
  • 要显示它,我们需要向数据库插入一些数据,才会被显示(请看后面插入数据)

查看数据库

show dbs
1

删除数据库

db.dropDatabase()
1
  • 删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名。
  • 先use切换数据库,再删除数据库

集合操作

创建集合

db.createCollection(name, options)
1

参数说明

  • name: 要创建的集合名称
  • options: 可选参数, 指定有关内存大小及索引的选项
  • options 可以是如下参数
字段 类型 描述
capped 布尔 (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。
autoIndexId 布尔 (可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size 数值 (可选)为固定集合指定一个最大值(以字节计)。 如果 capped 为 true,也需要指定该字段。
max 数值 (可选)指定固定集合中包含文档的最大数量。

在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。

// 使用test数据库,创建collection集合,查看集合
> use test
switched to db test
> db.createCollection("collection")
{ "ok" : 1 }
>
> show collections
collection
1
2
3
4
5
6
7
8

查看集合

show collections
1

删除集合

db.collection.drop()
1

文档操作

插入文档

db.COLLECTION_NAME.insert(document)
1
// 插入在col中一条数据
>db.collection.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一个Nosql数据库',
    by: 'mongodb',
    url: 'http://www.xuefeng666.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})
1
2
3
4
5
6
7
8
  • 如果collection集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。

查询文档数据

db.collection.find(query, projection)
1
  • query :可选,使用查询操作符指定查询条件
  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

如果你需要以易读的方式来读取数据,可以使用 pretty() 方法

>db.collection.find().pretty()
1
> db.collection.find().pretty()
{
        "_id" : ObjectId("5b961b4aee3bcc73f0550b15"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一个Nosql数据库",
        "by" : "mongodb",
        "url" : "http://www.xuefeng666.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  • 查询条件query是一个对象,比如:{"title":"MongoDB 教程"}

更新文档

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)
1
2
3
4
5
6
7
8
9
  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,抛出异常的级别。
// 接着我们通过 update() 方法来更新标题(title):
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})

// 查询
> db.col.find().pretty()
{
        "_id" : ObjectId("56064f89ade2f21f36b03136"),
        "title" : "MongoDB",
        "description" : "MongoDB 是一个Nosql数据库",
        "by" : "mongodb",
        "url" : "http://www.xuefeng666.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  • 以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
1

docker

一次构建,处处运行

  • 解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术

安装

  • 环境:CentOS 7.2 64位
# 安装依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 设置阿里云镜像源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

# 安装docker-ce
sudo yum install docker-ce

# 启动docker-ce
# enable:开机启动
sudo systemctl enable docker
# start:立刻启动
sudo systemctl start docker

# 配置阿里云镜像源 配置文件地址:/etc/docker/daemon.json
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["你的加速器地址"]
}
EOF
# 重载所有修改过的配置文件
sudo systemctl daemon-reload
# 重启docker
sudo systemctl restart docker
# 查看镜像源
docker info
Registry Mirrors:
 https://xxxxx.mirror.aliyuncs.com/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

安装说明

  • docker-ce:社区版,免费
  • docker-ee:企业版,付费

常见docker概念

完整docker组成

  • DockerClient客户端
  • Docker Daemon守护进程
  • Docker Image镜像
  • DockerContainer容器

Docker 客户端

镜像

  • Docker 镜像(Images)
  • Docker 镜像是用于创建 Docker 容器的模板

容器

  • Docker 容器(Container)
  • 容器是独立运行的一个或一组应用

镜像和容器类比

  • 镜像类似于面向对象中的类
  • 容器类似于面向对象中的实例

常见docker命令

查看docker版本

docker version
1

查看docker信息

  • 显示 Docker 系统信息,包括镜像和容器数
docker info
1

搜索镜像

  • 从 Docker Hub 中搜索符合条件的镜像
# 搜索nginx镜像
docker search nginx

# 搜索start 超过 100 的镜像
docker search -s 100 nginx
1
2
3
4
5

拉取镜像

  • 从镜像仓库(Docker Hub)拉取镜像
  • 如果没有指定镜像标签,docker默认使用:latest
# 拉取nginx镜像
git pull nginx
1
2

查看本地镜像

docker images
1

查看本地容器

# 查看正在运行的容器
docker ps

# 查案所有状态的容器(包含已停止的容器)
docker ps -a
# -s 显示容器大小
# -l 仅列出最新创建的一个容器
# -n=4 列出最近创建的4个容器
1
2
3
4
5
6
7
8

启动、停止和重启容器

docker start|stop|restart 容器id
1

docker run 和 docker start

  • docker run 只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start 即可
  • docker run相当于执行了两步操作:
    • 将镜像放入容器中(docker create)
    • 然后将容器启动,使之变成运行时容器(docker start)
  • 而docker start的作用是,重新启动已存在的镜像。也就是说,如果使用这个命令,我们必须事先知道这个容器的ID,或者这个容器的名字,我们可以使用docker ps找到这个容器的信息

删除容器

docker rm 容器id
# -f 强行移除该容器,即使其正在运行
# -l 移除容器间的网络连接,而非容器本身
# -v 移除与容器关联的空间
1
2
3
4

杀死容器

  • 杀死一个或多个指定容器进程。
docker kill 容器id
1

volume

  • volume也是绕过container的文件系统,直接将数据写到host机器上,只是volume是被docker管理的
  • docker下所有的volume都在host机器上的指定目录下/var/lib/docker/volumes
 #创建volume
docker volume create volume-test1
 #查看参数
docker inspect volume-test1
 #使用volume
docker run -dit --name busybox3 -v volume-test1:/volume busybox
 #查看
docker inspect -f {{.Mounts}} busybox3

 #查看docker数据卷
docker volume ls
 #删除没使用的数据卷(谨慎使用)
docker volume prune

1
2
3
4
5
6
7
8
9
10
11
12
13
14

docker run (重要)

  • 启动一个容器,在其中运行指定命令
docker run [OPTIONS] IMAGE
# -d : 指定容器运行于前台还是后台,默认为false
# -u : 指定容器的用户
# -P : 指定容器暴露的端口
# -h : 指定容器的主机名
# -v : 给容器挂载存储卷,挂载到容器的某个目录

# 启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,这样在容器启动后,容器内会自动创建/soft的目录
docker run -it -v /test:/soft centos /bin/bash
1
2
3
4
5
6
7
8
9
  • 实例一:docker 安装 portainer( docker 容器的 GUI 管理方案)
# 下载镜像
docker pull portainer/portainer

# 创建 volume
docker volume create portainer_data
# 单机 portainer
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
# 访问:http://xxx.xxx.xxx.xxx:9000
1
2
3
4
5
6
7
8

打印日志

docker logs -f 容器id
# -f : 跟踪日志输出
# --since :显示某个开始时间的所有日志
# -t : 显示时间戳
# --tail :仅列出最新N条容器日志
1
2
3
4
5

进入容器

  • docker进入容器有四种方法
    • 使用exec
    • 使用docker attach
    • 使用SSH
    • 使用nsenter

docker exec

docker exec option 命令
1
  • option:
    • -d :分离模式: 在后台运行
    • -i :即使没有附加也保持STDIN 打开
    • -t :分配一个伪终端
# 查看容器
docker ps
# 进入容器
sudo docker exec -it 容器id /bin/bash
1
2
3
4

docker attach

  • docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作。
docker ps
sudo docker attach 44fc0f0582d9
# 接下来继续执行命令
1
2
3

TIP

但是需要注意的是,如果从这个stdin中exit,会导致容器的停止,所以:不推荐使用该命令!!!

文件拷贝

创建自己的docker镜像

docker gitlab

docker安装gitlab

下载镜像

GitLab 中文社区版 Docker 镜像

TIP

  • gitlab 官方已经开始支持多语言, 而且也提供了 docker 镜像, 因此这个 docker 镜像不再维护, 请大家切换到官方镜像
  • 文设置方法: 依次点击工具栏最右侧用户头像 》 Settings 》 Preferred language , 然后选择 简体中文 即可
# 下载镜像-这个是中文版本的
docker pull beginor/gitlab-ce
1
2

创建容器

# 创建文件,便于日后升级挂载
mkdir -p /root/docker/gitlab/etc
mkdir -p /root/docker/gitlab/log
mkdir -p /root/docker/gitlab/data
# 启动
docker run \
    --detach \
    --publish 8090:80 \
    --name gitlab \
    --restart unless-stopped \
    -v /root/docker/gitlab/etc:/etc/gitlab \
    -v /root/docker/gitlab/log:/var/log/gitlab \
    -v /root/docker/gitlab/data:/var/opt/gitlab \
    beginor/gitlab-ce
1
2
3
4
5
6
7
8
9
10
11
12
13
14

修改配置文件

sudo vim /root/docker/gitlab/etc/gitlab.rb
修改:external_url 'http://gitlab.xuefeng6.com'

sudo vim /root/docker/gitlab/data/gitlab-rails/etc/gitlab.yml
host: gitlab.xuefeng6.com
port: 8090
1
2
3
4
5
6

重启

# 配置并启动gitlab
# 进入容器
docker exec -ti gitlab /bin/bash
# 重启gitlab
gitlab-ctl restart
gitlab-ctl status
1
2
3
4
5
6

访问

  • http://gitlab.xuefeng6.com
  • 测试账户:test-test

gitlab-runner

CI:持续集成

  • CI,Continuous Integration,持续集成,是软件开发过程中一个非常重要的环节,在互联网敏捷开发的过程中,持续集成通常用来进行日常编译和自动化测试,来保证及时发现提交的问题,避免影响项目进度。

  • 通常持续集成的过程包括:

    • 提交(合并)代码
    • 编译
    • 测试
    • 发布
  • 持续集成工具

    • CI工具有很多,目前最为常用应该是Jenkins
      • enkins通常包括一个master和很多个slave
      • master用于配置和组织节点、任务,slave则用来真正执行配置好的任务
      • 因为用户群体的庞大,Jenkins上的各种插件,尤其是很多可视化插件都非常丰富,可以帮助很多新手快速配置所需的任务
    • gitlab-ci是git官方的持续集成工具,在Git工程管理页面上,也有专门的CI配置和展示页
      • Github上许多优秀的开源项目的Readme.md中,可以看到有如下图中“build|passing”的图标,就是通过markdown元素引用了当前版本CI/CD的结果的展示

TIP

gitlab-ci的runner支持多重环境,支持docker,安装和使用简单

安装

docker pull gitlab/gitlab-runner
1

启动容器

# 创建文件,便于日后升级挂载
mkdir -p /root/docker/gitlab-runner
# 启动容器
sudo docker run -d --name gitlab-runner --restart always -v /root/docker/gitlab-runner/config:/etc/gitlab-runner -v /root/docker/gitlab-runner/run/docker.sock:/var/run/docker.sock  gitlab/gitlab-runner
1
2
3
4

注册runner

sudo docker exec -it gitlab-runner gitlab-ci-multi-runner register
1
  • 参数说明
Please enter the gitlab-ci coordinator URL:
# gitlab的url, 如:http://gitlab.xxx.com
Please enter the gitlab-ci token for this runner:
# gitlab->你的项目->settings -> CI/CD ->Runners settings
Please enter the gitlab-ci description for this runner:
# 示例:demo
Please enter the gitlab-ci tags for this runner (comma separated):
# 示例:demo:用于匹配任务(jobs)和执行任务的设备(runners)
# 示例:demo
Whether to run untagged builds [true/false]:
# true
Please enter the executor: docker, parallels, shell, kubernetes, docker-ssh, ssh, virtualbox, docker+machine, docker-ssh+machine:
# 执行环境:docker
Please enter the default Docker image (e.g. ruby:2.1):
# node:10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

TIP

  • url和token在项目的CI配置页上可以找到
  • description只是用来区分两个runner,没有特殊的作用
  • tags:用于匹配任务(jobs)和执行任务的设备(runners)
  • executor:执行环境:docker
  • image:镜像,这里使用的是node:10