一、初识Docker

目录

​什么是Docker​

Docker和虚拟机的区别

镜像和容器​编辑

Docker架构

安装Docker 

1.CentOS安装Docker

1.1.卸载(可选)

1.2.安装docker

1.3.启动docker

1.4.配置镜像加速


初识Docker

 什么是Docker

我们需要先看一下项目部署和碰到的问题,各种各样的微服务,而且这些微服务还会依赖于各种各样的应用,比如说前端部分肯定依赖node.js吧,而我们的服务端呢还需要数据库MYSQL。缓存系统redis,还有我们后面会学习的异步通信mq等等这些技术,而且还会有更多更多,这只是其中的一部分,所有的这些应用将来都需要部署我们的服务器上。而大多数的服务器都会采用Linux 操作系统真的,操作系统安装linux之前呀要做一些准备工作,因为这些应用都会有自己所需要的一些依赖和函数库。每一个不同的应用,他们所需要的依赖和函数库可能有差异,有可能一样,但是版本不同啊,这个时候如此复杂的一个依赖关系,很容易,就产生兼容性,而且你费了老半天劲儿,终于把这些问题全部解决了。你会发现这只是一个开始,你搞定了开发环境,还有测试环境,生产环境,运发的环境等等。最可怕的是这些环境,他们的Linux操作系统还有可能不同。你比如说我这里装了一个centos系统,然后还有一个环境里装的是Ubuntu系统,那怎么办呀?你在这个环境下配好了各种东西,你换到另外一个操作系统里,它还能正常运行吗?那肯定是不行

这就是我们在开发和部署时碰到了各种各样的问题,因此在以前开发部署的效率非常的低,这个问题就是如何解决的呢?我们来看一下docker如何解决的呢,既然我刚才说了每一个应用都有自己所需要的依赖函数库

每个应用都有自己所需要的依赖和函数库,那为什么我们不把这些依赖和函数库一起打包了?docker就干了这件事情,你node.js需要什么依赖,我给你打包起来形成一个整体,然后我还给你放到一个隔离的容器里去运行。每个应用我都这么去做,你需要什么依赖啊?

你MySQL需要什么依赖,我打包起来,打成一个包,将来需要部署我连着包一起扔过去,你还考虑依赖的问题吗?

不用考虑了吧,那有同学会说了,那你把他们扔到一台机器上,他们之间的依赖难道没有干扰吗?不会,我们的docker会把这些打包好的程序。用一个隔离的容器去运行,会用到一种沙箱的技术,他们相互之间不可见,这个问题就解决了吗?当然这只是解决了我刚才讲的混乱依赖的问题。我们有了docker依然是不用去管了,应用程序随时都可以运行,但是仅限于同一个操作系统。因为你在打包这个应用时,你肯定会基于某种操作系统去打包吧,如果你是Ubuntu版本的,那么它的依赖函数库肯定也是Ubuntu版本的吧,那你把这个打包好的程序扔到linux上,你觉得它可以运行吗,那又怎么来解决这个问题呢?要想了解docker如何跨系统运行,我们得先知道操作系统的结构

讲讲操作的结构啊,我们以Unbutu为例,给大家讲一讲结构啊,没你想那么复杂,同学们别着急啊,其实所有的Linux内核的操作系统它都可以分成两层,一层的是大家共享的内核,不管是ubuntu还是centos还是其他的,内核都是Linux。而区别是什么?上层的系统应用不同,ubuntu和他们的应用是不一样的内核。那内核干什么事呢?内核负责与计算机硬件性保护,比方说我去调一下CPU啊,调一下内存啊,图像文件啊,或者一个进程之类的,这些都是内核要做的事情,而内核会把这些事情变成一个一个的指令,你调用这些指令就可以操作计算机硬件了,但可惜的是这些个指令大都比较简陋。如果你要基于这些指令去开发应用啊,可就太麻烦了,所以说呀,我们就有了系统应用。系统应用,比如说Ubuntu干了什么事,他会将内核的指令进行一个组装,再封装形成函数。许许多多的函数也是函数库,那么程序员可以基于这些函数开发,程序调用我们的函数库。函数库调用内核指令,指令指令去调用的计算机硬件,从而实现我们这个应用的执行,这就是我们的Linux系统的结构,以及应用的原理了。

 

 

那么问题来了,一个ubuntu系统上的应用为什么不能在分组上运行呢?我们来看一下啊,比方说我现在有一个centos的系统,有一个ubuntu系统,他俩的内核是完全一样的,那系统应用不同,也就是说函数库不同。可能ubuntu上有的库centos上不一定有,或者名字可能不一样,这个时候我们把一个ubuntu的应用给它迁移到了centos上,尝试去执行。你会发现当他去调用一个函数库,因为它代码写死了,就调用一个函数库,而发现这个函数库在centos上根本不存在,肯定会程序预报错呀,这就是为什么我们的应用不能跨系统运行的原因。那针对这样的一个问题,我们docker干了什么事儿呢?

既然每个应用都依赖于系统函数库,我为什么不把它的系统函数库跟他一起打包呢?这样不就不愁找不到函数库了吗?所以docke解决方案,就是将用户程序与系统调用的这个函数库一起打包,也就是说比如说我来打包一个这个MySQL,那你MySQL需要自己的一些依赖,那同时你还需要一些系统函数库,比如需要Ubuntu的函数库,那我就把Ubuntu的函数库,然后你自己的依赖等等全打包成一个整体。那么我们的这个YSQL应用,Node.js应用你随便放到任何的Linux操作系统上,只要你内核是linux内核。我在执行的时候,我调用我打包好的这个函数库,而这个数库直接调用操作系统的内核。而内核直接访问硬件,这个调用时就完成了,它还需要去管系统应用是什么吗?不需要,因为它自己就有。通过这样一种方式我们的docker就解决了跨系统的问题了,你可以认为docker打包好的程序包可以运行在任何一个Linux内核的内核上。

