先来聊聊什么是docker。
在没有接触docker之前,我去网上搜索“什么是docker”,有很多文章说docker是一种容器虚拟化技术,看到“虚拟化”几个字,我自然而然的就想到了虚拟机,于是我就想要通过虚拟机的概念,类比着去理解docker,我开始搜索,docker和虚拟机的区别,但是我发现,这样去理解似乎不太容易,主要有两个原因,第一个原因是我压根没有使用过docker,完全没有任何概念,第二个原因是docker与传统的虚拟化不同,有人说docker是容器虚拟化技术,有人说docker压根不能算作虚拟化的范畴,看到这些争论,我越来越搞不明白了,于是我放弃抵抗,开始直接使用docker,在实际的使用过程中,我才有了自己的理解,现在,我从一个使用者的角度,去描述一下docker是什么,它和虚拟机有什么不同,如果你看完我的描述,还是没有理解,最好和我一样,先用上再说。
咱们还是以传统意义上的“虚拟机”作为切入点,假设,有一台物理服务器,我们把这台服务器当做宿主机,在宿主机上虚出了虚机A、虚机B等虚拟机,对于这些虚拟机来说,它们各自都独占了一套完整的操作系统,准确的说,应该是一套完整的“操作系统发行版”,注意,这里强调一下“发行版”三个字,以linux系统为例,组成一个“linux系统发行版”,首先需要有“linux内核”,其次还需要有相关软件依赖的运行环境软件包,比如说一些类库包、命令行工具等等,不同的linux发行版基于相同的linux内核开发,但是由于组成运行环境的包的不同,所以产生了不同的发行版,比如ubuntu和centos就是不同的linux发行版,对于虚机A和虚机B来说,它们各自拥有一套完整的操作系统(即使A和B都安装了centos7.9,本质上也是两个相互独立的操作系统),从隔离层面上来说,A和B之间是“linux系统发行版”的完整隔离,A和B都各自使用自己的内核和运行环境依赖包,各自使用自己的虚拟硬件,这是虚拟机在操作系统层面的隔离,理解上述概念,是避免搞混docker和传统虚拟化的关键。
现在再来聊聊docker,我们知道docker是一种容器引擎,docker运行容器的本质目的是去运行某个程序,docker通过应用程序镜像,安装并运行对应的程序,比如,我需要运行nginx,只需要下载对应的nginx镜像,docker就可以把这个nginx镜像运行成一个容器,容器把内部的nginx服务端口暴露出来,我们就可以访问nginx服务了,其他服务软件同理,在没有使用docker之前,看到“镜像”这个词,我又情不自禁的想到了虚拟机,只不过,虚拟机是通过“操作系统镜像”安装运行系统,docker是通过“应用程序镜像”安装运行对应的软件,当我搜索docker和虚拟机有什么不同的时候,我看到了下面这张图

