Docker超详细图文入门(上)

2,276 阅读10分钟

1 Docker 的前世今生

学习 Docker 之前,我们可以先扒扒这个一出生就成为明星的项目。

  • 2010 年:Docker Inc 的前身 dotCloud 在美国旧金山成立,主要是基于 PaaS 平台为开发者或开发商提供技术服务,不久后该公司将其核心技术简化和标准化后命名为——Docker
  • 2012 年:随着微软、谷歌、亚马逊、IBM 等大厂纷纷加入 PaaS 平台,竞争变得尤为激烈,dotCloud 发展举步维艰,急需找到突破点
  • 2013 年 3 月:dotCloud 公司的创始人之一,Docker 之父,28 岁的 Solomon Hykes 正式决定,将 Docker 项目开源。一经发布,便火遍全网,众多工程师尝到甜头后蜂拥而至,不断完善和壮大 Docker 的社区,开源当月开始,以每个月一版本的发布频率野蛮生长,于是公司干脆改名成 Docker Inc
  • 2014:6 月份 Docker 1.0 版本正式发布,这个时期的 Docker 已然成为了整个行业的新宠儿,融资将近 7000 万美元,发展势不可挡
  • 2015:该年 Docker Inc 又斩获将近 1 亿美金融资,获得像 Google、微软、Amazon、VMware 这样的巨头青睐和支持,估值。国内的京东同年在 618 上,大胆启用基于 Docker 的容器技术承载关键业务,并在次年启用 15 万个 Docker 实例,实现了所有业务的容器化
  • 2017:对于 Docker 来说是动荡的一年,虽然依旧获得七千多万美金的融资,同时估值达到 13 美金之多,但是公司 Docker 上游项目 Moby 的考虑欠周发布,以及和 Kubernetes 的一些摩擦,也让公司处于舆论的风口浪尖之上
  • 2018:Docker 创始人 Solomon Hykes 辞职,不再担任公司的日常运作工作。同年,Steve Singh 接任 Ben Golub 成为 Docker 公司新的 CEO
  • 2019:开源云公司 Mirantis 宣布从 Docker Inc.收购了 Docker Enterprise 平台业务。同年,Docker 宣布大力拥抱 Kubernetes
  • 2020:Docker 公司发布新战略:以 Docker Hub 为中心,为用户提供 SaaS 服务

由此可知,像很多优秀的人一样,耀眼的同时充满着吸引人的话题,但是不可否认的是,在过去的十年中,Docker 在容器技术这块开创了一个时代,而在容器技术以及 K8S 等集群管理项目日益成熟的今日,Docker 也必将是不可忽视的一股力量。

2 Docker 的优缺点

这个本来想详细列出来,不过其实大家之前应该也听过很多,比如这篇Docker 的优点,就讲的很清楚,但是本文的重点在于用简单的例子去带大家了解docker,了解过后,希望再去让大家体会到他的优缺点

3 Talk Is Cheap

Docker 本身是一种容器技术的总称,里面涉及到的概念比较多,光说不练假把式,下面会带着大家,边实践,边去了解其中涉及到的名称以及概念意思。

Docker 安装

本文是基于 Win10 介绍如何部署前端应用,不同系统如何安装看这里

Windows 的用户在使用的过程中可能会碰到下面这些意料之外的问题,也同时给大家准备了解决方案的锦囊,这部分现在可以略过,大家下面如果碰到了可以回过头看,Linux 和 Mac 的看官可以酌情跳过

  1. win10 会遇到一些系统版本限制导致无法正常安装,所以建议使用专业版或者企业版,如果没有的话,可以搞一个 Linux 的云服务器玩
  2. Docker Desktop requires the Server service to be enabled
  3. no matching manifest for windows/amd64 10.0.17763 in the manifest list entries
  4. PUSH操作权限问题,分两种情况,一种是没有登录,这样的话我们执行docker login重新登录即可,第二种是非官方发布的镜像,需要在本地的镜像名称前加上我们 DockerHub 的用户名,用斜杆隔开 [user-name/image-name]

注意:Windows 中安装的 Docker Desktop for Windows 是基于 hyper–v 的一种解决方案,所以不适用于生产环境,本文基于 Windows 介绍一是 docker run in windows 的坑比较多,顺带踩一下,而且也可以同时让大家了解一下 Docker 的基本概念和使用

开启 hyper-v,win10 的限制

安装 Docker

这里可能就碰到锦囊中描述的第 2 个问题,大家按照里面的方法就可以解决了~

安装成功后,重启电脑

启动 Docker,需要等几分钟

Docker Desktop
Docker Desktop
在任务栏会出现一个这样的提示,说明OK啦
在任务栏会出现一个这样的提示,说明OK啦

在任务管理器中输入 Docker -v 查看能否正常使用

可正常使用
可正常使用

Docker 镜像的创建和推送

先看看涉及到的概念:

  • 镜像:Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统
  • 容器:容器是独立运行的一个或一组应用,是镜像运行时的实体
  • 仓库:仓库可看成一个代码控制中心,用来保存镜像

