Linux入门篇

Linux概述

Linux是什么

  • Linux 是一个操作系统(OS)
image-20231116195518357

Linux的诞生

  • 作者 : 李纳斯·托瓦兹(Linus Torvalds)
    • 上大学期间,对 Unix 产生了浓厚兴趣
    • 1991年初,开始基于 Minix(Unix的变种) 进行开发
    • 1991年6月,确定开发一个类 Unix 操作系统内核
    • 1991年9月,将开发完成内核的 0.01 版本,命名为 Linux

Linux与Unix的渊源

image-20231116201339856

GNU/Linux

image-20231116202734240

Linux的发行版

image-20231116203500595

Linux与Window

image-20231116203840685

Linux安装

CentOS系统下载

VMware虚拟机下载

创建虚拟机

  • 01 双击 VMware 虚拟机安装包,启动安装 VMware , 直接下一步直到完成即可 , 安装完成后打开 VMware 如下

image-20231117140920166

  • 02 点击创建新的虚拟机, 选择自定义 , 下一步 , 直接下一步 , 选择稍后安装操作系统 , 下一步

image-20231117141255632

  • 03 选择客户机操作系统为 Linux , 版本选择为 CentOS 7 64 位 , 下一步
  • 04 输入虚拟机名称 , 并选择保存地址 , 下一步
  • 05 根据实际需要 , 选择处理器数量和内核数量(注意不能超过物理机的内核总数),下一步

image-20231117141703006

  • 06 选择虚拟机内存 , 下一步
  • 07 选择网络类型为 “使用网络地址转换” , 下一步
  • 08 选择 I/O 控制器类型为 “LSI Logic(L)” ,下一步

image-20231117142030334

  • 09 选择磁盘为 “创建新虚拟磁盘” , 下一步
  • 10 根据实际需要 , 指定磁盘容量 , 下一步
  • 11 下一步

image-20231117142352800

  • 12 点击完成即可完成创建

image-20231117142437165

  • 13 确认物理机的虚拟化已启用
    • 如何开启虚拟化 : 进入 BIOS 设置, 启动 CPU 虚拟化

image-20231117142734277

安装CentOS系统

  • 01 打开 VMware , 双击 “CD/DVD(IDE)” , 进行虚拟机设置 , 并选择 CentOS 镜像 , 点击确定后即可开启虚拟机进行 CentOS 的安装

image-20231117143507783

  • 02 通过键盘选择第一个选项 “install CentOs 7” , 回车

image-20231117143843168

  • 03 选择语言 , 点击继续

image-20231117144113962

  • 04 选择软件为 “GNOME桌面”

image-20231117144753716

  • 05 点击”安装位置”, 选择 “我要配置分区” , 点击完成

image-20231117150040762

  • 06 添加以下三个挂载点 , 点击完成 , 点击接受更改

image-20231117150814295

  • 07 禁用 KDUMP

image-20231117151041704

  • 08 设置网络主机名

