物理机:对虚拟机而言的实体计算机的称呼,提供了硬件环境的支持
虚拟机: 通过虚拟化技术将一台计算机虚拟化为多台计算机,这些虚拟计算机完全隔离,可以运行不同的操作系统,互相不会干扰
容器:也是一种虚拟化技术,不过虚拟机是在物理层面,而容器是在操作系统层面
,他们共享一个操作系统内核,以应用视角运行在容器中是运行在一个完整的操作系统中的,而从虚拟机的角度看,应用是运行在一个经过特殊隔离的进程中的,他们调用的是同一个内核,但是文件,网络,进程被隔离了
容器虚拟化基础技术 namespace
Linux namespace是对全局资源进行封装,将进程,文件,网络等资源统一封装到相同的namespace中,使得拥有不同的namespace的进程拥有独立的系统资源,且不同的namespace之间不会相互影响,甚至不会知道其他容器的存在
namespace使用
dd
-if=xx 读取那个文件
-of=xx 输出到那个文件中
Ibs=xx 一次读入多少个字节,设定一次读取块的大小xx
obs=xx 一次输出多少个字节
bs=xx 同时读入和输出xx个字节
count=xx 读取多少个块
skip=xx 从输入文件中跳过xx个块后开始读取
seek=xx 从输出文件跳过多少个块后开始复制
conv=xx 可以设置一些其他的选项 lcase 把大写改小写 ucase 小写改大写 sync 将每个输入块填充到ibs个字节,不足的用null填充
mkfs
在linux上创建文件系统,并格式化,这样就可以通将文件挂载到操作系统中像平常使用文件系统一样在这个文件中使用相同的操作
mkfs [-v] [-t fstype] [fs-option] filesys [blocks]
-t fstype 建立哪种格式的文件系统 ext3 ext4
filesys 格式化哪个文件
blocks 指定文件磁盘数
df
查看磁盘的使用情况
df [option] ...[file]
option:
-h 以我看的懂的方式显示
-th 输出磁盘的类型
mount 将文件系统加载到指定的地方,这样就可以使用使用mkfs格式化的文件系统了
为磁盘文件添加一个入口 类似于 C:/ 的作用
mount [-l] 显示所有支持的系统文件格式
mount [-t vfstype] [-o option] device dir
-t 表示device的格式 不写也可以自己识别
-o loop 把一个文件当作设备挂接系统中
ro 只读方式挂接设备
rw 读写方式挂接设备
device 要挂接的设备 之前写的镜像文件也属于设备
dir 挂接的位置
删除挂载点
umount filesystem 挂载点
unshare
命名空间的隔离,使用于父程序不共享的命名空间运行程序
unshare [options] program [arguments]
options选择的参数
-i --ipc 不共享IPC
-n --net 不共享Net
-u --uts 不共享UTS
-I --pid 不共享PID
-u --use 不共享用户
-m --mount 不共享Mount
--fork 创建一个新的进程,在这个进程中执行unshare参数
--mount-proc 执行子进程之前,把proc先挂载过去
program是不共享的程序
使用unshare -p /bin/bash 运行一个隔离pid的bash程序时 会报出
bash: fork: Cannot allocate memory 错误
是因为在新的PID空间中,bash作为pid 1 进程会有特殊的作用
他需要当人init 进程的角色,处理僵尸进程的回收,孤儿进程的托管
而bash并不支持,所以在他之前fork 一个进程来完成这些工作
unshare -p --fork /bin/bash
这样能先创建一个进程,在这个进程中执行bash,但是执行ps -ef查看pid时,还会发现,其实和父进程和pid时相同的并没有完成隔离看起来,那么就子fork进程时把proc给挂载过去
unshare -p --fork --mount-proc /bin/bash
这样在执行ps -ef 会发现更加干净了
mount隔离
unshare -m --fork /bin/bash
这时就创建了一个mount磁盘隔离,那么这时我再在这里面挂载一个磁盘,就会发现再外面使用df -h都看不到这个磁盘,而只有再当前这个隔离的进程中才能看到
docker的安装
uname -a 查看cpu
cat /etc/*release* 查看服务器信息
卸载旧版本docker
sudo apt-get remove docker docker-engine
卸载docker软件
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras -y
下载curl命令 用它来访问网址下载docker
sudo apt install curl -y
创建gpg key目录
sudo mkdir -m 0755 -p /etc/apt/keyrings
#下载 gpg key 用来验证软件包
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg
修改docker源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装docker
sudo apt-get update
安装docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin的指令
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
#配置加载
sudo systemctl daemon-reload
#启动服务
sudo systemctl start docker
#开启启动
sudo systemctl enable docker
#查看服务状态
sudo systemctl status docker
配置镜像源
/etc/docker/daemon.json 中添加镜像源配置
{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
docker 指令
docker login [option] [server]
-u 用户名 -p 密码
场景 当需要从一个私人镜像仓库中拉取镜像,或推送一个镜像到私人仓库中
docker pull [option] name[:tag|@digest]
拉取docker镜像
docker pull nginx:1.23.4
卸载nigix
查看是否是通过apt下载的
dpkg -l nginx
干净的卸载nginx
apt --purge autoremove nginx
安装nginx
apt install nginx
ubuntu在下载的nginx吧默认打开的路径修改了 在include /etc/nginx/sites-enabled/*; 这这个文件中能找到/etc/nginx/sites-available/default在这里面是nginx服务的一些配置信息其中有一个 root /var/www/html; 表示了这个Ubuntu默认的html所在位置 而niginx本来的其实是在/usr/share/nginx/html中
从本地推送进行到仓库 需要先登录
docker push [option] name[:tag]
寻找镜像
docker search [option] term 被墙了,一般也不用,直接去网站上找
登出
docker logour
列出本地镜像
docker images [option] [responsitroy[:tag]]
docker images -a
docker images -ls
docker images -list
都是一样的列出全部
当然还有
--digests :显示镜像的摘要信息;
○ -f :显示满足条件的镜像;
○ --format :指定返回值的模板文件;
○ --no-trunc :显示完整的镜像信息;
○ -q :只显示镜像 ID。
创建一个容器并运行以一个镜像
docker run [option] imagin [comman] [arg]
option:
-d 后台运行容器
-P 随机映射段口,随机将宿主端口映射到容器端口
-p 宿主:容器 将宿主端口和容器端口映射
-i 一交互式打开一个容器,可以输入命令交互 但是不怎么好看
-t 为容器分配一个伪输入终端,类似于[root@mycentos /]# 但是不能使用命令交流,一般和i结合
-h 设置主机名
--rm 在容器退出时删除这个容器
--name=xx 为这容器命名
-m 设置容器的最大使用内存
--cpuset-cpus="0-2" or --cpuset-cpus="0,1,2" 给容器设置使用cpu的数量
--volume -v 绑定一个卷
列出容器
docker ps [options]
-a 列出所以容器包括没有运行的
-n 返回最近创建的n个容器
-l 放回最近创建的容器
-- no-trunc 不中断输出 ,容器信息展示的最全面
lxc是一种系统层的虚拟化技术,
以前 docker使用的就是lxc 只不过后来就改为自家的libcontainer,用来打造更加通用的底层虚拟库
lxc 创建容器
lxc-create -t [容器类型] -n [容器名称]
查看lxc支持的模板类型
ls /usr/share/lxc/template/
创建一个ubuntu的名字为lxchost1容器 并且设置了启动传输 --r Ubuntu的release版本和cpu架构
lxc-create -t ubuntu --name lxchost1 -- -r xenial -a amd64
查看容器
lxc-ls -f
运行容器
lxc-attach -n [容器名称]
lxc-attach -n mylxc --clear-env
删除容器
lxc-destroy -n [name]
查看容器信息
lxc-info -n [name]