从零开始学Docker(一)-- 初识“偷懒神器”-Docker

2,679 阅读8分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第二十天,点击查看活动详情

📣 大家好,我是Zhan,一名个人练习时长一年半的大二后台练习生🏀

📣 这篇文章是 从零开始学Docker 的第一篇学习笔记📙

📣 如果有不对的地方,欢迎各位指正🙏🏼

📣 与君同舟渡,达岸各自归🌊


👉引言

博主拿到一个新的服务器,但是不想再一步一步的搭MySQL、Redis……的环境了 0^0,所以就来使用这个偷懒神器——Docker,帮助我们快速搭好环境

作为后台开发工程师,而不是运维,Docker是帮助我们快速搭好环境的一把好手,具体Docker有哪些优点、做了些什么、如何帮助我们去做的,本文会告诉你答案,本文将从以下几点来初步了解这个“偷懒神器”:

  • 1️⃣ 什么是Docker,并介绍Docker的工作原理
  • 2️⃣ Docker和虚拟机的区别
  • 3️⃣ Docker工作架构
  • 4️⃣ 安装Docker

1️⃣ Docker 概述

在我们部署项目的时候,拿到一个全新的服务器,我们无法做到把代码丢进去就能用,我们需要安装Java环境、MySQL环境、Redis环境……,很明显,在这种情况下,我们交付软件之前部署这些环境是一个不小的工程

也就是说,大型项目的组件很多,运行的环境也较为复杂,在部署的时候可能遇到:

  1. 依赖关系复杂,可能多个库之间存在兼容性问题
  2. 开发、测试、生产环境有差异 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的架构,我们以几个比较重要的概念开始讲解:

  1. 镜像:Docker会把应用程序以及所需要的依赖、函数库、环境、配置文件打包在一起,这个我们在上文中有提到过
  2. 容器:镜像中的应用程序运行起来后形成的进程其实就是容器,也就说帮助我们做隔离,防止各个环境相互干扰,也就是会有独立的CPU、内存资源、文件系统,那么在这个容器内运行的进程,就会认为是这台计算机上的唯一进程,起到隔离的效果。

如果存在一个MySQL镜像,我们进行数据的修改,我们也提到了镜像中会存储配置文件,例如MySQL的data目录,那么我们对数据增删查改,会修改到镜像吗?

很显然不能,因为如果这么做了,就会对镜像产生了污染,如果在写的过程中一些操作不当,导致镜像不能用了,那就出大问题啦~因此镜像是只读的!

那写数据具体的实现就是:把镜像中的文件拷贝一份到容器中,后续的数据就只写在自己的容器中,那么这个镜像就可以一直复用,因为它不会被干扰


那镜像可以一直复用,我们去哪找镜像呢?有一个地方叫做DockerHub,是镜像的托管平台,可以结合GitHub的命名方式去理解它

就像我们可以从GitHub中去拉取代码一样,我们可以从DockerHub去拉取镜像,国内也有类似于DockerHub的托管平台,如网易云镜像服务、阿里云镜像库……


那我们如何利用Docker进行 镜像构建、从远端拉取Docker或者是运行容器 就又成为了一个问题,关于这,我们就不得不了解Docker的架构了

Docker 是一个CS架构的程序,由两部分组成:

  1. 服务端(server):负责接受用户指令,完成用户对于镜像的各种操作
  2. 客户端(client):向Docker下达命令(本地),或者通过RestAPI向服务器发送请求(远程)


4️⃣ Docker 安装

说了半天的Docker,其实我相信大家现在对Docker的优点、工作原理、架构了解的差不多了,那么我们就开始安装这个利器:

Docker是可以在各种操作系统上使用,但是实际环境大多使用的是Linux的CentOS,我本人也是使用的这个,因此我们就以这个为例子来着手安装一下Docker:

  1. 首先我们要保证我们的CentOS要版本大于7,并且内核版本要大于3.10
  2. 安装yum工具(需要联网):
yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2 --skip-broken
  1. 更新本地镜像源:
# 设置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
  1. 安装Docker社区版(CE):
yum install -y docker-ce

安装结束,很轻松很愉悦,接下来就要启动我们的Docker了,但是在启动之前一定要关闭防火墙:systemctl disable firewalld,然后启动docker:systemctl start docker,至此Docker安装完成,the end~

  1. 配置阿里云镜像(选做):
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。咱们明天见~