从上图来看,每个虚拟机都有自己的完整的操作系统(上图的GUEST OS就是虚拟机的操作系统,但是此处,我们应该把它拆成两部分理解,GUEST OS是由其内核和运行环境包组成的),VM1虚拟机上的所有APP使用的是同一套运行库和内核,其他虚拟机同理,Hypervisor层对硬件资源进行划分,各个虚拟机在整个操作系统发行版层面进行了隔离,而容器则不同,容器是将APP和其需要依赖的运行库打包成一个镜像,在APP进程和运行库层面进行了隔离(上图中CONTAINER中的APP就是应用程序镜像,这个镜像中包含应用本身和其需要的运行时依赖包),不同的APP各自使用自己的运行时环境,容器所运行的镜像中不需要内核,所有容器共用所在主机HostOS的内核,统一通过HostOS的内核与硬件进行交互,docker就是运行在HostOS中的容器引擎,理解了上图以后,我们就能明显感觉到它们的区别了,上图中最凸显的区别就是隔离层面的不同,虚拟机是针对整个系统发行版层面的隔离,而容器则是对程序进程和其依赖的运行环境的隔离,虚拟机的隔离性更强,隔离范围大,容器的隔离性没有虚拟机强,但是隔离范围更小,容器并不涉及Hypervisor层,它是一种进程隔离技术,从这个方面讲,它不应该算做“传统虚拟化”的范围,人们愿意把它称之为容器“虚拟化”技术,我觉得是因为容器更偏向于“java虚拟机”或者“python虚拟环境”这种软件意义上的“虚拟”,所以说,容器并不会取代虚拟机,它们之间也并不冲突,它们应该是相辅相成的。
把应用程序和其运行时依赖库打包隔离的好处有哪些呢?首先,由于隔离的范围更小了,所以当出现问题时,影响的范围也会更小,只会影响这个应用程序容器的进程本身,而不是其他程序的容器和HOST操作系统,其次,由于应用程序和其依赖的运行时环境是打包在一起的(打包成一个docker镜像),这就表示,如果一个程序的镜像在我的centos7上能够运行,那么在你的centos7上用也能够正常运行,不会出现某个程序在开发人员的笔记本中可以运行,但是放在服务器上就不能正常运行的情况(因为服务器上可能没有安装程序所依赖的包),这就是把程序和依赖打包在一起的好处。
当我们想要通过docker运行一个软件,首先要有对应软件的镜像,我们可以自己制作对应的镜像,也可以从镜像仓库中下载别人制作好的镜像,下载后直接运行,在刚开始学习docker时,最好使用别人创建的镜像,因为这样学习的难度会降低很多,docker官方提供了镜像仓库,供大家分享镜像,官方的镜像仓库叫做docker hub,我们可以从这里面下载别人的镜像,或者上传自己的镜像,docker hub的地址是 https://registry.hub.docker.com ,我们可以在仓库中搜索需要的镜像,下载到本地使用

docker还有很多概念,我们放在后面慢慢聊,现在我们来动动手,实际操作一下,先安装一下docker,我的实验环境是centos7.9,我们可以创建一个虚拟机,专门用来学习docker。
为了更加快速的安装较新的docker版本,此处配置阿里云的yum源,阿里云的docker-ce源配置操作地址如下,这个页面中记录了在ubuntu和centos下安装docker的方法:
https://developer.aliyun.com/mirror/docker-ce
下面的安装命令就是从上面的链接中粘贴过来的,安装过程如下
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加yum软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 替换yum源中的url,如果没有download.docker.com这个url,可省略此步骤
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新yum源并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务,设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
安装完成后,使用docker version命令,可以查看到对应的docker版本。
现在,我们就可以开始使用docker了,比如从官方的仓库拉取一个镜像,然后跑一个容器,但是由于网络原因,从国内去官方的镜像仓库下载镜像有时会遇到问题,所以最好配置一个加速服务地址,通过加速服务地址获取镜像,会比较快,这里使用阿里云的镜像加速地址,配置过程如下:
打开国内阿里云网页,登录自己阿里云的账号,点击“控制台”,在搜索栏中搜索“容器镜像服务”,如下图所示,点击搜索出的控制台入口:

进入对应控制台页面后,如下图所示,找到“镜像工具–镜像加速器”菜单栏,即可找到对应的加速服务地址,此页面中还给出了不同系统中,配置加速地址的方法,点击下图中的centos页签,按照提示的命令操作即可。