![image-20231117151349272](https://s1.vika.cn/space/2023/11/17/4343cc6a6b7c42858f6### 2a5c3f3c6a)

  • 09 点击开始安装

  • 10 设置密码 “root123456”

    • 在生成环境中,该密码必须要足够复杂
image-20231117151634111
  • 11 设置用户名 “atguigu”
image-20231117151838094
  • 12 等待安装完成,重启,接受协议,点击完成配置即可

基础篇

目录结构

image-20231117204659091

Vi / Vim编辑器

Vi / Vim编辑器

  • VI 是Unix操作系统和类Unix 操作系统中最通用的文本编辑器
  • VIM 编辑器是从VI发展出来的一个性能更强大的文本编辑器。可以主动的以字体颜色辨别语法的正确性,方便程序设计。VIM与V编辑器完全兼容。

Vi / Vim 编辑器的打开

  • 01 默认不支持输入汉字,需要添加汉语输入法 : 应用程序 - 系统工具 - 设置
    • 在 Linux 中 , 切换输入法 : “win + 空格”

image-20231118103423634

  • 02 桌面右击 - 打开终端
  • 03 进入到指定的目录下 , 输入命令 “vim xxxxx.xxx” 或者 “vi xxxxx.xxx”, 即可打开指定文件 , 默认是一般模式

模式间转换

image-20231118103659988

一般模式

  • 复制当前行命令 : “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 地址 :

image-20231220191004109

  • 测试虚拟机连接物理机 :

image-20231220191049647

  • 测试物理机连接虚拟机 :

image-20231220191133439

网络连接模式

  • 桥接模式
    • 虚拟机直接连接外部物理网络的模式,主机起到了网桥的作用。这种模式下,虚拟机可以直接访问外部网络,并且对外部网络是可见的。“
  • NAT 模式“
    • 虚拟机和主机构建一个专用网络,并通过虚拟网络地址转换 (NAT)设备对 IP 进行转换。
    • 虚拟机通过共享主机IP 可以访问外部网络,但外部网络无法访问虚拟机。
  • 仅主机模式
    • 虚拟机只与主机共享一个专用网络,与外部网络无法通信。

修改静态IP

  • 使用自动获取 IP 即可

配置主机名

  • 方法一 : 输入 : vim /etc/hostname , 修改配置文件,并重启虚拟机系统即可
  • 方法二: 输入 : hostnamectl set-hostname xxxxxxxxx 即可直接修改主机名

远程登录

  • 在本地物理机终端输入 : ssh root@192.168.1.9 , 再输入 yes , 再输入虚拟机的用户密码即可

image-20231220193133507

  • 使用 Xshell 登录虚拟机 :

image-20231220194339753

  • Xftp 连接虚拟机 :

image-20231220194924912

系统管理

进程和服务

  • 计算机中,一个正在执行的程序或命令,被叫做 “进程’ (process)
  • 启动之后一直存在、常驻内存的进程,一般被称作“服务 (service)

服务管理

  • 基本语法 :
    • 终端输入 systemctl start|stop|restart|status 服务名
      • 这是 Centos 7 的写法
    • 查看服务的方法 :
      • 终端输入 ls /usr/lib/systemd

系统运行级别

  • 系统运行过程:

image-20231220200937459

  • 运行级别 :

    • Linux系统有7种运行级别(runlevel): 常用的是级别3和5
      • 运行级别0: 系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
      • 运行级别1: 单用户工作状态,root权限,用于系统维护,禁止远程登陆
      • 运行级别2: 多用户状态(没有NFS),不支持网络
      • 运行级别3: 完全的多用户状态(有NFS),登陆后进入控制台命令行模式
      • 运行级别4: 系统未使用,保留
      • 运行级别5: X11控制台,登陆后进入图形GUI模式
      • 运行级别6: 系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
  • 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 文件
  • 命令 : ln -s /root/info/ myInfo
    • 在当前目录下新建 myInfo 链接文件,指向 /root/info/ 文件夹

历史命令

  • 命令 : 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 用户的密码即可

image-20231223113248639

删除用户

  • 删除用户 :

    • 终端命令 : userdel tony

      • 删除掉 tony 用户 , 但是 tony 用户的目录还是会被默认保留的, 可以通过 rm -rf tony/ 命令删除用户对应的目录,但是不建议删除该用户目录

      • 直接删除 : userdel -r tony , 直接连同用户目录一起删除

用户组管理

  • 每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。
  • 不同Linux系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。
  • 用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。

查看用户组信息

  • 查看用户组信息 :
    • 终端命令 : cat /etc/group , 非 root 用户要在命令前面添加 sudo

新建用户组

  • 终端命令 :
    • 在 root 用户下输入 : groupadd meifa , 即可添加 meifa 用户组

修改用户的组

  • 终端命令 :
    • 在 root 用户下输入 : usermod -g meifa tony , 即可将 tony 用户添加到 meifa 用户组

修改组名

  • 终端命令 :
    • 在 root 用户下输入 : groupmod -n haircut meifa , 即可修改 meifa 的组名为 haircut

删除用户组

  • 终端命令 :
    • 在 root 用户下输入 :groupdel tony , 即可删除指定用户组

文件权限类

文件权限介绍

  • Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安至性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。
  • 在 Linux 中我们可以使用ll或者ls -l命令来显示一个文件的属性以及文件所属的用户和组。

image-20231223120442223

  • (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):可以进入该目录

更改文件权限

image-20231223133850735

  • 第一种变更权限方法 : 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

文件压缩类

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

image-20231223220013246

Docker的安装

卸载旧版

首先如果系统中已经存在旧的Docker,则先卸载:

1
2
3
4
5
6
7
8
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

配置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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看Docker版本
docker -v

# 查看是否能连接守护进程 , 如果不能连接,启动 Docker 即可
docker images # 查看本地镜像列表

# 启动Docker
systemctl start docker

# 停止Docker
systemctl stop docker

# 重启
systemctl restart docker

# 设置开机自启
systemctl enable docker

# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

配置镜像加速

这里以阿里云镜像加速为例。

注册阿里云账号

首先访问阿里云网站:

https://www.aliyun.com/

注册一个账号。

开通镜像服务

在首页的产品中,找到阿里云的容器镜像服务

image-20231224140204745

点击后进入控制台:

image-20231224140220554

首次可能需要选择立刻开通,然后进入控制台。

配置镜像加速

找到镜像工具下的镜像加速器

img

页面向下滚动,即可找到配置的文档说明:

image-20231224140622837

具体命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建目录
mkdir -p /etc/docker

# 复制内容,注意把其中的镜像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
EOF

# 重新加载配置
systemctl daemon-reload

# 重启Docker
systemctl restart docker

部署MySQL

  • 首先,我们利用Docker来安装一个MySQL软件,大家可以对比一下之前传统的安装方式,看看哪个效率更高一些。

  • 如果是利用传统方式部署MySQL,大概的步骤有:

    • 搜索并下载MySQL安装包

    • 上传至Linux环境

    • 编译和配置环境

    • 安装

  • 而使用Docker安装,仅仅需要一步即可,在命令行输入下面的命令(建议采用CV大法):

1
2
3
4
5
6
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql

image-20231224144020860

  • 如下图即为安装成功 :
    • Docker 安装成功,再次部署 MySQL , 也无需再次下载

image-20231224142313394

  • MySQL安装完毕!通过任意客户端工具即可连接到MySQL.

  • 通过 Navicat 连接数据库:

image-20231224142115691

Docker基础

Docker常见命令

Docker常见命令

image-20231225123858442

案例-拉取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

    • 查看容器运行日志 : docker logs [-f] nginx

      • -f 参数 : 持续查看日志
    • 进入Nginx容器 : docker exec -it nginx bash

      • 进入 mysql 容器 :
        • docker exec -it mysql bash
        • mysql -uroot -p
        • show databases;
    • 退出Nginx容器 : exit

    • 删除容器 : docker rm nginx [-f]

      • 无法删除正在运行的容器,需要先停止该容器
      • -f : 为强制删除

命令别名

  • 给常用Docker命令起别名,方便我们访问:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 修改/root/.bashrc文件
vi /root/.bashrc


内容如下:
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
  • 然后,执行命令使别名生效
1
source /root/.bashrc
  • 接下来,试试看新的命令吧。

数据卷

  • 容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。大家思考几个问题:

    • 如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了?

    • MySQL、Nginx容器运行后,如果我要修改其中的某些配置该怎么办?

    • 我想要让Nginx代理我的静态资源怎么办?

  • 因此,容器提供程序的运行环境,但是程序运行产生的数据、程序运行依赖的配置都应该与容器****解耦

什么是数据卷

  • 数据卷(volume)是一个虚拟目录,是容器内目录宿主机****目录之间映射的桥梁。

  • 以Nginx为例,我们知道Nginx中有两个关键的目录:

    • html:放置一些静态资源

    • conf:放置配置文件

  • 如果我们要让Nginx代理我们的静态资源,最好是放到html目录;如果我们要修改Nginx的配置,最好是找到conf下的nginx.conf文件。

  • 但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。如图:

image-20231225144202846

  • 在上图中:

    • 我们创建了两个数据卷:confhtml

    • Nginx容器内部的conf目录和html目录分别与两个数据卷关联。

    • 而数据卷conf和html分别指向了宿主机的/var/lib/docker/volumes/conf/_data目录和/var/lib/docker/volumes/html/_data目录

  • 这样以来,容器内的confhtml目录就 与宿主机的confhtml目录关联起来,我们称为挂载。此时,我们操作宿主机的/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的html目录
        • 进入到虚拟机的指定目录 : cd /var/lib/docker/volumes/html/_data即可修改网页文件
        • 也可以通过 xftp 工具,将文件部署到上述目录

案例-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
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
# 1.删除原来的MySQL容器
docker rm -f mysql

# 2.进入root目录
cd ~

# 3.创建并运行新mysql容器,挂载本地目录
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v ./mysql/data:/var/lib/mysql \
-v ./mysql/conf:/etc/mysql/conf.d \
-v ./mysql/init:/docker-entrypoint-initdb.d \
mysql

# 4.查看root目录,可以发现~/mysql/data目录已经自动创建好了
ls -l mysql
# 结果:
总用量 4
drwxr-xr-x. 2 root root 20 5月 19 15:11 conf
drwxr-xr-x. 7 polkitd root 4096 5月 19 15:11 data
drwxr-xr-x. 2 root root 23 5月 19 15:11 init

# 查看data目录,会发现里面有大量数据库数据,说明数据库完成了初始化
ls -l data

# 5.查看MySQL容器内数据
# 5.1.进入MySQL
docker exec -it mysql mysql -uroot -p123
# 5.2.查看编码表
show variables like "%char%";
# 5.3.结果,发现编码是utf8mb4没有问题
+--------------------------+--------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+

# 6.查看数据
# 6.1.查看数据库
show databases;
# 结果,hmall是黑马商城数据库
+--------------------+
| Database |
+--------------------+
| hmall |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
# 6.2.切换到hmall数据库
use hmall;
# 6.3.查看表
show tables;
# 结果:
+-----------------+
| Tables_in_hmall |
+-----------------+
| address |
| cart |
| item |
| order |
| order_detail |
| order_logistics |
| pay_order |
| user |
+-----------------+
# 6.4.查看address表数据
+----+---------+----------+--------+----------+-------------+---------------+-----------+------------+-------+
| id | user_id | province | city | town | mobile | street | contact | is_default | notes |
+----+---------+----------+--------+----------+-------------+---------------+-----------+------------+-------+
| 59 | 1 | 北京 | 北京 | 朝阳区 | 13900112222 | 金燕龙办公楼 | 李佳诚 | 0 | NULL |
| 60 | 1 | 北京 | 北京 | 朝阳区 | 13700221122 | 修正大厦 | 李佳红 | 0 | NULL |
| 61 | 1 | 上海 | 上海 | 浦东新区 | 13301212233 | 航头镇航头路 | 李佳星 | 1 | NULL |
| 63 | 1 | 广东 | 佛山 | 永春 | 13301212233 | 永春武馆 | 李晓龙 | 0 | NULL |
+----+---------+----------+--------+----------+-------------+---------------+-----------+------------+-------+
4 rows in set (0.00 sec)

自定义镜像

自定义镜像

  • 镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。

镜像结构

image-20231225174431619

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 指定项目监听的端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]
  • 同学们思考一下:以后我们会有很多很多java项目需要打包为镜像,他们都需要Linux系统环境、JDK环境这两层,只有上面的3层不同(因为jar包不同)。如果每次制作java镜像都重复制作前两层镜像,是不是很麻烦。

  • 所以,就有人提供了基础的系统加JDK环境,我们在此基础上制作java镜像,就可以省去JDK的配置了:

1
2
3
4
5
6
7
8
9
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
  • 是不是简单多了。

自定义网络

  • 加入自定义网络的容器才可以通过容器名互相访问,Docker的网络操作命令如下:

image-20231225180533618

创建容器的同时加入自定义网络 :

  • docker run -d --name dd -p 8080:8080 --network heima docker-demo

DockerCompose

  • DockerCompose通过-一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。

image-20231225182212511

  • dockercompose的命令格式如下:

image-20231225183048729