Tips : 由于本篇是IT入门教程,非IT行业或对docker不敢兴趣的读者可以直接跳到最后一段.
在互联网或区块链世界里面,开发人员或是架构师必须要掌握的一个技能中,Docker一定是其中之一了.
01 Docker是什么?
1.1 Docker是一个工具类型的软件
Docker是可以运行linux,mac os,windows上的一个工具型软件,通常这个软件只有开发人员和运维人员使用.
1.2 Docker是一个容器
Docker是一个容器,就像是杯子一样,只不过杯子是用来装水的,笔筒是用来装笔的.Docker这个容器就是用来装任何的程序.并让这个程序在这个容器中运行起来.
02 Docker的设计思想
Docker的Logo非常传神的表达了Docker的设计思想.Logo的主要组成元素就是鲸鱼和集装箱.
2.1 集装箱->容器思想
Docker的设计灵感来源于集装箱.
在没有集装箱之前,码头货物运输是非常杂乱的.有专门运输化学用品的船,也有专门运输水果的船.
但是当集装箱出现以后:
- 所有的集装箱大小相同:Docker的标准化
- 集装箱之间互不影响:Docker的隔离性,容器之间没有任何影响
- 不需要专门的水果船和化学用品船,全都放到不同的集装箱中:只需要将软件封装到对应的容器中
2.2 集装箱里面的货物->镜像文件
打包好的运行环境(即系统,例如linux操作系统)和基于运行环境开发的软件生成的文件叫镜像(image).
类似我们装windows系统使用过的GHO、ISO等系统镜像。
2.3 码头 -> 镜像仓库
码头是用来存储货物的地方,镜像仓库是存放镜像文件的地方,镜像仓库中有很多的镜像文件可以下载到我们的电脑上.
主要的镜像仓库有
- hub.docker.com 国外速度比较慢
- https://c.163yun.com/hub 国内163镜像中心
2.4 Docker使用流程
使用Docker软件去镜像中心下载对应的镜像,然后使用一条命令行,加载镜像文件,得到一个容器,我们可以将自己的软件部署或是安装到容器中去,让软件运行起来.
03 Docker解决了什么问题
3.1. 我本地运行没有问题啊?
这是开发人员和测试人员常有的矛盾,这种问题通常就是因为环境不一致导致的,Docker的环境标准化有效解决了运行环境不一致的问题.
3.2. 系统好卡,哪个哥们又写死循环了?
同一个linux系统有不同的开发测试人员去部署软件,导致其他人的软件可能会严重影响系统资源.Docker启动的时候已经限制了CPU和内存使用资源.做到大家的程序进行隔离.
3.3. 双11来了,服务器撑不住了
通过Docker迅速克隆n台服务器,Docker的标准化让程序的迅速扩展.弹性伸缩变得简单.
3.4. (开发人员)本机搭建分布式或集群应用
windows系统本机开发分布式应用通常会在本机启动多个虚拟机,这样造成的结果是大量占用内存资源.docker的轻量级容器思路可以非常好的解决本机搭建分布式和集群应用.
04 5秒钟搭建一个数据库
4.1 安装
Docker通常在linux上进行安装,这篇教程展示的是windows环境下的Docker安装.
首先去官网下载安装软件:
https://store.docker.com/editions/community/docker-ce-desktop-windows
由于我的是windows 10 家庭和学生版,所以我只能安装Toolbox版本
4.2 安装中遇到的坑
安装过程中,无脑点下一步就可以了,但是在安装的过程中还是有很多坑:
- Toolbox版本其实是模拟了一个linux环境,最后启动了安装目录中的start.sh脚本,里面需要读取环境变量,如果不配置相应系统环境变量就会报错
- 启动桌面的Docker Quickstart Terminal快捷方式后,会发现程序一直去github下载一个 boot2docker.iso文件,由于国内的原因是比较慢的.可以去
https://pan.baidu.com/s/1qYyc0ag
直接下载后放入对应的文件中后再启动
4.3 启动 + 搭建数据库
接下来Docker就可以正常启动了,同时需要查看的docker-machine的运行环境,对应IP地址在后面端口映射的时候可以使用到.
docker search [关键字]
用来去中央镜像仓库查询镜像,方括号表示可选内容
通常来说,不包含\
的就是官方镜像,同时也可以观察STARS来判断镜像的热度.
docker pull [OPTIONS] NAME[:TAG]
: 用来拉取镜像到本机,格式是镜像名:版本号,
docker images [OPTIONS] [REPOSITORY[:TAG]]
查看本机有哪些镜像文件
接下来是通过docker加载镜像文件启动一个容器运行mysql数据库,命令行如下:
docker run -p 8888:3306 --name helloworldlyric -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
- 其中-d表示后台运行
- -p 8888:3306 表示容器中的3306端口映射到docker machine的8888端口中
- -e MYSQL_ROOT_PASSWORD=123456 表示初始化密码
- --name helloworldlyric 是为自己的这个容器去一个名字
返回了一个Hash值,这个hash值是这个容器运行的ID,是一个唯一标示.
docker ps
: 用来查看目前哪些容器正在运行
接下来就是连接数据库了,IP注意要使用之前docker-machine env
中的IP地址,端口号为8888,用户名为root,密码为123456,经过测试可以连接成功.
docker stop [容器ID]
: 最后是停止容器,容器ID支持模糊查询
05 使用总结
通过这次体验,Docker是使用思路也很清晰了.
对于开发人员,可以去镜像中心下载各种组件帮助自己本机快速搭建开发环境,同时避免污染本地系统(数据库安装后通常很难删干净,导致再次重装总是无法成功).
对于运维人员,可以将自己需要发布的软件镜像化,然后快速的在不同的机器上进行部署.
06 从Docker中学到了什么
追求发展一个系统而不是实现具体的一个目标
Docker使用的虚拟化和容器技术很早之前就已经出现了.但是Docker通过这些技术发展出了一个生态系统(docker镜像,docker容器,镜像仓库).
加上了由于虚拟化应用和云计算的流行,给Docker技术的火热创造了必要条件。如果Docker只是向之前一样追求实现一个具体目标或是功能,自然就无法有今天的成就.
所谓的'系统',是一个可以连续变化的东西,它可以是一项技能或是一段关系,通过这个系统,你可以实现你的各种目标,你关心的的并不是在某件事情上的成败.而是从成败中不断调整来优化自己的系统.
当我们换工作时,每个公司的具体业务是不一样的,工作具体内容也是不一样的,当进入了一家公司以后,如何更快的适应新公司的工作和业务,依赖的就是过去工作中积累的具体技能或是经验.这些技能和经验就是我们的系统的组成部分.
平时在工作生活中也经常犯以偏概全的错误,总是在一些小事上不断的纠结,写作的时候总是关注,今天的这一篇又没有写好.或是在写程序的时候只考虑了具体业务,没有想到代码的复用性.把注意力完全放错了地方.
而把具体目标放到一个系统的框架中去实现,会得到一个更高的视角去看问题,关注的是未来优化后的系统能实现其他的什么目标.是一种从'活在当下'到'活在未来'的转变.
表现型人格的人通常非常在意目标的实现,因为从中可以获得一种奖赏,比如会因为自己某次考试得到高分而沾沾自喜;而成长型人格更多的关注自己的成长,而不是因为实现目标得到的奖励.
具体的目标实现也很重要,但是更好的策略是把注意力更多的放到自己的成长上,发展出一个属于自己的'系统',从而更好的面对不确定性的未来.