按照上图中的提示进行操作,配置加速地址过程如下:
#创建配置文件目录和配置文件
mkdir -p /etc/docker
touch /etc/docker/daemon.json
#编辑daemon.json配置文件,将如下内容写入配置文件,加速地址的ID替换成自己网页中的ID
{
"registry-mirrors": ["https://加速地址ID.mirror.aliyuncs.com"]
}
#配置文件设置完成后,重载配置
systemctl daemon-reload
systemctl restart docker
完成上述步骤后,就可以开始顺畅的使用docker了,还有很多关于docker的知识点需要总结,咱们后面慢慢聊。
先来聊聊什么是docker。
在没有接触docker之前,我去网上搜索“什么是docker”,有很多文章说docker是一种容器虚拟化技术,看到“虚拟化”几个字,我自然而然的就想到了虚拟机,于是我就想要通过虚拟机的概念,类比着去理解docker,我开始搜索,docker和虚拟机的区别,但是我发现,这样去理解似乎不太容易,主要有两个原因,第一个原因是我压根没有使用过docker,完全没有任何概念,第二个原因是docker与传统的虚拟化不同,有人说docker是容器虚拟化技术,有人说docker压根不能算作虚拟化的范畴,看到这些争论,我越来越搞不明白了,于是我放弃抵抗,开始直接使用docker,在实际的使用过程中,我才有了自己的理解,现在,我从一个使用者的角度,去描述一下docker是什么,它和虚拟机有什么不同,如果你看完我的描述,还是没有理解,最好和我一样,先用上再说。
咱们还是以传统意义上的“虚拟机”作为切入点,假设,有一台物理服务器,我们把这台服务器当做宿主机,在宿主机上虚出了虚机A、虚机B等虚拟机,对于这些虚拟机来说,它们各自都独占了一套完整的操作系统,准确的说,应该是一套完整的“操作系统发行版”,注意,这里强调一下“发行版”三个字,以linux系统为例,组成一个“linux系统发行版”,首先需要有“linux内核”,其次还需要有相关软件依赖的运行环境软件包,比如说一些类库包、命令行工具等等,不同的linux发行版基于相同的linux内核开发,但是由于组成运行环境的包的不同,所以产生了不同的发行版,比如ubuntu和centos就是不同的linux发行版,对于虚机A和虚机B来说,它们各自拥有一套完整的操作系统(即使A和B都安装了centos7.9,本质上也是两个相互独立的操作系统),从隔离层面上来说,A和B之间是“linux系统发行版”的完整隔离,A和B都各自使用自己的内核和运行环境依赖包,各自使用自己的虚拟硬件,这是虚拟机在操作系统层面的隔离,理解上述概念,是避免搞混docker和传统虚拟化的关键。
现在再来聊聊docker,我们知道docker是一种容器引擎,docker运行容器的本质目的是去运行某个程序,docker通过应用程序镜像,安装并运行对应的程序,比如,我需要运行nginx,只需要下载对应的nginx镜像,docker就可以把这个nginx镜像运行成一个容器,容器把内部的nginx服务端口暴露出来,我们就可以访问nginx服务了,其他服务软件同理,在没有使用docker之前,看到“镜像”这个词,我又情不自禁的想到了虚拟机,只不过,虚拟机是通过“操作系统镜像”安装运行系统,docker是通过“应用程序镜像”安装运行对应的软件,当我搜索docker和虚拟机有什么不同的时候,我看到了下面这张图

