虚拟机就是带环境安装的一种解决方案。它可以在一种操作系统里面去运行另一种操作系统。比如在Windows10系统里面运行Linux系统Centos7。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一摸一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。传统虚拟机技术基于安装在操作系统上的虚拟机冠词系统(如VirtualBox和VMWare等),创建虚拟机(虚拟出各种硬件),在虚拟机上安装从操作系统,在从操作系统中安装部署各种应用【显然这种对计算机资源的消耗比较大】
Linux容器(Linux Containers,缩写LXC)是与系统其他部分隔离开的一些列进程,从另一个景象运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有的依赖项,因而在从开发到测试在到生产的整个过程中,它具有可移植性和一致性。Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的资源和设置。系统因此而变的高效轻量并保证了部署在任何环境中的软件都能始终如一。
简单来说容器是一种物理隔离,每个容器都自己的文件系统,它没有进行硬件虚拟,其上所有应用共用一个系统内核;而虚拟机会虚拟出来的一套完整的系统。
Devops新一代开发工程师
镜像(image)
Docker镜像就是一个只读的模版。本身也是一个文件,称为镜像文件。镜像可以用来创建Docker容器,一个镜像可以创建很多容器,它也相当于是一个root文件系统【这个地方还有一个比较直观的理解就是docker镜像文件类似于Java的类模版】
容器(container)
可以把容器看成一个简易版的Linux环境,一个容器运行一种服务,当我们需要的时候,就可以通过Docker客户端创建一个对应的运行实例,也就是我们说的容器。(包括root用户权限、进程空间、用户空间和网络空间)和运行在其中的应用程序。【相当于Java中的对象】
仓库(repository)
存放镜像的地方【类似meavn的仓库,存放各种jar包】。Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模版的地方。仓库分为公开仓库(public)和私有仓库(Private)两种形式。最大的公开仓库就是Docker Hub。存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云等。需要使用的时候拉取下来就可以了。
小总结
Docker是一个C/S模式的架构,后端是一个松耦合架构,众多模块各司其职。Docker运行的基本流程为:
用户使用Docker Client与Docker Daemon建立通信,并发送请求给后者;
Docker Daemon作为Docker架构的主题部分,首先提供Docker Server的功能使其可以接受Docker Client的请求;
Docker Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在;
Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动Graph driver将下载镜像以Graph的形式存储;
当需要Docker创建网络环境时,通过网络管理驱动Network driver创建并配置Docker容器网络环境;
当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Exec driver来完成;
Libcontainer是一项独立的容器管理包,Network Driver以及Exec Driver都是通过Libcontainer来具体对容器进行的操作;
参考
Docker并非是一个通用的容器工具,它依赖于已存在并运行的Linux内核环境。Docker实质上是在已经运行的Linux下制造了一个隔离的文件环境,因此它执行的小李几乎等同于所部署的Linux主机。因此,Docker必须部署在Linux内核的系统上,如果其他系统想要部署Docker就必须安装一个虚拟Linux环境。
目前Centos仅发行版本中的内核支持Docker。Docker运行在Centos7(64-bit)上,要求系统为64位,Linux系统内核版本为3.8以上,这里选用Centos7.x。可以使用以下命令查看自己的内核情况(内核版本、硬件架构、主机名称和操作系统类型等)
[xxx@VM-0-8-centos ~]$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[xxx@VM-0-8-centos ~]$ uname -r
3.10.0-1160.11.1.el7.x86_64
保证自己的网速健康
官网安装地址
# 输出client和server的相关信息
docker version
# 会显示你安装成功的信息
docker run hello-world
配置镜像加速器,需要修改deamon配置文件/etc/docker/daemon.json
bash vi /etc/docker/daemon.json
将registry-mirrors换成你需要的,如我换成了腾讯云镜像加速:
bash "registry-mirrors": [ "https://mirror.ccs.tencentyun.com" ]
systemctl start/stop/restart/status docker
systemctl enable docker
docker info
docker --help
docker 具体命令 --help
查看所有镜像
docker images
# 各项说明
# REPOSITORY:表示镜像的仓库源
# TAG:镜像标签
# IMAGE ID:镜像ID
# CREATED:镜像创建时间
# SIZE:镜像大小
搜索镜像
# 只显示点赞前5个
docker search [--limit 5]
拉取镜像
# 没有TAG就是最新版本
docker pull 镜像名字[:TAG]
查看镜像/容器/数据卷所占的空间
docker system df
删除镜像
# 删除单个
docker rmi -f 镜像id
# 删除多个
docker rmi -f 镜像名1:TAG 镜像名2:TAG
# 删除全部:支持参数续传docker images -qa返回所有的镜像ID
docker rmi -f $(docker images -qa)
面试题:谈谈docker虚悬镜像是什么?
答:仓库名、标签都是的镜像,俗称虚悬镜像“dangling image”
新建+启动容器😊
docker run [OPTIONS] IMAGE [COMMAND][ARG...]
# 比如以下的交互式方式启动ubuntu,后面的/bin/bash为交互命令的接口
docker run -it ubuntu /bin/bash
OPTIONS说明(常用):有些是一个减号,有些是两个减号,常用有以下几组
参数 | 说明 |
---|---|
–name | 为容器指定一个名称 |
-d | 后台运行容器并返回容器ID,也即守护式容器(后台启动) |
参数 | 说明 |
---|---|
-i | 以交互模式运行容器,通常与-t同时使用 |
-t | 为容在重新分配一个伪输入终端,通常与-i同时使用 |
参数 | 说明 |
---|---|
-P | 随机端口映射,大写P |
-p | 指定端口映射,小写p |
# 在大部分场景下,我们希望docker的服务是在后台运行的
# 我们可以通过-d指定容器的后台运行模式
# 很重要的一点说明:Docker容器后台运行,就必须有一个前台进程,容器运行的命令如果是不是哪些一致挂起的命令(比如运行top、tail),就会自动退出
docker run -d 容器名
# 更加推荐使用exec
docker exec -it 容器ID /bin/bash
docker attach 容器ID
上述两个的区别: docker ps [OPTIONS]
# 查看当前正在运行的容器+历史上运行过的容器
docker ps -a
# 显示最近创建创建的容器
docker ps -l
# 显示最近的n个容器
docker ps -n
# 静默模式
docker ps -q
# run进去容器,exit退出,容器停止
exit
# run进去容器,ctrl+p+q退出,容器不停止
ctrl+p+q
docker start 容器ID或者容器名
docker restart 容器ID或者容器名
docker stop 容器ID或者容器名
docker kill 容器ID或容器名
docker rm 容器ID
# 一次性删除多个容器案列
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
docker logs 容器ID
docker top 容器ID
docker inspect 容器ID
docker cp 容器ID:容器内路径 目的主机路径
# export导出容器的内容流作为一个tar归档文件[对应import命令]
docker export 容器ID > newName.tar
# import从tar包中内容创建一个新的文件系统再导入为镜像[对应export]
cat newName.tar | docker import - 镜像用户/镜像名:镜像版本号
镜像分层最大的一个好处就是共享资源,方便迁移,就是为了复用。比如说内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像每一层都可以被共享。
UnionFs(联合文件系统):Union文件系统(UnionFs)是一种分层、轻量级且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。union文件系统是Docker镜像的基础。镜像可以分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
Docker镜像层都是只读的,容器层是可写的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作"容器层",“容器层"之下的都叫"镜像层”。