显而易见,我们可以理解成,容器是由镜像实例化过来的,那么镜像又从哪里来的呢,他们又是都保存在类似 NPM 的一个中心化仓库中。看到实例 仓库是不是有股熟悉的味道,容器和镜像的关系可以参考我们JavaScript中对象和类/构造函数的关系,然后这些镜像呢就都在仓库中保存,如果你要用某个镜像,你需要先拥有一个仓库的账号,然后通过PULL的方式拉取到本地,同样的,每个人也可以往仓库PUSH我们自己的镜像,下面我们打开命令行操作一下。

1. Docker 账号注册与登录

上面提到,我们对镜像进行操作需要用到仓库,所以首先我们得在仓库注册一个自己的账号

DockerHub账号注册
DockerHub账号注册

选择通过命令行输入Docker login或者在可视化客户端的面板登录入口进行登录都可,虽然可视化工具操作起来比较方便,不过还是建议使用命令行操作,就当做熟悉一下 Docker 的操作指令~ 输入账号密码进行登录

国内从 DockerHub 拉取镜像比较慢,我们需要配置镜像加速器,详细操作参考这里。 配置完加速器后,我们就可以尝试创建我们的第一个镜像,有两种方式:

1) 从 Docker Hub 获取已有镜像并更新
1. 从官方仓库获取node镜像 docker pull [image name 镜像名 必填]:[tag 版本号 默认是lastest]

   docker pull node


2. 查看已安装成功的镜像

   docker images

3. 更新官方镜像 docker tag [local-image-name 本地镜像名称]:[tag 本地镜像版本] [release-image-name 你要在远程仓库推的镜像名称]:[release-tag 本次镜像推送的版本号],可以通过 docker images 查看到本地多出了一个我们新建的镜像了,并且是完全复刻官方的镜像功能

   docker tag node leontwo-node:0.0.1

上面的第一步中,这边如果选择的是 windows container,会碰到锦囊中的第 3 个问题,依旧可以通过里面的方法解决~然后重试一下,就可以看到安装成功,使用查看指令可以看到目前已安装的镜像

创建镜像-from仓库(1)
创建镜像-from仓库(1)
创建镜像-from仓库(2)
创建镜像-from仓库(2)
2) 本地通过 Dockerfile 文件进行定制创建,同样的创建一个 node 镜像

Dockerfile:一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明

1. 在任意目录新建 Dockerfile 文件,并写入以下内容并保存

   From node

2. 在当前目录执行 docker build [配置项 配置值] [image-name 必填]:[tag 版本号 默认lastest] [Dockerfile路径 必填]

   docker build -t my-node:0.0.1 .

3. 查看已安装成功的镜像

   docker images
创建镜像-from本地
创建镜像-from本地

可以看到无论通过上面哪种方式,都可以创建出镜像出来,但是现在的镜像只存在本地,如果我们通过docker search [image-name]:[tag]的方式去搜索,如下所示,结果列表为空

搜索结果
搜索结果

那么就想 NPM 发版包一样,我们要想其他人在他们本地的终端拉到我们的镜像,也是需要将本地的镜像PUSH到远程的仓库中

3. 将本地的镜像推到 DockerHub

1. 在任意目录执行 docker push [release-image-name 你要推送到远程仓库的本地镜像名称 必填]:[release-tag 同上]

   docker push leontwo-node:0.0.1
PUSH权限问题
PUSH权限问题

这时会碰到PUSH的权限问题,我们参考锦囊中的第 4 点即可解决,然后我们再重新创建一个命名规范的本地镜像出来,至于这里为什么换成了nginx镜像,一个是下面我们会用到,第二个是node镜像实在是太大了,实在是不适合演练PUSH的操作- -

推送本地镜像
推送本地镜像

然后登录我们的 DockerHub 就能看到我们刚刚推送上去的镜像了,并且也可以通过docker pull拉到我们的远程镜像了~ 但是这里却还是不能通过docker search搜索到,知道为什么的小伙伴希望可以留言告知一下~

已存在远程仓库
已存在远程仓库

4. 根据镜像创建容器并运行

当我们拥有了镜像后,就像我们拥有了构造函数和类,是时候去new出一个心仪的对象出来了。我们看看如何将镜像实例化~

1. docker run [配置项] [配置值] [container-name]:[container-tag 默认lastest] [image-name]:[image-tag 默认lastest] [命令] , 下面的意思是 根据本地的 [leontwo/nginx:0.0.1] 镜像创建一个 [有交互式操作终端的] 名为 [my-run-nginx] 的容器  并且默认执行  [/bin/bash] 命令

   docker run -it --name my-run-nginx leontwo/nginx:0.0.1 /bin/bash

运行完毕,我们可以看到我们马上就到了 nginx 容器中的 shell 面板上了

运行所创建的容器
运行所创建的容器

通过Ctrl d可以所运行退出容器,我们可以使用docker ps查看当前运行的容器,发现不仅退出了同时还关闭该容器,我们可以用docker ps -a查看所有未销毁的容器,包括运行和未运行的。

退出会导致容器关闭
退出会导致容器关闭

那么如何避免这种情况呢?docker 提供了docker exec的指令,这种方式区别于docker attach以及docker run,即使通过ctrl d退出后,依旧不会关闭容器,保持后台运行

退出后容器后台运行
退出后容器后台运行

前端应用简单部署用到的东西先介绍到这里,因为掘金更新后篇幅限制原因,具体如何操作,各位看官老爷详见下篇:Docker超详细图文入门(下)

谢谢大家~