开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第二十天,点击查看活动详情
📣 大家好,我是Zhan,一名个人练习时长一年半的大二后台练习生🏀
📣 这篇文章是 从零开始学Docker 的第一篇学习笔记📙
📣 如果有不对的地方,欢迎各位指正🙏🏼
📣 与君同舟渡,达岸各自归🌊
👉引言
博主拿到一个新的服务器,但是不想再一步一步的搭MySQL、Redis……的环境了 0^0,所以就来使用这个偷懒神器——Docker,帮助我们快速搭好环境
作为后台开发工程师,而不是运维,Docker是帮助我们快速搭好环境的一把好手,具体Docker有哪些优点、做了些什么、如何帮助我们去做的,本文会告诉你答案,本文将从以下几点来初步了解这个“偷懒神器”:
- 1️⃣ 什么是Docker,并介绍Docker的工作原理
- 2️⃣ Docker和虚拟机的区别
- 3️⃣ Docker工作架构
- 4️⃣ 安装Docker
1️⃣ Docker 概述
在我们部署项目的时候,拿到一个全新的服务器,我们无法做到把代码丢进去就能用,我们需要安装
Java环境、MySQL环境、Redis环境……,很明显,在这种情况下,我们交付软件之前部署这些环境是一个不小的工程
也就是说,大型项目的组件很多,运行的环境也较为复杂,在部署的时候可能遇到:
- 依赖关系复杂,可能多个库之间存在兼容性问题
- 开发、测试、生产环境有差异 Docker就能帮助我们解决这些问题,将应用程序与基础架构分开,从而可以快速交付软件
那么Docker是如何解决这些问题的呢?
首先就是依赖的兼容性问题:
- Docker将应用的函数库、依赖、配置、应用一起打包,形成可移植镜像
- 然后放到一个隔离的容器里面去运行,也就是说各个环境不会互相干扰,这里有用到一个叫做“沙箱”的机制
再就是生产环境的区分,在上文中我们提到“开发、测试、生产环境有差异”,我们先解释一下这个问题具体是怎么回事,不同环境的操作系统不同,因此我们先来了解一下操作系统的结构:
- 系统应用:该层有很多的函数,这些函数供给MySQL这种服务进行调用,进而去调用它的下一层内核,但是不同的操作系统他们的函数库是不同的,尽管它们的内核都是Linux
- 内核:负责与计算机硬件进行交互,会把上层调用变成一个个指令进而去操作计算机硬件
通过上述的描述我们可以知道,不同系统应用的函数库不一样,那么想要把一个操作系统的命令迁移到另一个操作系统,很明显不现实,也就是说本来在Ubuntu上的MySQL服务迁移到CentOS上,这个就无法实现。
那么Docker是如何解决这个问题呢?
既然每个应用都依赖于系统函数库,就把系统函数库和应用一起打包,也就是说,打包MySQL的时候同时把Ubuntu的函数库也打包进去,这样只要系统环境是Linux内核,那么程序就能跑起来。
即Docker运行到不同操作系统时,直接基于打包的库函数,借助于操作系统的Linux内核来运行。
2️⃣ Docker 与 虚拟机
我们从上文学习到了Docker的工作原理,得知,Docker可以做到在不同的Linux系统上运行和部署,而我们的虚拟机同样能够达到类似的效果,他们有什么差别呢?
虚拟机其实借用了一种叫做Hypervisor的技术,它可以模拟出一个计算机的各种硬件,例如CPU、内存……,然后在这个模拟的计算机上安装任意想要的操作系统,并安装任意操作系统对应的依赖、函数库……
所以其实我们能看出它们的区别:
- 性能:
- 虚拟机:是在一个系统里装了另外一个系统,当应用执行时会认为在一台真实的电脑上,会先调用内置的操作系统,再与Hypervisor进行交互,然后把信息传输给真实的操作系统,进行传给计算机硬件,我们看到进行了一个层层传递,性能差一些
- Docker:的应用在执行时,是直接调用操作系统内核的,因此它的性能会比虚拟机更好,接近于原生的性能
- 硬盘占用:
- 虚拟机:会安装所有的函数库和依赖,会有冗余的内存,一般以GB为单位
- Docker:只是封装了一些简单的函数库和依赖,并且是必须的,因此体积一般比较小,一般以MB为单位
- 启动时间:
- 虚拟机:先启动虚拟的计算机系统,再去启动各个应用,相当于把计算机重启了一次,一般以分钟为单位
- Docker:相当于把操作系统上的一个进程启动起来了,启动速度很快,一般以秒为单位
- 综上所述:选Docker!!!
3️⃣ Docker 架构
在上文中我们了解到了Docker的工作原理,但是为了更好的使用Docker,我们还需要理解一下Docker的架构,我们以几个比较重要的概念开始讲解:
- 镜像:Docker会把应用程序以及所需要的依赖、函数库、环境、配置文件打包在一起,这个我们在上文中有提到过
- 容器:镜像中的应用程序运行起来后形成的进程其实就是容器,也就说帮助我们做隔离,防止各个环境相互干扰,也就是会有独立的CPU、内存资源、文件系统,那么在这个容器内运行的进程,就会认为是这台计算机上的唯一进程,起到隔离的效果。
如果存在一个MySQL镜像,我们进行数据的修改,我们也提到了镜像中会存储配置文件,例如MySQL的data目录,那么我们对数据增删查改,会修改到镜像吗?
很显然不能,因为如果这么做了,就会对镜像产生了污染,如果在写的过程中一些操作不当,导致镜像不能用了,那就出大问题啦~因此镜像是只读的!
那写数据具体的实现就是:把镜像中的文件拷贝一份到容器中,后续的数据就只写在自己的容器中,那么这个镜像就可以一直复用,因为它不会被干扰
那镜像可以一直复用,我们去哪找镜像呢?有一个地方叫做DockerHub,是镜像的托管平台,可以结合GitHub的命名方式去理解它
就像我们可以从GitHub中去拉取代码一样,我们可以从DockerHub去拉取镜像,国内也有类似于DockerHub的托管平台,如网易云镜像服务、阿里云镜像库……
那我们如何利用Docker进行 镜像构建、从远端拉取Docker或者是运行容器 就又成为了一个问题,关于这,我们就不得不了解Docker的架构了
Docker 是一个CS架构的程序,由两部分组成:
- 服务端(server):负责接受用户指令,完成用户对于镜像的各种操作
- 客户端(client):向Docker下达命令(本地),或者通过RestAPI向服务器发送请求(远程)
4️⃣ Docker 安装
说了半天的Docker,其实我相信大家现在对Docker的优点、工作原理、架构了解的差不多了,那么我们就开始安装这个利器:
Docker是可以在各种操作系统上使用,但是实际环境大多使用的是Linux的CentOS,我本人也是使用的这个,因此我们就以这个为例子来着手安装一下Docker:
- 首先我们要保证我们的CentOS要版本大于7,并且内核版本要大于3.10
- 安装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
- 安装Docker社区版(CE):
yum install -y docker-ce
安装结束,很轻松很愉悦,接下来就要启动我们的Docker了,但是在启动之前一定要关闭防火墙:systemctl disable firewalld,然后启动docker:systemctl start docker,至此Docker安装完成,the end~
- 配置阿里云镜像(选做):
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://7amwpdhn.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
💬 总结
其实之所以来学Docker是因为,要拿到一个新的服务器,不想从头开始,一个一个部署MySQL、Java、Redis的环境,于是就来学Docker了,今天主要是对Docker的一个了解:
- 对于Docker的工作原理:我们通过大型项目可能出现的问题,引出Docker的解决方案,也就是工作原理,至此我们也能理解Docker的方便之处
- 对于Docker & 虚拟机:二者有一定的相似之处,但是对比二者之后发现:Docker完胜
- 对于Docker 架构:其实这里说是Docker架构,实际上和MySQL差不多,属于CS架构
- 对于Docker安装:其实我们不难发现,纯cv操作,两分钟速通hhh
相信读完今天的文章,大家能对Docker的优点、工作原理有了初步的了解~
明天我们就正式使用Docker来部署我们的环境~
🍁 友链
✒写在最后
都看到这里啦~,给个点赞再走呗~,也欢迎各位大佬指正以及补充,在评论区一起交流,共同进步!也欢迎加微信一起交流:Goldfish7710。咱们明天见~