Linux
Linux入门篇
Linux概述
Linux是什么
- Linux 是一个操作系统(OS)

Linux的诞生
- 作者 : 李纳斯·托瓦兹(Linus Torvalds)
- 上大学期间,对 Unix 产生了浓厚兴趣
- 1991年初,开始基于 Minix(Unix的变种) 进行开发
- 1991年6月,确定开发一个类 Unix 操作系统内核
- 1991年9月,将开发完成内核的 0.01 版本,命名为 Linux
Linux与Unix的渊源
GNU/Linux
Linux的发行版
Linux与Window
Linux安装
CentOS系统下载
CentOS官方网站 : https://centos.org/download/
阿里云提供的下载地址 : https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/
- 下载标准版(DVD)即可 , 如果下载缓慢或者失败,可以选择先下载种子文件,再通过迅雷下载
VMware虚拟机下载
- 虚拟机VMware官方下载地址 : https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html
- 要付费的 , 许可证密钥可以百度获取
创建虚拟机
- 01 双击 VMware 虚拟机安装包,启动安装 VMware , 直接下一步直到完成即可 , 安装完成后打开 VMware 如下
- 02 点击创建新的虚拟机, 选择自定义 , 下一步 , 直接下一步 , 选择稍后安装操作系统 , 下一步
- 03 选择客户机操作系统为 Linux , 版本选择为 CentOS 7 64 位 , 下一步
- 04 输入虚拟机名称 , 并选择保存地址 , 下一步
- 05 根据实际需要 , 选择处理器数量和内核数量(注意不能超过物理机的内核总数),下一步
- 06 选择虚拟机内存 , 下一步
- 07 选择网络类型为 “使用网络地址转换” , 下一步
- 08 选择 I/O 控制器类型为 “LSI Logic(L)” ,下一步
- 09 选择磁盘为 “创建新虚拟磁盘” , 下一步
- 10 根据实际需要 , 指定磁盘容量 , 下一步
- 11 下一步
- 12 点击完成即可完成创建
- 13 确认物理机的虚拟化已启用
- 如何开启虚拟化 : 进入 BIOS 设置, 启动 CPU 虚拟化
安装CentOS系统
- 01 打开 VMware , 双击 “CD/DVD(IDE)” , 进行虚拟机设置 , 并选择 CentOS 镜像 , 点击确定后即可开启虚拟机进行 CentOS 的安装
- 02 通过键盘选择第一个选项 “install CentOs 7” , 回车
- 03 选择语言 , 点击继续
- 04 选择软件为 “GNOME桌面”
- 05 点击”安装位置”, 选择 “我要配置分区” , 点击完成
- 06 添加以下三个挂载点 , 点击完成 , 点击接受更改
- 07 禁用 KDUMP
- 08 设置网络主机名

09 点击开始安装
10 设置密码 “root123456”
- 在生成环境中,该密码必须要足够复杂

- 11 设置用户名 “atguigu”