从上图来看,每个虚拟机都有自己的完整的操作系统(上图的GUEST OS就是虚拟机的操作系统,但是此处,我们应该把它拆成两部分理解,GUEST OS是由其内核和运行环境包组成的),VM1虚拟机上的所有APP使用的是同一套运行库和内核,其他虚拟机同理,Hypervisor层对硬件资源进行划分,各个虚拟机在整个操作系统发行版层面进行了隔离,而容器则不同,容器是将APP和其需要依赖的运行库打包成一个镜像,在APP进程和运行库层面进行了隔离(上图中CONTAINER中的APP就是应用程序镜像,这个镜像中包含应用本身和其需要的运行时依赖包),不同的APP各自使用自己的运行时环境,容器所运行的镜像中不需要内核,所有容器共用所在主机HostOS的内核,统一通过HostOS的内核与硬件进行交互,docker就是运行在HostOS中的容器引擎,理解了上图以后,我们就能明显感觉到它们的区别了,上图中最凸显的区别就是隔离层面的不同,虚拟机是针对整个系统发行版层面的隔离,而容器则是对程序进程和其依赖的运行环境的隔离,虚拟机的隔离性更强,隔离范围大,容器的隔离性没有虚拟机强,但是隔离范围更小,容器并不涉及Hypervisor层,它是一种进程隔离技术,从这个方面讲,它不应该算做“传统虚拟化”的范围,人们愿意把它称之为容器“虚拟化”技术,我觉得是因为容器更偏向于“java虚拟机”或者“python虚拟环境”这种软件意义上的“虚拟”,所以说,容器并不会取代虚拟机,它们之间也并不冲突,它们应该是相辅相成的。
把应用程序和其运行时依赖库打包隔离的好处有哪些呢?首先,由于隔离的范围更小了,所以当出现问题时,影响的范围也会更小,只会影响这个应用程序容器的进程本身,而不是其他程序的容器和HOST操作系统,其次,由于应用程序和其依赖的运行时环境是打包在一起的(打包成一个docker镜像),这就表示,如果一个程序的镜像在我的centos7上能够运行,那么在你的centos7上用也能够正常运行,不会出现某个程序在开发人员的笔记本中可以运行,但是放在服务器上就不能正常运行的情况(因为服务器上可能没有安装程序所依赖的包),这就是把程序和依赖打包在一起的好处。
当我们想要通过docker运行一个软件,首先要有对应软件的镜像,我们可以自己制作对应的镜像,也可以从镜像仓库中下载别人制作好的镜像,下载后直接运行,在刚开始学习docker时,最好使用别人创建的镜像,因为这样学习的难度会降低很多,docker官方提供了镜像仓库,供大家分享镜像,官方的镜像仓库叫做docker hub,我们可以从这里面下载别人的镜像,或者上传自己的镜像,docker hub的地址是 https://registry.hub.docker.com ,我们可以在仓库中搜索需要的镜像,下载到本地使用

docker还有很多概念,我们放在后面慢慢聊,现在我们来动动手,实际操作一下,先安装一下docker,我的实验环境是centos7.9,我们可以创建一个虚拟机,专门用来学习docker。
为了更加快速的安装较新的docker版本,此处配置阿里云的yum源,阿里云的docker-ce源配置操作地址如下,这个页面中记录了在ubuntu和centos下安装docker的方法:
https://developer.aliyun.com/mirror/docker-ce
下面的安装命令就是从上面的链接中粘贴过来的,安装过程如下
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加yum软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 替换yum源中的url,如果没有download.docker.com这个url,可省略此步骤
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新yum源并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务,设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
安装完成后,使用docker version命令,可以查看到对应的docker版本。
现在,我们就可以开始使用docker了,比如从官方的仓库拉取一个镜像,然后跑一个容器,但是由于网络原因,从国内去官方的镜像仓库下载镜像有时会遇到问题,所以最好配置一个加速服务地址,通过加速服务地址获取镜像,会比较快,这里使用阿里云的镜像加速地址,配置过程如下:
打开国内阿里云网页,登录自己阿里云的账号,点击“控制台”,在搜索栏中搜索“容器镜像服务”,如下图所示,点击搜索出的控制台入口:

进入对应控制台页面后,如下图所示,找到“镜像工具–镜像加速器”菜单栏,即可找到对应的加速服务地址,此页面中还给出了不同系统中,配置加速地址的方法,点击下图中的centos页签,按照提示的命令操作即可。

按照上图中的提示进行操作,配置加速地址过程如下:
#创建配置文件目录和配置文件
mkdir -p /etc/docker
touch /etc/docker/daemon.json
#编辑daemon.json配置文件,将如下内容写入配置文件,加速地址的ID替换成自己网页中的ID
{
"registry-mirrors": ["https://加速地址ID.mirror.aliyuncs.com"]
}
#配置文件设置完成后,重载配置
systemctl daemon-reload
systemctl restart docker
完成上述步骤后,就可以开始顺畅的使用docker了,还有很多关于docker的知识点需要总结,咱们后面慢慢聊。