docker容器与虚拟机的区别?
docker容器
- 所有容器共享宿主机的内核
- 通过namespace实现资源隔离,通过cgroup实现限制资源的最大使用量
- 秒级启动速度
- 容器相当于宿主机的进程,性能几乎没有损耗
- 一个宿主机可以启动成百上千个容器
虚拟机
- 每个虚拟机都有独立的操作系统和内核
- 完全隔离。每个虚拟机都有独立的硬件资源分配
- 分钟级启动速度
- 需要通过hypervisor虚拟机管理程序对宿主机资源虚拟访问,会有一定的性能损耗
- 最多几十个虚拟机
Linux 六大 namespace
- MNT(mount):文件系统隔离
- NET(network):网络资源隔离
- PID:进程的pid隔离
- IPC:进程间通信隔离
- UTS:主机名隔离
- USER:用户隔离
镜像操作
- docker search 关键字 #根据仓库或镜像的关键字搜索镜像
- pull 仓库名/镜像名:标签 #下载镜像,如果不指定标签则默认使用 :latest
- images [-q] #查看镜像列表,-q 表示仅显示镜像ID
- inspect 镜像名或镜像ID #查看镜像的详细信息
- tag 旧镜像名:旧标签 新镜像名:新标签 #添加新的镜像名或标签
- rmi 镜像名或镜像ID [-f] #删除镜像
- save -o 镜像文件路径 镜像名或镜像ID #将镜像导出为文件
- load -i 镜像文件路径 #将镜像文件导入docker
- load < 镜像文件路径
- login 仓库地址 #登录镜像仓库
- push 仓库名/镜像名:标签 #上传镜像到仓库
容器操作
- docker create [-i -t] [--name 容器名] 镜像名:标签 [容器启动命令] #创建容器
- start 容器名或容器ID #启动容器
- ps -a [-q] #查看容器列表
- inspect 容器名或容器ID #查看容器的详细信息
- stop 容器名或容器ID [-t 等待时间] #停止容器,发送 SIGTERM 信号,默认等待10s
- kill 容器名或容器ID #停止容器,默认发送 SIGKILL 信号
- rm 容器名或容器ID [-f] #删除容器
- exec -it 容器名或容器ID sh|bash #登录容器
- cp 宿主机文件路径 容器名或容器ID:绝对路径 #复制宿主机文件到容器中
- cp 容器名或容器ID:绝对路径 宿主机文件路径 #复制容器文件到宿主机中
- logs 容器名或容器ID #查看容器中PID=1的主进程的日志
- docker export 容器名或容器ID > 容器模板文件 docker export -o 容器模板文件 容器名或容器ID #将容器导出成文件
- docker import 容器模板文件 -- 镜像名:标签 cat 容器模板文件 | docker import - 镜像名:标签 #将容器模板文件导入成镜像
docker run
- -d [-i -t] [--name 容器名] 镜像名:标签 [容器启动命令] #创建并启动容器
- -P #使用随机的宿主机端口映射容器端口(从32768开始)
- -p 宿主机端口:容器端口 #使用指定的宿主机端口映射容器端口
- -v 宿主机绝对路径:容器绝对路径[:ro] #将宿主机的目录或文件挂载到容器的数据卷目录
- --volumes-from 数据卷容器名 #共享数据卷容器的数据卷目录,实现容器与容器之间的数据共享
- --link 目标容器名:连接别名 #创建容器互联,实现在容器内通过目标容器名或连接别名与目标容器通信
docker run 的启动过程
- 1)检查本地是否有指定镜像,如果有则直接使用本地镜像创建容器,如果没有则从仓库拉取镜像再创建容器
- 2)在只读的镜像层上再挂载一层可读可写的容器层
- 3)从docker网桥给容器分配一个虚拟接口和IP地址
- 4)使用镜像的默认启动命令或docker run 指定的命令来启动容器,直到容器中的PID=1的主进程退出为止