- 12 等待安装完成,重启,接受协议,点击完成配置即可
基础篇
目录结构
Vi / Vim编辑器
Vi / Vim编辑器
- VI 是Unix操作系统和类Unix 操作系统中最通用的文本编辑器
- VIM 编辑器是从VI发展出来的一个性能更强大的文本编辑器。可以主动的以字体颜色辨别语法的正确性,方便程序设计。VIM与V编辑器完全兼容。
Vi / Vim 编辑器的打开
- 01 默认不支持输入汉字,需要添加汉语输入法 : 应用程序 - 系统工具 - 设置
- 在 Linux 中 , 切换输入法 : “win + 空格”
- 02 桌面右击 - 打开终端
- 03 进入到指定的目录下 , 输入命令 “vim xxxxx.xxx” 或者 “vi xxxxx.xxx”, 即可打开指定文件 , 默认是一般模式
模式间转换
一般模式
- 复制当前行命令 : “yy”
- 复制从当前光标位置到行末 : 先按 “y” , 再按 “$”, (特殊字符通过配合 shift 键即可按出)
- 复制从行首到光标位置 : 先按 “y” , 再按 “^”, (特殊字符通过配合 shift 键即可按出)
- 复制光标当前位置的单词 : 先按 “y” , 再按 “w”
- 粘贴命令 : “p”
- 删除当前行 : “dd”
- 删除指定行数 : “3dd” , (删除当前行以及后面的两行,一共删除三行)
- 删除光标所在位置的单词 : 先按 “d” , 再按 “w”
- 从右往左逐个删除 : “shift + x” , (相当于 win 的退格删除)
- 撤销操作 : “u” , (相当于window系统的 ctrl + z)
- 跳转到下一个单词开头 : “w”
- 显示行号 : “:set nu”
- 关闭行号 : “:set nonu”
编辑模式
- 按下 “i” , 即可进入编辑模式 , 按下 “ESC” , 退回到一般模式
命令模式
- 按下冒号 “:” , 即可进入命令模式 , 命令 “:wq” 为保存并退出
网络配置
网络连接测试
- 查看虚拟机和物理机的 IP 地址 :
- 测试虚拟机连接物理机 :
- 测试物理机连接虚拟机 :
网络连接模式
- 桥接模式
- 虚拟机直接连接外部物理网络的模式,主机起到了网桥的作用。这种模式下,虚拟机可以直接访问外部网络,并且对外部网络是可见的。“
- NAT 模式“
- 虚拟机和主机构建一个专用网络,并通过虚拟网络地址转换 (NAT)设备对 IP 进行转换。
- 虚拟机通过共享主机IP 可以访问外部网络,但外部网络无法访问虚拟机。
- 仅主机模式
- 虚拟机只与主机共享一个专用网络,与外部网络无法通信。
修改静态IP
- 使用自动获取 IP 即可
配置主机名
- 方法一 : 输入 :
vim /etc/hostname
, 修改配置文件,并重启虚拟机系统即可 - 方法二: 输入 :
hostnamectl set-hostname xxxxxxxxx
即可直接修改主机名
远程登录
- 在本地物理机终端输入 :
ssh root@192.168.1.9
, 再输入yes
, 再输入虚拟机的用户密码即可
- 使用 Xshell 登录虚拟机 :
- Xftp 连接虚拟机 :
系统管理
进程和服务
- 计算机中,一个正在执行的程序或命令,被叫做 “进程’ (process)
- 启动之后一直存在、常驻内存的进程,一般被称作“服务 (service)
服务管理
- 基本语法 :
- 终端输入
systemctl start|stop|restart|status 服务名
- 这是 Centos 7 的写法
- 查看服务的方法 :
- 终端输入
ls /usr/lib/systemd
- 终端输入
- 终端输入
系统运行级别
- 系统运行过程:
运行级别 :
- Linux系统有7种运行级别(runlevel): 常用的是级别3和5
- 运行级别0: 系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
- 运行级别1: 单用户工作状态,root权限,用于系统维护,禁止远程登陆
- 运行级别2: 多用户状态(没有NFS),不支持网络
- 运行级别3: 完全的多用户状态(有NFS),登陆后进入控制台命令行模式
- 运行级别4: 系统未使用,保留
- 运行级别5: X11控制台,登陆后进入图形GUI模式
- 运行级别6: 系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
- Linux系统有7种运行级别(runlevel): 常用的是级别3和5
CentOS7的运行级别简化为:
- multi-user.target : 等价于原运行级别3(多用户有网,无图形界面)
- graphical.target : 等价于原运行级别 5(多用户有网,有图形界面)
查看当前运行级别 :
- 终端输入 :
systemctl get-default
- 终端输入 :
关机与重启
(1) sync : (功能描述:将数据由内存同步到硬盘中)“
(2) halt : (功能描述:停机,关闭系统,但不断电)“
(3) poweroff : (功能描述:关机,断电)“
(4) reboot: (功能描述:就是重启,等同于 shutdown-r now)
(5) 关机 :
- 延迟关机(默认) : 终端输入
shutdown
, 回车,将会在 1min 后关机 - 立即关机 : 终端输入
shutdowm now
, 回车即可立即关机 - 在指定时间关机 :
- 终端输入 :
shutdown 5
, 回车即可在 5min 后自动关机 - 终端输入:
shutdown 15:30
, 回车即可在 15:30 自动关机
- 终端输入 :
- 在未关机前,终端输入
shutdown -c
, 即可取消关机
- 延迟关机(默认) : 终端输入
实操篇_常用Shell基本命令
帮助命令类
- Shell可以看作是一个命令解释器,为我们提供了交互式的文本控制台界面。
- 我们可以通过终端控制台来输入命令,由 shell进行解释并最终交给内核执行。
- 本章就将分类介绍常用的基本 shell 命令。
man 帮助信息
- 终端输入
man ls
:- 查看
ls
命令的帮助信息
- 查看
help 内置帮助信息
- 一部分基础功能的系统命令是直接内嵌在shell 中的,系统加载启动之后会随着shell一起加载,常驻系统内存中。
- 这部分命令被称为“内置(built-in)命令”;
- 相应的其它命令被称为“外部命令”。
- 基本语法 :
help 命令
- 例如 : 终端输入
help cd
- 例如 : 终端输入
查看命令类型
- 命令 :
type pwd
- 查看
pwd
命令的类型
- 查看
文件目录类
查看当前目录绝对路径
- 命令 :
pwd
- 显示当前工作目录的绝对路径
- 例如 : 终端输入
pwd
, 即可显示当前工作目录的绝对路径
列出当前目录内容
- 命令 :
ls
- 列出当前目录内容
创建目录
- 命令 :
mkdir a
- 在当前目录下创建文件夹 a
- 命令 :
mkdir /a
- 在
/
目录下创建文件夹 a
- 在
删除目录
- 命令 :
rmdir a
- 删除当前目录下的 a 文件夹
创建文件
- 命令 :
touch hello
- 在当前目录创建
hello.txt
文件,创建时可以不带后缀,默认是 txt 文件
- 在当前目录创建
复制文件或目录
- 命令 :
cp hello.txt ./b
- 将当前目录下的 hello.txt 文件复制当前目录下的 b 文件夹中
- 命令 :
cp -r a/ /home
- 递归将 a 文件夹复制到 home 文件夹中
删除文件或目录
命令 :
rm hello.txt
, 输入y
- 即可删除当前目录下的 hello.txt 文件
命令 :
rm -r a
, 输入y
- 即可删除当前目录下的 a 文件夹
命令 :
rm -rf b
- 加上
f
参数 , 即可直接删除指定 b 目录,不会再有确认提醒,慎用该指令
- 加上
文件重命名
- 命令 :
mv a.txt b.txt
- 将当前目录下的 a.txt 文件重命名为 b.txt
查看文件内容
- 命令 :
cat -n b.txt
- 查看当前目录下 b.txt 文件的所有内容
-n
参数决定行号的显示
- 命令 :
more b.txt
- more 指令是一个基于VI编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。
- 命令 :
less b.txt
- less指令用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更加强大,支持各种显示终端。
- less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。
其他命令
命令 :
echo -e 'hello world'
- 直接在控制台输出 ‘hello world’
-e
参数支持反斜线控制的字符转换
命令 :
head -n 5 a.txt
- head用于显示文件的开头部分内容,默认情况下head指令显示文件的前10行内容。
-n 5
查看文件头5行内容,5 可以是任意行数
命令 :
tail -n 5 a.txt
- tail 用于输出文件中尾部的内容,默认情况下tail指令显示文件的后10行内容。
-n 5
查看文件尾部5行内容,5 可以是任意行数
软链接
- 命令 :
ln -s /root/info.txt myInfo
- 在当前目录下新建 myInfo 链接文件,指向
/root/info.txt
文件
- 在当前目录下新建 myInfo 链接文件,指向
- 命令 :
ln -s /root/info/ myInfo
- 在当前目录下新建 myInfo 链接文件,指向
/root/info/
文件夹
- 在当前目录下新建 myInfo 链接文件,指向
历史命令
- 命令 :
history 10
- 查看执行过的命令
- 参数 : 10 , 查看最近输入的 10 条指令
时间日期类
显示当前时间信息 :
- 终端命令 :
date
- Fri Dec 22 20:35:12 CST 2023
- 终端命令 :
显示当前年份 :
- 终端命令 :
date +%Y
- 2023
- 终端命令 :
显示当前月份 :
- 终端命令 :
date +%m
- 12
- 终端命令 :
显示当前日 :
- 终端命令 :
date +%d
- 22
- 终端命令 :
显示当前日期与时分秒 :
- 终端命令 :
date "+%Y-%m-%d %H:%M:%S"
- 2023-12-22 20:40:49
- 终端命令 :
显示指定多少时间前,多少时间后的时间 :
终端命令 :
date -d "1 days ago"
, 显示一天前的时间- Thu Dec 21 20:43:29 CST 2023
终端命令 :
date -d "-1 days ago"
, 显示一天后的时间- Thu Dec 23 20:43:29 CST 2023
终端命令 :
date -d "-1 hours ago""
, 显示 1h 后的时间- Thu Dec 23 21:43:29 CST 2023
将当前的系统时间设置为指定时间 :
- 终端命令 :
date -s 2027-06-19 20:52:18
- 终端命令 :
查看日历:
- 终端命令 :
cal
查看当前月的日历 - 终端命令 :
cal -3
同时查看 3 个月(上一个月,当前月,下一个月)的日历 - 终端命令 :
cal 2022
查看 2022 年所有的日历
- 终端命令 :
用户管理类
查看用户
- 查看当前的所有用户 :
- 终端输入 :
cd /home
, 再输入ls
- 终端输入 :
- 查看某个用户是否存在 :
- 终端输入 :
id tony
- 查看 tony 用户是否存在
- 终端输入 :
- 查看当前的所有用户,包含系统默认创建的用户 :
- 终端输入 :
less /etc/passwd
- 终端输入 :
添加用户
- 添加用户 :
- 终端输入 :
useradd tony
- 添加一个叫 tony 的用户
- 终端输入 :
添加用户密码
- 添加用户密码 :
- 终端输入 :
passwd tony
- 给 tony 用户设置密码
- 终端输入 :
切换用户
- 切换用户:
- 终端输入 :
su tony
- 切换到 tony 用户
- 从 root 用户切换到普通用户,不需要输入密码 , 从普通用户切换到普通用户就需要输入用户密码 , 从普通用户切换到 root 用户也需要输入密码
- 终端输入 :
给普通用户增加权限
- 给普通用户增加 root 权限
- 终端输入命令 :
- 在 root 用户下 ,终端输入
vim /etc/sudoers
, 新增一行 , 指定对应用户的权限 - 再切换到普通用户(
su tony
) , 终端输入sudo ls
,输入 tony 用户的密码即可
- 在 root 用户下 ,终端输入
- 终端输入命令 :
删除用户
删除用户 :
终端命令 :
userdel tony
删除掉 tony 用户 , 但是 tony 用户的目录还是会被默认保留的, 可以通过
rm -rf tony/
命令删除用户对应的目录,但是不建议删除该用户目录直接删除 :
userdel -r tony
, 直接连同用户目录一起删除
用户组管理
- 每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。
- 不同Linux系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。
- 用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。
查看用户组信息
- 查看用户组信息 :
- 终端命令 :
cat /etc/group
, 非 root 用户要在命令前面添加sudo
- 终端命令 :
新建用户组
- 终端命令 :
- 在 root 用户下输入 :
groupadd meifa
, 即可添加 meifa 用户组
- 在 root 用户下输入 :
修改用户的组
- 终端命令 :
- 在 root 用户下输入 :
usermod -g meifa tony
, 即可将 tony 用户添加到 meifa 用户组
- 在 root 用户下输入 :
修改组名
- 终端命令 :
- 在 root 用户下输入 :
groupmod -n haircut meifa
, 即可修改 meifa 的组名为 haircut
- 在 root 用户下输入 :
删除用户组
- 终端命令 :
- 在 root 用户下输入 :
groupdel tony
, 即可删除指定用户组
- 在 root 用户下输入 :
文件权限类
文件权限介绍
- Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安至性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。
- 在 Linux 中我们可以使用
ll
或者ls -l
命令来显示一个文件的属性以及文件所属的用户和组。
- (1)0首位表示类型在Linux中第一个字符代表这个文件是目录、文件或链接文件等等-代表文件d代表目录1链接文档(linkfile);S
- (2)第1-3位确定属主(该文件的所有者)拥有该文件的权限。—Userar
- (3)第4-6位确定属组(所有者的同组用户)拥有该文件的权限,—Group
- (4)第7-9位确定其他用户拥有该文件的权限—Other
- rwx作用文件和目录的不同解释
- (1)作用到文件:
- [r]代表可读(read):可以读取,查看
- [w]代表可写(write):可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件.
- [x]代表可执行(execute):可以被系统执行
- (2)作用到目录:
- [r]代表可读(read):可以读取,ls查看目录内容
- [w]代表可写(write):可以修改,目录内创建+删除+重命名目录
- [x]代表可执行(execute):可以进入该目录
- (1)作用到文件:
更改文件权限
- 第一种变更权限方法 :
chmod [{ugoa}{+-=}{rwx}] 文件或目录
- 第二种变更权限方法 :
chmod [mode=421][文件或目录]
- u:所有者 g:所有组 o:其他人 a:所有人(u、g、o 的总和)
- r=4 w=2 x=1 rwx=4+2+1=7
更改文件所有者
- 终端命令 :
chown auguigu houge.txt
ls -al
改变所属组
- 终端命令 :
chgrp root houge.txt
ls -al
文件查找类
find文件查找
- find指令将从指定目录向下递归地遍历其各个子目录,将满足条件的文件显示在终端。
- 终端命令 :
find -name info
- 查找当前目录下的所有叫 info 的文件
- 终端命令 :
find /root -name info
- 查找
/root
目录下的所有叫 info 的文件
- 查找
- 终端命令 :
find /root -name "*.cfg"
- 查找
/root
目录下的所有后缀为.cfg
的文件
- 查找
- 终端命令 :
find /root -size +10M
- 查找
/root
目录下的所有大于 10M 的文件
- 查找
- 终端命令 :
locate定位文件路径
- locate指令利用事先建立的系统中所有文件名称及路径的locate数据库实现快速定位给定的文件。
- Locate指令无需遍历整个文件系统,查询速度较快。
- 为了保证查询结果的准确度,管理员必须定期更新 locate 时刻。
- 终端命令 :
locate tmp
- 查找所有叫 tmp 的文件
grep过滤查找和管道符
- 管道符,“|”,表示将前一个命令的处理结果输出传递给后面的命令处理
- 基本语法 :
- grep -n 查找内容 源文件
- 参数 -n: 显示匹配行和行号
- 终端命令 :
ls | grep -n boot initial-setup-ks.cfg
- grep -n 查找内容 源文件
文件压缩类
gzip/gunzip压缩
- 1)基本语法
gzip 文件
(功能描述:压缩文件,只能将文件压缩为*.gz文件)- 终端命令 :
gzip xzhdx.txt
- 终端命令 :
gunzip 文件.gz
(功能描述:解压缩文件命令)- 终端命令 :
gunzip xzhdx.txt.gz
- 终端命令 :
- 2)经验技巧
- (1)只能压缩文件不能压缩目录
- (2)不保留原来的文件
- (3)同时多个文件会产生多个压缩包
zip/unzip压缩
- 基本语法 :
zip [选项] XXX.zip
将要压缩的内容(功能描述:压缩文件和目录的命令)- 选项
-r
: 压缩目录
- 选项
unzip [选项] XXX.zip
(功能描述:解压缩文件)- 选项
-d
: 指定解压后文件的存放目录
- 选项
tar打包与解包
- 基本语法 :
tar [选项] xxxx.tar.gz
将要打包进去的内容- 选项 :
-c
: 产生 .tar 打包文件-V
显示详细信息-f
指定压缩后的文件名-z
打包同时压缩-X
解包.tar 文件-C
解压到指定目录
- 选项 :
- 终端命令 :
- 打包 :
tar -zcvf temp.tar.gz initial-setup-ks.cfg xzhdx.txt info 公共/
- 解包 :
tar -zxvftemp.tar.gz -C/tmp
- 打包 :
磁盘分区类
查看文件或目录的大小
- 终端命令 :
du 目录或文件
- 功能描述:显示目录下每个子目录的磁盘使用情况
- 选项 :
- -h 以人们较易阅读的 GBytes,MBytes,KBytes 等格式自行显示;
- -a 不仅查看子目录大小,还要包括文件
- -L 显示所有的文件和子目录大小后,显示总和’
- -C 只显示总和
- –max-depth=n : 指定统计子目录的深度为第n层
查看磁盘使用情况
- 1)基本语法
df 选项
(功能描述:列出文件系统的整体磁盘使用量,检查文件系统的磁盘空间占用情况)
- 2)选项说明
-h
以人们较易阅读的 GBytes,MBytes,KBytes 等格式自行显示;
查看设备挂载情况
- 基本语法 :
lsblk
- 功能描述:查看设备挂载情况
- 选项说明 :
-f
: 查看详细的设备挂载情况,显示文件系统信息
mount/umount挂载/卸载
- 对于Linux用户来讲,不论有几个分区,分别分给哪一个目录使用,它总归就是一个根目录、一个独立且唯一的文件结构。
- Linux中每个分区都是用来组成整个文件系统的一部分,它在用一种叫做“挂载”的处理方法,它整个文件系统中包含了一整套的文件和目录,并将一个分区和一个目录联系起来,要载入的那个分区将使它的存储空间在这个目录下获得。
fdisk分区
- 基本语法 :
fdisk -l
: 查看磁盘分区详情-l
: 显示所有硬盘的分区列表
fdisk 硬盘设备名
: 对新增硬盘进行分区操作- fdisk 命令必须在 root 用户下使用
进程线程类
查看当前系统进程状态
- 基本语法 :
ps aux | grep xxx
: 查看系统中所有进程ps -ef | grep xxx
: 可以查看子父进程之间的关系
- 选项 :
- a 列出带有终端的所有用户的进程
- X 列出当前用户的所有进程,包括没有终端的进程
- u 面向用户友好的显示风格
- e 列出所有进程
- u 列出某个用户关联的所有进程
- f 显示完整格式的进程列表
终止进程
- 终止进程 :
kill -g 进程号
- 参数 :
-g
表示进程立即停止
- 参数 :
查看进程树
- 终端命令 :
pstree [选项]
- 选项 :
-p
: 显示进程的 PID-u
: 显示进程的所属用户
- 选项 :
实时监控系统进程状态
- 终端命令 :
top [选项]
- 选项 :
-d
秒数指定 top 命令每隔几秒更新。默认是 3 秒在 top 命令的交互模式当中可以执行的命令:-i
使 top 不显示任何闲置或者僵死进程。-p
通过指定监控进程ID来仅仅监控某个进程的状态。
- 选项 :
查看网络状态与端口占用
- 基本语法 :
netstat -anp|grep 进程号
(功能描述:查看该进程网络信息)netstat -nlp|grep 端口号
(功能描述:查看网络端口号占用情况)- 选项 :
-a
显示所有正在监听(listen)和未监听的套接字(socket)-n
拒绝显示别名,能显示数字的全部转化成数字-l
仅列出在监听的服务状态-p
表示显示哪个进程在调用
系统定时任务
crontab服务管理
- 重新启动 crond 服务 :
systemctl restart crond
crontab定时任务设置
- 终端命令 :
crond [选项]
- 选项 :
-e
编辑 crontab 定时任务-l
查询crontab 任务-r
删除当前用户所有的crontab任务
- 选项 :
扩展篇
软件包管理
克隆虚拟机
Shell编程
Docker部署
镜像与容器
当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。
- 镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)。
镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub。
Docker的安装
卸载旧版
首先如果系统中已经存在旧的Docker,则先卸载:
1 | yum remove docker \ |
配置Docker的yum库
首先要安装一个yum工具
1 | yum install -y yum-utils |
安装成功后,执行命令,配置Docker的yum源:
1 | yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo |
安装Docker
最后,执行命令,安装Docker
1 | yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
启动和校验
1 | # 查看Docker版本 |
配置镜像加速
这里以阿里云镜像加速为例。
注册阿里云账号
首先访问阿里云网站:
注册一个账号。
开通镜像服务
在首页的产品中,找到阿里云的容器镜像服务:

