文章目录
Docker出现的背景
出现问题
- 您要如何确保应用能够在这些环境中运行和通过质量检测?
- 并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复?
解决问题
- 答案就是使用容器。Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案-----系统平滑移植,容器虚拟化技术。
- Docker的出现使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
docker理念
-
Docker是基于Go语言实现的云开源项目,“Build,Ship and Run Any App,Anywhere” ==》一次镜像,处处运行
-
将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。
解决了运行环境和配置问题的软件容器, 方便做持续集成并有助于整体发布的容器虚拟化技术。
容器与虚拟机比较
-
容器发展简史
-
传统虚拟机技术
传统虚拟机技术基于安装在主操作系统上的虚拟机管理系统 (如: VirtualBox和VMWare等),创建虚拟机 (虚拟出各种硬件),在虚拟机上安装从操作系统,在从操作系统中安装部署各种应用。
虚拟机的缺点:
- 资源占用多
- 冗余步骤多
- 启动慢
-
容器虚拟化技术
Linux容器(Linux Containers,缩写为 LXC)
- Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
- Linux 容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
Docker 容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,Docker 优势体现为启动速度快、占用体积小。
Docker 和传统虚拟化方式的不同之处
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
- 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
- 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
Docker安装
-
官方网站
- docker官网:http://www.docker.com
- docker仓库:https://hub.docker.com/
-
安装前提
目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在CentOS 7 (64-bit)上,
- 要求系统为64位、Linux系统内核版本为 3.8以上,这里选用Centos7.x
查看自己的内核
cat /etc/redhat-release
、uname -r
-
Docker的基本组成
镜像 =》 类;容器 =》 实例对象;仓库 =》 存放镜像的地方
-
镜像
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
- 它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。
- 相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。
-
容器
从面向对象角度
- Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。
- 容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
从镜像容器角度
- 可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
-
仓库
仓库(Repository)是集中存放镜像文件的场所。
- 国内的公开仓库包括阿里云 、网易云等。
-
Docker平台架构图解
Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职。
- 用户是使用 Docker Client与 Docker Daemon 建立通信,并发送请求给后者。
- Docker Daemon 作为 Docker架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Cient的请求
- DockerEngine执行 Docker内部的一系列工作,每一项工作都是以一个 Job 的形式的存在。
- Job 的运行过程中,当需要容器镜像时,则从 Docker Registy 中下载镜像,并通过镜像管理驱动 Graph diver将下载镜像以Graph的开式存储、
- 当需要为 Docker创建网络环境时,通过网络管理驱动 Network driver创建并配置 Docker容器网络环境。
- 当需要限制 Docker容器运行资源或执行用户指令等操作时,则通过 Exec driver 来完成。
- Libcontainer是一项独立的容器管理包,Network driver以及Exec diver都是通过Libcontainer来实现具体对容器进行的操作。
CentOS7安装Docker
-
确定你是CentOS7及以上版本
-
卸载旧版本
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
yum安装gcc相关
yum -y install gcc
yum -y install gcc-c++
-
安装需要的软件包
-
sudo yum install -y yum-utils
-
-
设置镜像仓库
国外库: sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
设置国内阿里云库: sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
更新yum软件包索引
-
yum makecache fast
-
-
安装DOCKER CE
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
-
启动docker
systemctl start docker && systemctl enable docker
-
测试
docker version
docker run hello-world
-
安装docker-compose
-
卸载
systemctl stop docker
sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
阿里云镜像加速
阿里云官方网址:https://promotion.aliyun.com/ntms/act/kubernetes.html
-
获得加速器地址连接
-
把加速器地址配置在docker上
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://{自己的加速器地址}.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
docker run 作用流程
为什么Docker会比VM虚拟机快
-
docker有着比虚拟机更少的抽象层
由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
-
docker利用的是宿主机的内核,而不需要加载操作系统OS内核
当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。