❤️ 专栏简介 :本专栏我们会从最基础的内容开始学习Docker的相关内容,循序渐进的掌握Docker知识并进行实战。
☀️ 专栏适用人群 :适用于具备基础 Linux 知识的 Docker 初学者,当然希望各位有经验的docker开发者不吝赐教。
专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
专栏地址:https://blog.csdn.net/anchenliang_1002/category_11878561.html
这一节我们要学习的内容主要有两个:
1、docker的生命周期;
2、利用docker实现在CentOS上再运行三种不同的操作系统;即基于一个linux宿主机本体,运行出不同的操作系统(如centos、ubuntu、suse等);
什么是生命周期?所谓生命周期,就是从诞生,到使用,到销毁的一整个完整的过程。我们来看一下docker使用过程中的生命周期,我们只要把下面这张docker的生命周期图整明白了,那么docker我们也就明白的差不多了;docker整个的生命周期图如下:
下面详细解释一下各个过程:
1 Dockerfile:一个用于构建docker image的脚本(这个我们暂时还不会用到);Dockerfile其实就是一个脚本文件,作用是自定义一个docker镜像。回想一下上一节讲的nginx镜像,我们是从仓库里面pull拉取下来的,也就是说nginx镜像是官方提供好的,我们可以直接拿来用的;但是如果我们想在本地自定义的构建一个镜像呢?就得需要使用Dockerfile自己去写了。
2 通过build命令(docker build
)可以构建dockerfile生成镜像image;我们生成的的镜像文件被images所管理;
3 在images中,我们可以通过docker images
命令来查看有哪些镜像文件。images是存储在机器本地的;但是在本地存着就没办法跟别人交互。
4 如果想让本地的镜像文件和别人进行交互,就得通过网络并利用docker push
命令传输到镜像仓库(Docker registry)中;镜像仓库类型有公开仓库(docker hub)和私有仓库(自行搭建);
5 我们还可以从镜像仓库中获取我们想要的镜像,即docker pull
;例如我们前面上一节讲到的从镜像仓库中获取nginx镜像:docker pull nginx
就是一个例子。
6 除了利用push和pull实现在网络中管理镜像,我们还可以利用save
和load
实现在本地管理镜像;docker save
可以用于导出镜像为一个压缩文件;docker load
可以用于导入镜像;这两个操作的作用主要是用于我们在公司工作过程中,和同事之间传递、分享镜像文件;
7 利用run命令(docker run
),我们可以将镜像运行出一个具体的容器(containers),这个过程我们在上一节也利用nginx演示过了;
8 在容器(containers)内部,我们可以利用stop、start、restart等命令对容器进行操作了;docker stop +容器id/名字
:停止容器;docker start +容器id/名字
:启动容器;docker restart +容器id/名字
:重启容器。
9 最后,commit的作用:当我们再容器中,进行新增或者修改等操作,定制安装了一些软件,并想要提交该容器生成一个镜像时,就要用到commit了(命令为docker commit +容器id
);举个例子:我们获取了一个centos镜像,且是最小化安装的,连vim都没有,我们先(docker run centos)运行这个容器,运行这个容器时,我们是可以进入到容器内的,假设我们在容器内安装了一个vim,此时我们利用docker commit 容器id
提交该容器,提交后生成的镜像就是携带了vim 的centos系统了;以后我们再次docker run此镜像生成的容器,就是携带vim的容器了。
本节中我们要在一个宿主机(cenos)上,再运行centos、ubuntu、suse三种不同的操作系统;
我们先使用拉取redis(一个高性能的key-value数据库)镜像的例子来引入镜像原理这部分内容:
拉取redis镜像过程如下:
root@localhost acl]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
a2abf6c4d29d: Already exists
c7a4e4382001: Pull complete
4044b9ba67c9: Pull complete
c8388a79482f: Pull complete
413c8bb60be2: Pull complete
1abfd3011519: Pull complete
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
我们在获取redis镜像的时候,发现是在下载了多行信息(红框中),最终又得到了一个完整的镜像文件(绿框中);下面我们来看一看docker的镜像原理。
在学习docker镜像之前,我们先来看一下操作系统长什么样子。不知道你有没有思考过,我们一直使用的linxu系统,都包括了哪些内容?
如下图所示:
linux内核只有一个正统来源,那就是linus的开发团队。内核只是提供操作系统的基本功能和特性,如内存管理,进程调度,文件管理等等。linux内核加上不同的发行版就组成了完整的操作系统
,比如linux内核+centos发行版就组成了完成的centos操作系统,里面有yum软件包管理;linux内核+Ubuntu发行版就组成了完成的Ubuntu操作系统,里面有apt软件包管理;linux内核+suse发行版就组成了完成的suse操作系统,里面有yast2软件包管理。
所以我们一直以来使用的CentOS 7系统,不论是纯系统,还是虚拟机vmware上安装的centos系统,都是一个完整的系统文件,包括两部分:
因此,linux内核+centos发行版
,就组成了一个系统,提供给我们用户使用;同样的,如果是Ubuntu系统,它的组成也是有两部分,即linux内核+Ubuntu发行版。
我们在centos上查看组成我们系统的两大部分:
[root@localhost acl]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@localhost acl]#
[root@localhost acl]#
[root@localhost acl]# uname -r
3.10.0-1160.el7.x86_64
可以看到,我的centos系统,内核版本是3.10.0-1160.el7.x86_64
,linux发行版是CentOS Linux release 7.9.2009 (Core)
。
那现在有个问题来了,有没有一个办法,可以灵活的替换发行版,让我们使用不同的【系统】?
有,docker就实现了这个功能,技术手段就是docker images
。
总体的实现就是:内核都公用宿主机的内核;但是上层的发行版,可以自由替换;
具体实现过程如下图:
在我们centos7系统里,安装不同的docker容器,每个容器里运行着对应的linux发行版,他们共用宿主机的内核;比如,如果我们相用centos系统,那么我们就安装centos7发行版的容器,此时linux内核+centos7容器,就有了centos7系统;然后我们再安装一个Ubuntu容器,此时linux内核+Ubuntu容器,就有了Ubuntu系统;最后我们再安装一个suse容器,此时linux内核+suse容器,就有了suse系统;此时,我们的centos宿主机上就通过三个不同发行版的容器,有了三个不同的系统。
下面我们来实践一下,利用docker,来切换不同的发行版,内核使用的都是宿主机的内核:
#利用docker获取不同的发行版镜像
#拉取centos 7.8.2003版本
docker pull centos:7.8.2003
#拉取Ubuntu镜像
docker pull ubuntu
此时我们获取了7.8.2003版本的centos镜像和Ubuntu镜像,下面我们使用docker images
看一下,并确认一下当前的宿主机发行版:
可以看到,我们当前有Ubuntu容器镜像和7.8.2003版本的centos镜像,并且当前宿主机的发行版是7.9.2009。
然后运行7.8.2003 centos镜像和Ubuntu镜像:
首先运行7.8.2003 centos的镜像:
#运行afb6fca791e0容器,且进入容器内
#afb6fca791e0是7.8.2003centos的镜像id
docker run -it afb6fca791e0 bash
#参数解释:-i 交互式命令操作, -t开启一个终端 bash 进入容器后执行的命令
运行结果如下:
可以看到,指令运行成功后,我们的用户名由原来的localhost acl
变成了15a8949effe6
,这就表明我们由原来的宿主机环境,进入到了7.8.2003 版本的centos容器环境内;
那我说是进入了7.8.2003 版本的centos容器环境内就是进入7.8.2003 版本的centos容器环境内了嘛?怎么证明呢?
我们再查看一下当前发行版本:
发现当前的centos发行版本确实是7.8.2003,说明我们确实进入了7.8.2003版本的centos容器内部了;因为我们的宿主机是7.9.2009版本的centos。
此时我们实现了在宿主机上centos起了一个其他发行版的centos,且共用宿主机的内核,即使用宿主机的内核+容器内的centos发行版;如下图所示:
那如果我们不想用centos,想在宿主机上跑一个Ubuntu呢?
首先exit
退出之前的centos容器镜像:
可以发现exit
后,我们又回到了我们的宿主机环境localhost acl
;
此时我们可以着手部署使用Ubuntu系统了,跟上面进入centos容器环境一样的步骤:
#运行Ubuntu容器,且进入容器内
docker run -it ubuntu bash
#参数解释:-i 交互式命令操作, -t开启一个终端 bash 进入容器后执行的命令
结果如下:
发现已经进入ubuntu的环境内了,即实现了在centos宿主机上跑了一个ubuntu系统的容器,此ubuntu同样共用宿主机的内核,即使用宿主机的内核+容器内的ubuntu发行版,如下图:
此时我们再看一下容器内ubuntu发行版的信息:
发现我们成功实现了在centos宿主机系统中,又跑了一个ubuntu的系统。
如果想退出ubuntu镜像,同样使用exit
命令:
可以发现exit
后,我们又回到了我们的宿主机环境localhost acl
;
下面我们再在centos上跑一个suse系统,过程跟前面也差不多:
先查看一下有没有suse官方的镜像:
docker search suse
发现并没有suse官方镜像;
那我们再查看一下有没有开源suse官方的镜像:
docker search opensuse
那我们就下载一个开源suse镜像:
docker pull opensuse
此时再查看一下当前系统中的docker镜像都有哪些:
docker images
发现已经有opensuse的镜像了,接下来运行它生成suse容器:
docker run -it opensuse bash
可以看到已经进入suse容器内部了;
然后查看一下suse的发型版本:
cat /etc/SuSE-release
可以看到,我们已经实现了在centos宿主机上,又运行了一个suse系统;此suse同样共用宿主机的内核,即使用宿主机的内核+容器内的suse发行版,如下图:
发现我们成功实现了在centos宿主机系统中,又跑了一个ubuntu的系统。
如果想退出suse镜像,同样使用exit命令:
可以发现exit
后,我们又回到了我们的宿主机环境localhost acl
;
1、一个完整的系统,是由linux的内核+发行版,才组成了一个可以使用的完整的系统;
2、利用docker容器,可以获取不同的发行版镜像,然后基于该镜像,运行出各种容器去使用。