点击后进入控制台:

首次可能需要选择立刻开通,然后进入控制台。
配置镜像加速
找到镜像工具下的镜像加速器:
页面向下滚动,即可找到配置的文档说明:
具体命令如下:
1 | # 创建目录 |
部署MySQL
首先,我们利用Docker来安装一个MySQL软件,大家可以对比一下之前传统的安装方式,看看哪个效率更高一些。
如果是利用传统方式部署MySQL,大概的步骤有:
搜索并下载MySQL安装包
上传至Linux环境
编译和配置环境
安装
而使用Docker安装,仅仅需要一步即可,在命令行输入下面的命令(建议采用CV大法):
1 | docker run -d \ |
- 如下图即为安装成功 :
- Docker 安装成功,再次部署 MySQL , 也无需再次下载
MySQL安装完毕!通过任意客户端工具即可连接到MySQL.
通过 Navicat 连接数据库:
Docker基础
Docker常见命令
Docker常见命令
- Docker最常见的命令就是操作镜像、容器的命令,详见官方文档:https://docs.docker.com/
案例-拉取Nginx镜像
案例 : 查看DockerHub,拉取Nginx镜像,创建并运行Nginx容器
需求:
在DockerHub(
hub.docker.com
)中搜索Nginx镜像,查看镜像的名称拉取Nginx镜像(
docker pull nginx
)查看本地镜像列表(
docker images
)- 保存镜像 : (
docker save -o nginx.tar nginx:latest
) - 删除镜像 :
docker rmi nginx:latest
- 加载镜像 :
docker load -i nginx.tar
- 保存镜像 : (
创建并运行Nginx容器 :
docker run -d --name nginx -p 80:80 nginx
查看容器
docker ps
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" -a
停止容器 :
docker stop nginx
再次启动容器
docker start nginx
- 即可通过浏览访问虚拟机的 IP (80端口) , 显示网页
查看容器运行日志 :
docker logs [-f] nginx
-f
参数 : 持续查看日志
进入Nginx容器 :
docker exec -it nginx bash
- 进入 mysql 容器 :
docker exec -it mysql bash
mysql -uroot -p
show databases;
- 进入 mysql 容器 :
退出Nginx容器 :
exit
删除容器 :
docker rm nginx [-f]
- 无法删除正在运行的容器,需要先停止该容器
-f
: 为强制删除
命令别名
- 给常用Docker命令起别名,方便我们访问:
1 | # 修改/root/.bashrc文件 |
- 然后,执行命令使别名生效
1 | source /root/.bashrc |
- 接下来,试试看新的命令吧。
数据卷
容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。大家思考几个问题:
如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了?
MySQL、Nginx容器运行后,如果我要修改其中的某些配置该怎么办?
我想要让Nginx代理我的静态资源怎么办?
因此,容器提供程序的运行环境,但是程序运行产生的数据、程序运行依赖的配置都应该与容器****解耦。
什么是数据卷
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机****目录之间映射的桥梁。
以Nginx为例,我们知道Nginx中有两个关键的目录:
html
:放置一些静态资源conf
:放置配置文件
如果我们要让Nginx代理我们的静态资源,最好是放到
html
目录;如果我们要修改Nginx的配置,最好是找到conf
下的nginx.conf
文件。但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。如图:
在上图中:
我们创建了两个数据卷:
conf
、html
Nginx容器内部的
conf
目录和html
目录分别与两个数据卷关联。而数据卷conf和html分别指向了宿主机的
/var/lib/docker/volumes/conf/_data
目录和/var/lib/docker/volumes/html/_data
目录
这样以来,容器内的
conf
和html
目录就 与宿主机的conf
和html
目录关联起来,我们称为挂载。此时,我们操作宿主机的/var/lib/docker/volumes/html/_data
就是在操作容器内的/usr/share/nginx/html/_data
目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。
数据卷命令
命令 | 说明 | 文档地址 |
---|---|---|
docker volume create | 创建数据卷 | docker volume create |
docker volume ls | 查看所有数据卷 | docs.docker.com |
docker volume rm | 删除指定数据卷 | docs.docker.com |
docker volume inspect | 查看某个数据卷的详情 | docs.docker.com |
docker volume prune | 清除数据卷 | docker volume prune |
- 注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。
- 在执行
docker run
命令时,使用-v数据卷:容器内目录可以完成数据卷挂载 - 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
案例-部署静态资源
- 案例1-利用Nginx容器部署静态资源
- 需求:
- 在root目录下 , 创建 Nginx 容器以及数据卷 : (
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
)- 查看数据卷 :
docker volume ls
- 查看数据卷详细信息 :
docker volume inspect html
- 进入到映射目录 :
cd /var/lib/docker/volumes/html/_data
- 查看数据卷 :
- 修改nginx容器内的html目录下的index.html文件,查看变化
- 进入Nginx容器 :
docker exec -it nginx bash
- 进入指定目录 :
cd /usr/share/nginx/html
- 进入Nginx容器 :
- 将静态资源部署到nginx的html目录
- 进入到虚拟机的指定目录 :
cd /var/lib/docker/volumes/html/_data
即可修改网页文件 - 也可以通过 xftp 工具,将文件部署到上述目录
- 进入到虚拟机的指定目录 :
- 在root目录下 , 创建 Nginx 容器以及数据卷 : (
- 需求:
案例-mysql容器的数据挂载
需求:
- 查看mysql容器,判断是否有数据卷挂载
- 基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档)
- 挂载/root/mysql/data到容器内的/var/lib/mysql目录
- 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录,携带课前资料准备的sQL脚本
- 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录,携带课前资料准备的配置文件
在执行 docker run命令时,使用-v本地目录:容器内目录可以完成本地目录挂载
本地目录必须以“7”或“.7”开头,如果直接以名称开头,会被识别为数据卷而非本地目录
- -v mysql:/var/lib/mysql 会被识别为一个数据卷叫mysql
- -v ./mysql:/var/lib/mysql 会被识别为当前目录下的mysql目录
1 | # 1.删除原来的MySQL容器 |
自定义镜像
自定义镜像
- 镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
镜像结构
Dockerfile
- 由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。
- 而这种记录镜像结构的文件就称为Dockerfile,其对应的语法可以参考官方文档:
- 其中的语法比较多,比较常用的有:
指令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜像 | FROM centos:6 |
ENV | 设置环境变量,可在后面指令使用 | ENV key value |
COPY | 拷贝本地文件到镜像的指定目录 | COPY ./xx.jar /tmp/app.jar |
RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN yum install gcc |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
- 例如,要基于Ubuntu镜像来构建一个Java应用,其Dockerfile内容如下:
1 | # 指定基础镜像 |
同学们思考一下:以后我们会有很多很多java项目需要打包为镜像,他们都需要Linux系统环境、JDK环境这两层,只有上面的3层不同(因为jar包不同)。如果每次制作java镜像都重复制作前两层镜像,是不是很麻烦。
所以,就有人提供了基础的系统加JDK环境,我们在此基础上制作java镜像,就可以省去JDK的配置了:
1 | # 基础镜像 |
- 是不是简单多了。
自定义网络
- 加入自定义网络的容器才可以通过容器名互相访问,Docker的网络操作命令如下:
创建容器的同时加入自定义网络 :
docker run -d --name dd -p 8080:8080 --network heima docker-demo
DockerCompose
- DockerCompose通过-一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。
- dockercompose的命令格式如下:
- 感谢你赐予我前进的力量