使用docker的好处:可以快速搭建各种复杂的应用环境,而不用我们自己去慢慢配置调试,专注于技术的研究。
虚拟化技术
虚拟化技术一般分为:
- 硬件虚拟化:是运行在硬件之上的虚拟化技术,可以模拟硬件资源如:CPU、内存、显卡等资源,代表如VMWare、Xen、VirtualBox、AWS EC2、微软的Hyper-V等
- 操作系统虚拟化:是运行在操作系统之上的,它模拟的是操作系统上的多个不同进程,并将其封装在一个容器里面,也称为容器化技术,而dockers正是容器虚拟化中目前最流行的实现方式。
docker架构简介
docker并没有传统虚拟化中的Hypervisor层(Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件),也就是说dockers没有模拟硬件设备资源,其虚拟化技术是基于内核的Cgroup和Namespace技术
- Cgroup技术: 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。
- Namespace技术:是Linux内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。
在通信上,docker并不会直接与内核进行交互,而是通过一个更底层的工具Libcontainer与内核交互。
- Libcontainer:是Docker中用于容器管理的包,它基于Go语言实现,通过管理namespaces、cgroups、capabilities以及文件系统来进行容器控制。你可以使用Libcontainer创建容器,并对容器进行生命周期管理
dockers另一个优势是对层级镜像的创新应用,即不同的容器可以共享底层的只读镜像,通过写入自己特有的内容后添加新的镜像层,新增的镜像层和下层的镜像一起又可以作为基础镜像被上层的镜像使用,这种特性可以极大的提高磁盘利用率,所以通常使用dcoker的容器大小只有几十M或几百M大小。还有就是不同的容器访问同一文件时,只会占用一份内存,减少内存占用方面。
容器
容器和镜像是docker最核心的部分,容器其实就是运行在操作系统上的一个进程,只不过对此进程加入了资源隔离和限制。
镜像
镜像就是容器中的文件系统,容器的创建是通过镜像来生成的,可以比作编程语言的面向对象,镜像就是类,容器就是类的实例化,镜像是只读的,容器是实际运行的,相对于传统的ISO系统镜像,docker的镜像要轻量化很多,实际上就是一个rootfs文件。
仓库
docker仓库就是存放镜像的仓库,通常部署在互联网或云端,docker镜像可以自己创建,也可以从网上仓库下载,docker官方的仓库叫做dockers Hub。
docker容器与虚拟机的区别
虚拟机利用了硬件虚拟化技术,运行时会通过一个hypervisor层来实现对资源的彻底隔离,而容器则是操作系统级别的虚拟化,利用的是内核的Cgroup和Namespace技术,这里仅仅是进程本身的隔离。docker容器与主机共享操作系统的内核,不同的容器可以共享部分系统资源。而虚拟机会独占分配给自己的资源,几乎不存在资源共享,各个虚拟机之间几乎完全隔离,属于重量级虚拟化,但也会占用更多资源。
docker安装
因为docker是基于Linux内核进行虚拟化,所以只能运行在Linux操作系统上,不建议在windwos上安装docker,那么它也会采用虚拟机方式进行。可以使用win10子系统安装docker或者使用VM虚拟机进行安装。这里我采用的是VM虚拟机安装centos7系统进行安装docker(因为vm虚拟机有快照功能,可以随时进行恢复)。
centos7下安装
#安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#设置yum源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#安装docker
sudo yum install docker-ce
#启动docker
sudo systemctl start docker
docker镜像加速
#这里我采用的是阿里docker镜像加速服务
mkdir -p /etc/docker
vi /etc/docker/daemon.json
"registry-mirrors": ["https://7wvdju3m.mirror.aliyuncs.com"]
sudo systemctl daemon-reload
sudo systemctl restart docker