Docker 学习篇(一)

程序媛和她的猫

共 1838字,需浏览 4分钟

 · 2021-09-17

1、Docker 为什么会出现?

传统部署方式,开发人员将程序打成war包,移交给运维人员,由运维人员部署到服务器上,如图1所示。但这种部署方式会出现下面这种问题:程序在开发人员的机器上运行是没问题的,但是当运维人员将其部署到生产服务器上,就可能出现各种各样的问题。这个时候,开发和运维就会各种扔锅,运维找开发说“你的代码有问题啊”,然后开发和运维说“是你不会部署”。(OS:话说开发好惨,不光要和产品经理撕,和前端撕,还要和运维撕。。。)

图1 传统方式部署

那么为什么会产生这种问题呢?开发将war包给到运维,运维不会对这个war包做任何更改,那咋就不能运行了呢?根本原因就是二者的环境和配置不一致,比如开发人员是在 Windows 上开发的,而运维人员是要部署到 Linux 上,环境一变,就可能出现问题,或者开发人员开发时用的 Redis 是 4.0 版本,运维搭建生产环境用的 Redis 是 3.2 版本,4.0 版本中的一些功能在 3.2 中不存在,这样的话也会出现问题。

Docker 就是为了解决这个问题的,如果我们使用 Docker ,那么打包的时候,就会将环境、配置和代码都打到一起,运维将开发那边传过来的代码、环境、配置(Dokcer 中的镜像)原封不动的部署到服务器上,自然就不会出现什么问题了。

将环境和代码放在一起还有一个好处,减轻运维人员的工作量。如果我们是集群部署,集群中有10台甚至更多台机器,程序中需要用到 Redis、Zookeeper、MQ等等,如果使用传统方式,运维人员就要对每台机器都要安装一遍 Redis、Zookeeper、MQ等等,而使用 Docker 的话,开发打的镜像中包含 RedisRedis、Zookeeper、MQ这些运行环境,运维直接将这个镜像部署到服务器上就行了。

图2 Docker部署
2、什么是 Docker?

Docker 是基于 Go 语言实现的云开源项目。Docker 的主要目标是“Build,  Ship and Run App, Anywhere”(在任何地方构建、发布并运行任何应用),Docker 通过对应用组件的封装、分发、部署、运行等生命周期的管理,使得一个应用程序及其运行环境能够做到“一次构建,处处运行”。

将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器,只需要一次配置好环境,换到别的机器上就可以一键部署好,大大简化部署操作

3、为什么要学习 Docker?

目前,很多应用都在云平台(阿里云等)上部署,作为开发人员,有必要了解一下 Docker、k8s 这些与云平台相关的知识。

4、从 Docker 的 logo 学习 Docker 的三要素

见图3,是从 Docker 官网下载下来的 Docker 的 logo。图中的鲸鱼,表示 Docker,鲸鱼背上一个一个隔离的集装箱表示容器。

Docker 三要素分别如下:

仓库(Docker Hub):类似Github,只不过 Github 提交的是代码,而 Docker Hub 提交的是一个一个的镜像。开发人员把本地跑的代码和环境打成一个镜像,上传到 Docker Hub 上面,然后告诉运维,运维从 Docker Hub 下载镜像。Docker Hub 是外国网站,访问很慢,一般我们都是用国内的阿里云来替代它。

镜像:开发人员把本地跑的代码和环境打成一个镜像,上传到仓库。环境也可以单独是一个镜像,如果我们需要安装 mysql ,可以先下载并安装 Docker ,然后从 Dokcer 仓库下载 mysql 的镜像,然后根据 mysql 镜像创建 mysql 容器并运行,此时 mysql 就安装好了。

容器:运维从仓库拿到镜像,然后做成容器,部署到服务器上。

镜像和容器之间的关系,很容易让人困惑:
镜像相当于 Java 中的类,类似于public class Person{......},容器相当于 Java 中的对象,是根据类生成的,类似于Person p1 = new Person();。

图3 Docker logo


浏览 16
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报