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 的看官可以酌情跳过
- win10 会遇到一些系统版本限制导致无法正常安装,所以建议使用专业版或者企业版,如果没有的话,可以搞一个 Linux 的云服务器玩
- Docker Desktop requires the Server service to be enabled
- no matching manifest for windows/amd64 10.0.17763 in the manifest list entries
-
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 -v 查看能否正常使用
Docker 镜像的创建和推送
先看看涉及到的概念:
- 「镜像」:Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统
- 「容器」:容器是独立运行的一个或一组应用,是镜像运行时的实体
- 「仓库」:仓库可看成一个代码控制中心,用来保存镜像
显而易见,我们可以理解成,容器是由镜像实例化过来的,那么镜像又从哪里来的呢,他们又是都保存在类似 「NPM」 的一个中心化仓库中。看到「实例」 「仓库」是不是有股熟悉的味道,容器和镜像的关系可以参考我们「JavaScript」中对象和类/构造函数的关系,然后这些镜像呢就都在仓库中保存,如果你要用某个镜像,你需要先拥有一个仓库的账号,然后通过PULL的方式拉取到本地,同样的,每个人也可以往仓库PUSH我们自己的镜像,下面我们打开命令行操作一下。
1. Docker 账号注册与登录
上面提到,我们对镜像进行操作需要用到仓库,所以首先我们得在仓库注册一个自己的账号
选择通过命令行输入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 个问题,依旧可以通过里面的方法解决~然后重试一下,就可以看到安装成功,使用查看指令可以看到目前已安装的镜像
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
可以看到无论通过上面哪种方式,都可以创建出镜像出来,但是现在的镜像只存在本地,如果我们通过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的权限问题,我们参考「锦囊」中的第 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超详细图文入门(下)
谢谢大家~