0x00 前提条件
Docker并非是一个通用的容器工具,它依赖于已经存在运行的Linux内核环境。
Docker实质上是在已经运行的Linux下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的Linux主机。
因此Docker必须部署在Linux内核的系统上。如果其他系统想要部署Docker就必须安装一个虚拟Linux环境。
在Windows上部署Docker的方法都是先安装一个虚拟机,并在安装Linux系统的虚拟机中运行Docker。
要求Linux系统为64位、内核版本3.8以上。
查看内核命令
uname -a/-r
cat /etc/redhat-release (centos)
0x01 Docker基本组成
镜像——Java的类模版
容器——Java new出来的实例对象,实例的源头就是镜像
仓库——存放镜像的地方
Book b1 = new book() //这里的Book就相当于镜像,也就是类模版
Book b2 = new book()
Book b3 = new book() //b1,b2,b3就是对应的容器实例对象
Redis r1 = docker run 镜像,类似鲸鱼背上的集装箱,就是一个容器实例
Redis r2 = docker run 镜像,类似鲸鱼背上的集装箱,就是一个容器实例
Redis r3 = docker run 镜像,类似鲸鱼背上的集装箱,就是一个容器实例
Redis r4 = docker run 镜像,类似鲸鱼背上的集装箱,就是一个容器实例
镜像(image)
Docker镜像就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建很多容器。它也相当于是一个root文件系统。比如官方镜像centos7就包含了完整的一套centos7最小系统的root文件系统。相当于容器的”源代码“,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。
容器(container)
从面向对象角度
Docker利用容器(Container)独立运行的一个或一组应用,应用程序或者服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
从镜像容器角度
可以把容器看作是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。镜像就是定义动作的,实例就是干活的。如下图,当我们docker run redis
时,其实就是相当于在容器里面以最小资源启动了一台Linux虚拟机,在这台虚拟机上在运行redis
仓库(respository)
仓库是集中存放镜像文件的场所。
类似于
Maven
仓库,存放各种jar包的地方;
github
仓库,存放各种git项目的地方;
Docker
公司提供的官方registry
被称为Docker Hub
,存放各种镜像模板的地方.
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。全球最大的公开仓库是Docker Hub
。存放了数量庞大的镜像提供用户下载,国内的工开仓库包括阿里云、网易云等。
这里注意:国内我们默认选择阿里云作为公开仓库。也可以自己搭建个私有库。
总结
需要正确的理解仓库/镜像/容器这几个概念:
Docker本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)
Image文件可以看作是容器的模板。Docker根据image文件生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例。
镜像文件
- image文件生成的容器实例,本身也是一个文件,称为镜像文件
容器实例
- 一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
仓库
- 就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可以了。
0x02 docker平台架构
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。容器就是一个运行时环境,集装箱。
以mysql为例子来讲
1、当我们装好mysql,后台就会有一个进程,守护进程来保持mysql的运行。
2、我们想要连接mysql,就会用客户端的一些工具,例如SQLyog Ultimate
小海豚,或者Navicat
等等来连接上数据库。那么就实现了N多个客户端链接mysql后台守护进程来进行mysql的增删改查。
3、那么docker和mysql其实是一样的,只不过docker是通过镜像制作出了一个个实例,而mysql是按照sql脚本生成的sql语句。我在这里跑的sql脚本,换到别的机子上,也能跑。
0x03 docker平台架构进阶理解
这一部分先有个轮廓,有个底子就好,之后还会反复讲解。
Docker是一个C/S模式的架构,后端是一个松散耦合架构,众多模块各司其职。
Docker运行的基本流程为:
1、用户是使用Docker Client与Docker Daemon建立通信,并发送请求给后者。
2、Docker Daemon作为Docker架构中的主体部分,首先提供Docker Server的功能使其可以接受Docker Client的请求。
3、Docker Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。
4、Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动 Graph driver将下载镜像以Graph的形式存储。
5、当需要为Docker创建网络环境时,通过网络管理驱动Network driver创建并配置Docker容器网络环境。
6、当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Exec driver来完成
7、Libcontainer是一项独立的容器管理包,Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作。
0x04 Centos7-Docker具体安装步骤
官网寻找开发者手册
1、确定自己是符合标准的操作系统OS requirements
Linux系统为64位、内核版本3.8以上
uname -a/-r
cat /etc/redhat-release (centos)
2、卸载旧版本Uninstall old versions
Older versions of Docker were called docker
or docker-engine
. If these are installed, uninstall them, along with associated dependencies.
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
3、yum安装gcc相关依赖文件
Centos7 能出网
yum -y install gcc
yum -y install gcc-c++
4、安装需要的软件包
三种方法供你选择(You can install Docker Engine in different ways, depending on your needs),我这里就选择使用yum,也就是最多人的
yum -y install yum-utils
5、安装稳定库stable repositry
这里算是一个坑吧,国外的库很不稳定
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
可以换成国内的阿里云的
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
########分三行或者一行都可以
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
6、重置yum索引
yum makecache fast
元数据缓存已建立,下次再安装就快一些了
7、开始安装docker engine
默认最新版docker engine,一路全选yes就行了
sudo yum install docker-ce docker-ce-cli containerd.io
8、启动docker服务
systemctl start docker
9、测试docker
查看版本信息docker version
输出helloworld
第一次输入下面这个命令时,会告诉你本地找不到hello-world这个镜像,回到之前我们学的原理
docker run就是从本地镜像实例化一个容器,但是这个镜像本地不存在,所以我们需要从库中拉取一个镜像才行。
所以这里自动从库中拉取了一个hello-world
库
docker run hello-world
10、卸载docker
systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
0x05 镜像加速器
国际上,亚马逊云是首屈一指的,云原生项目。阿里巴巴其实也努力想在中国落地生根关于云原生的项目。
想要所有的淘宝、支付宝账户,都注册一个阿里云账号。能力很强,野心很大,也许未来某一天,我们直接就可以在阿里云上操作虚拟机,根本不需要自己安装。
当然,得看公司给不给你钱安排了。
当我们配置了镜像加速器后,从仓库拉取镜像的速度会快很多,方便我们的操作,让我们的操作纵享丝滑!
1、注册阿里云账号(可用钉钉、支付宝、淘宝账号注册)
2、点击控制台
3、选择容器镜像服务
地点改一下, 然后选择个人版实例。请勿在生产环境中使用。个人肯定会比企业版的要垃圾地多,没交钱嘛
然后设置个密码,就行了
4、获取镜像加速器地址
5、下方内容依次操作即可
第一步直接创建文件
mkdir -p /etc/docker
第二步粘贴即可
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://1232312d.mirror.aliyuncs.com"] //举例
}
EOF
第三部重新启动
systemctl daemon-reload
systemctl restart docker
docker run hello-world
0x06 hello-world分析介绍要素配合
看到这里其实大有困惑,一个hello-world有什么好说的??千万别着急,一步一个脚印,扎扎实实地学好前面的理论课程!
理论实操小总结,学习三板斧。
docker run,run干了什么?
其实也就是这张图
0x07 底层原理——为什么Docker比VM虚拟机快??
1、docker有着比虚拟机更少的抽象层
由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
说白了,我出门只需要自行车,你给我一辆火车,那肯定慢了。
2、docker利用的是宿主机的内核,而不需要加载操作系统OS内核
当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程时分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。