文章目录
面试题
传统虚拟机和Docker的区别?
虚拟机
虚拟机其实就是文件,不需要就删掉,操作系统和硬件之间逻辑不变
虚拟机技术基于安装在主操作系统上的虚拟机管理软件,创建虚拟机还能虚拟出各种硬件,从操作系统
- 资源占用多(内核,硬件,软件都模拟了)
- 冗余步骤多(打开虚拟机步骤多)
- 启动太慢了
Docker容器
不是模拟完整的操作系统
轻量级,启动速度快,占用体积小
容器相互之间是隔离的,每个容器有自己的文件系统,容器之间的进程不会相互影响,能区分计算资源
对比
传统虚拟机是虚拟出硬件之后在上面运行操作系统,再在该系统上运行所需应用
Docker容器内的应用进程直接运行于宿主的内核,没有自己的内核也没有进行硬件虚拟,所以轻便很多
为什么Docker比虚拟机快?
-
docker不需要虚拟机虚拟硬件,直接使用物理机的硬件资源,因此在CPU,内存利用率上docker有明显优势
-
docker利用的是宿主机的内核,不需要加载操作系统内核,进而避免费时间的操作,忽略了创建虚拟机的过程
Docker虚悬镜像是什么?
仓库名标签名都是的镜像就是虚悬镜像
无用,删掉
三件套
- 镜像
- 容器
- 仓库
仓库是存放镜像的地方
容器是镜像的实例
仓库分为公开仓库和私有仓库(国内一般用阿里云)
Docker是C/S结构,Docker守护进程运行在主机上,通过Socket链接从客户端访问
疑问
- 守护进程
- WebSocket
https://docs.docker.com/reference/
需要安装gcc和g++
报错
登录阿里云,注册并查看镜像容器服务
获得加速器地址,分为个人和企业
作用:可以加快镜像的下载速度
操作:阿里云官网有
docker 常用命令
帮助启动类命令
启动docker
systemctl start docker
停止docker
systemctl stop docker
重启docker
systemctl restart docker
查看docker状态
systemctl status docker
开机启动
systemctl enable docker
查看docker概要
docker info
查看docker总体帮助文档
docker --help
查看docker命令帮助文档
docker 具体命令 --help
镜像命令
查看镜像
docker images
REPOSITORY:镜像仓库源
TAG:镜像标签,类似版本号
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:经i想大小
ops
-a
列出本地所有镜像-q
只显示镜像ID
查找镜像
docker search 镜像名称
ops:
--limit
只列出N个镜像,默认25个
拉取镜像
docker pull 镜像名称
docker pull 镜像名称:TAG
不写TAG默认最新版,等价于docker pull 镜像名称:latest
查看镜像/容器/数据卷所占用的空间
docker system df
删除镜像
docker rmi 镜像ID
docker容器命令
docker执行
docker run
ops:
-d
后台运行容器并返回容器ID, 即启动守护式容器(后台运行)-i
交互模式运行容器,通常与-t
一起使用-t
为容器重新分配一个伪终端,通常与-i
一起使用-P
随机端口映射(大写P)-p
指定端口映射(小写p)
docker run -p 80:80
hostPort:containerPort
docker ps
-a
列出所有正在运行的容器和历史上运行过的容器
-l
显示最近创建的容器
-n
显示最近n个创建的容器
-q
静默模式,只显示容器编号
退出容器
两种退出方式
- exit退出,容器停止
- ctrl+p+q退出,容器不停止
启动已经停止运行的容器
docker start 容器ID或容器名
重启容器
docker restart 容器ID或者容器名
停止容器
docker stop 容器ID或者容器名
强制停止容器
docker kill 容器ID或容器名
删除已经停止的容器
docker rm 容器ID
如果是docker rmi
那删除的是镜像,不然就是容器
没有停止的强制删除
docker rm -f 容器ID
后台运行
docker run -d 容器名
docker容器后台运行必须要有一个前台进程(一直挂起的命令),如果没有会自动退出(docker程序会认为你没事做了就kill容器)
查看容器日志
docker logs 容器ID
查看容器内运行的进程
docker top 容器ID
查看容器内部细节
docker inspect 容器ID
正在运行的容器以命令行形式进行交互
两种方式:
-
docker exec -it 容器ID hashShell
-
docker attach 容器ID
区别:
- attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出会导致容器停止
- exec 是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器停止
容器内拷贝文件到主机
docker cp 容器ID:容器内路径 目的主机路径
导入导出容器
- export 导出容器的内容流作为一个tar归档文件(
docker export 容器ID 文件名.tar
) - import 从tar包中的内容创建一个新的文件系统再导入为镜像(
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
)
到时候镜像列表显示的是镜像用户名/镜像名
Docker底层原理
镜像分层
UnionFS
UnionFS(联合文件系统)是一种分层,轻量级,高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下.Union文件是docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像可以制作各种具体的应用镜像
特性:一次同时加载多个文件系统,但从外面看起来,智能看到一个文件系统,联合加载会把各层文件系统叠加起来
docker加载原理
容器可以看做是一个简易版的linux环境
docker的镜像实际是由一层一层的UnionFS
文件系统组成,
docker镜像最底层是引导文件系统bootfs
,主要包括bootloader
和kernel
,bootloader
主要是引导加载kernel
,linux启动时会加载bootfs
,当boot加载完成之后整个内核就都在内存中了,此时bootfs转交给内核,系统也会卸载bootfs,然后加载rootfs
rootfs
在bootfs
之上,包含的就是典型的linux系统中的/dev,/proc,/bin,/etc等标准目录和文件
对于不同发行版bootfs基本一致,所以不同发行版可以公用bootfs
镜像分层的最大好处是共享资源,方便复制迁移,就是为了复用
当容器启动时,一个新的可写层被加载到镜像的顶部
这一层通常被称作"容器层",“容器层"之下的都叫"镜像层”
docker镜像层是只读的,容器层是可写的
新镜像
提交
命令
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
返回一个ID
发布
按照阿里云的提示即可