总结一下,docker如何解决我们之前所说的两个问题?第一,不同组件依赖的将性问题。这个问题太好办了,因为docker可以把应用极其依赖,函数库,配置,全打包形成一个可移植的镜像,然后你拿这玩意儿随便放到哪里去,他都是有自己的一套东西的,你还需要管依赖吗?不用了,并且为了防止不同依赖之间干扰,把它做了一个隔离沙箱机制,那大家互相看不到还有什么干扰呢?那docker怎么解决开发自身生产环境有差异的问题呢?操作系统都不一样,你怎么办?这个也很好办,因为docker在打包的过程中他是包含了完整运行环境的,不仅仅是应用和依赖,还包含了他所需要的系统函数库,甚至还有它的配置等等,因此呢,它需要依赖于系统的Linux内核,而不是上层的这个不同的应用。因此,那就可以在任意的liunx操作系统上运行。

Docker和虚拟机的区别

 

 

 镜像和容器

一切应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。

镜像,就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。

容器呢,就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。

例如你下载了一个QQ,如果我们将QQ在磁盘上的运行文件及其运行的操作系统依赖打包,形成QQ镜像。然后你可以启动多次,双开、甚至三开QQ,跟多个妹子聊天。

开源应用程序非常多,打包这些应用往往是重复的劳动。为了避免这些重复劳动,人们就会将自己打包的应用镜像,例如Redis、MySQL镜像放到网络上,共享使用,就像GitHub的代码共享一样。

国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务阿里云镜像库等。

我们一方面可以将自己的镜像共享到DockerHub,另一方面也可以从DockerHub拉取镜像:

Docker架构

我们该怎么样利用docker完成镜像构建或者是从远端拉取镜像呢?又该怎么样去运行容器呢?这就需要了解docker的架构了,Docker是一个CS架构的程序,它由两部分组成,一就是server,也就是在server端负责接收用户指令,完成镜像和容器的各种各样的操作,不管是构建镜像还是从远端拉取镜像,还是将来我们去运行容器都是由server来完成的。那谁给server下指令呢?自然就是我们的Client端,它可以向docker下达命令或者是发送Rest API的请求,当然这是看你在哪发,如果你就在docker所在的机器上本地来发,那你就用命令就可以了,如果你将来是远程操作docker,你就用Rest API去发就行了。

比方说我们就是本地的命令就行了,我想构建一个镜像,我可以用一个docker build的命令,这个命令到达DockerServer以后啊,会给docker的守护进程docker deamon去接收和处理,那么会利用你提供的这些个数据给他构建成一个镜像。那除了这种方式获取镜像以外,我们还可以去Register拉取镜像,因为我们里面会有docker官方提供的各种优质影响,那这个时候我们想拉取的时候,可以通过一个docker pull的命令,docker pull也会把请求发送到docker server端,而我们的docker守护进程就会去Register拉取你指定的这个镜像了。

那下边是不是就开始运行镜像创建容器了呀?那这个时候就要用到一个命令docker run,那么它会告诉我们server要去创建容器,而我们守护技能就会帮助你完成容积的创建,然后你的部署就完成了。

虽然我们可以自己创建镜像,也可以从远程拉取,但一般情况下像这种redis,nginx,mysql等等这样的一些应用,我们建议大家直接使用官方进行就可以了,没有必要自己构建.只有一些我们自己的微服务,或者你自己需要去做一个深度定制,你才需要构建,因此,我们一般使用docker,主要就是向Docke sserver发命令,想办法得到镜像,不管是哪种方式,然后再把镜像创建成容器运行,完成部署。这就是docker的一个整体架构了。

安装Docker 

Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。

Docker CE 分为 stable testnightly 三个更新频道。

官方网站上有各种环境下的 安装指南,这里主要介绍 Docker CE 在 CentOS上的安装。

1.CentOS安装Docker

Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在CentOS 7安装Docker。

1.1.卸载(可选)

如果之前安装过旧版本的Docker,可以使用下面命令卸载:

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine \
                  docker-ce

\ 是命令的拼接,命令太长了,一行写不下,就可以用   \

1.2.安装docker

首先需要大家虚拟机联网,安装yum工具

yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2 --skip-broken

然后更新本地镜像源:默认去国外网站,现在我们配置阿里云的仓库

# 设置docker镜像源
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
​
yum makecache fast

然后输入命令:

yum install -y docker-ce

docker-ce为社区免费版本。稍等片刻,docker即可安装成功。

1.3.启动docker

Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!

启动docker前,一定要关闭防火墙后!!

启动docker前,一定要关闭防火墙后!!

启动docker前,一定要关闭防火墙后!!

# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld

通过命令启动docker:

systemctl start docker  # 启动docker服务
​
systemctl stop docker  # 停止docker服务
​
systemctl restart docker  # 重启docker服务

然后输入命令,可以查看docker版本:

docker -v

如图:

如果能够安装和启动,说明你的docker也是没有问题的

1.4.配置镜像加速

docker官方镜像仓库网速较差,我们需要设置国内镜像服务:

参考阿里云的镜像加速文档:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

 

猜你喜欢

转载自blog.csdn.net/weixin_59496235/article/details/126794641
今日推荐