1、Docker是什么
这个有着萌萌海豚logo的开发工具就是我们今天的C位大佬——Docker,我们先来看一下网上关于Docker的定义:
“ Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。”
看不懂吧?看不懂就对了!哈哈哈哈哈哈哈,感受一下来自程序员的嘲讽!
看不懂的原因主要是因为这里引入了一个新的概念:容器。刚开始很多人会把容器和传统虚拟机的概念弄混,很多人应该都使用过虚拟机,每台虚拟机都有自己完整的用户操作系统,虚拟机一旦开启,预分配给它的资源会被全部占用,而容器是我们和宿主机共享硬件资源及操作系统,可以实现资源的动态分配。
简单来说,容器技术是实现操作系统虚拟化的一种途径,可以让我们在资源受到隔离的进程中运行应用程序极其依赖关系。
而Docker就可以帮助我们将开发的应用程序,以及该程序的依赖包都打包在一个文件里。运行这个文件,就会生成一个虚拟容器。当我们将这个程序在虚拟容器里运行时,就跟在真实的物理机器上运行效果是一样的。
总体来说,Docker可以让用户方便的创建和使用容器,把自己的应用程序放在容器里运行,可以实现环境一致性、提升运营效率以及开发人员的生产力。它还可以帮助我们进行版本管理、复制、分享、修改,就像管理普通的代码一样。
我们可以从下面这张表格很清楚地看到容器相比于传统虚拟机的特性的优势所在:
2、为什么要使用docker?
简单介绍了容器和虚拟机的概念后,我们就可以大概的总结出Docker的以下几点优势:
(1)可以帮助我们灵活方便的安装应用,搭建环境,部署应用。
(2)相比于传统的虚拟化方式,它节省系统资源开销,几乎没有性能损耗,而且启动快速,所占内存极小,更轻量,可以让你腾出更多的硬盘空间存放小电影儿。在相同的硬件环境下,Docker运行的镜像数目远多于虚拟机数量,对系统的利用率极高。
(3)灵活的迁移你开发的应用程序,它可以保证应用程序快速、可靠、一致性的部署,而且不受部署环境的影响,我们就不用再担心环境的问题。
(4)最后也是大家最关心的一点,直接跟我们的钱包挂钩。学会docker可以让自己在求职应聘中更有竞争力,目前Docker在国内互联网行业的发展形势一片大好,特别是在一线公司,Docker的使用已经十分普遍,甚至成了企业面试的加分项。在很多开发工程师招聘需求中,都会要求熟悉Docker的使用。
目前网络上有很多Docker的优秀教程,但是有很多都是原理性的东西,我自己也是看的云里雾里,对于初学者而言还是很难理解的,下面我就从初级前端开发工程师的角度,简单总结一下使用Docker部署mongodb数据库并且开启远程连接,希望通过这个小案例,能启发你学习docker的兴趣,带你初步认识一下这个强大的开发工具。
Docker 的三个基本概念
Image(镜像)
Container(容器)
Repository(仓库)
Image(镜像)
不理解什么是镜像?没关系,不理解就不理解吧,继续往下看。
(别问我为什么不解释,让我们保留一些真诚和羞射)
Docker Container
Docker 容器就是 Docker 镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。
Docker 提供了一套简单实用的命令来创建和更新镜像,我们可以通过网络直接下载一个已经创建好了的应用镜像,并通过 Docker RUN 命令就可以直接使用。
当镜像通过 RUN 命令运行成功后,这个运行的镜像就是一个 Docker 容器啦。
容器可以理解为一个轻量级的沙箱,Docker 利用容器来运行和隔离应用,容器是可以被启动、停止、删除的,这并不会影响 Docker 镜像。
Repository(仓库)
Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行。
但是, 如果需要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry(仓库注册服务器)就是这样的服务。
有时候会把仓库(Repository)和仓库注册服务器(Registry)混为一谈,并不严格区分。
Docker 仓库的概念跟我们之前学习过的Git 类似,仓库注册服务器(Registry)可以理解为 GitHub 这样的托管服务。
实际上,一个 Docker Registry 中可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应着一个镜像。
所以说,镜像仓库是 Docker 用来集中存放镜像文件的地方,类似于我们之前常用的代码仓库。
我们在本地运行 docker push、docker pull、docker search这些命令 时,实际上是通过 Docker Daemon 与 Docker Registry 通信。
镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是 Docker 的核心。
3、安装Docker
吹了半天终于开始进入正题,首先让我们登录它的官网
https://www.docker.com/
这里忍不住想给Docker的设计团队疯狂打电话,它的官网是我目前见到的所有开发工具网站中视觉效果最棒,交互最流畅的一个。整体给人一种非常清新快速的感觉,很契合这个工具的功能和理念,第一眼就爱上了,像极了爱情。
点击【Learn more】查看它的详细介绍
点击【Start a free trail】创建一个免费账户
创建好账户登录,点击右侧【Download Desktop and Take a Tutorial】
进入https://hub.docker.com/,点击【Get start with Docker Desktop】进入下载页。
按照自己的操作系统,选择相应的版本下载安装到本地。它这上面还很温馨的给你提供了一些小的教程,按照左侧五个步骤一步一步来就会get Docker的基本操作。
下载安装好后在电脑的右上角就会出现萌萌的小海豚标志。
打开终端执行docker -v命令查看当前安装的docker版本,当打印输出:Docker version 18.09.2, build 6247962(版本号),就表示已经安装成功并且可以使用了。
我们在Docker官网中的这个页面上查看Docker支持的所有镜像,可以看到我们常用的nodejs、mySQL、mongoDB、PHP都有提供。
https://hub.docker.com/search?image_filter=official&type=image
点击进入相应页面查看现有的镜像版本
接下来就要引入另一位大佬mongoDB数据库,在没有遇到Docker之前,安装mongoDB的过程都可以写一本辛酸史了,自己折腾了一顿不但没有安装好还把环境变量改乱了(这里给各位个贴心小tip:修改重要参数之前一定要备份!一定要备份!一定要备份!),此处要特别感谢我的大学好友,是她告诉我了Docker这个神器,保住了我日渐后移的发际线,有了Docker之后整个过程如丝般顺滑,省去了配置.bash_profile等等一系列繁琐的环节。
由于Docker的服务器在国外,为了保证我们接下来的下载体验更酸爽,在开始之前先获取一个国内的镜像,这里再吹一波马云爸爸,阿里云真香!
点开
https://cr.console.aliyun.com/?spm=5176.100239.blogcont29941.12.eyc9rO#/accelerator
注册账号,登录
在左上角汉堡包导航中找到产品与服务——弹性计算——容器镜像服务。
再选择最下面的菜单栏,镜像加速器,在左侧页面选择你对应操作系统,默认是Ubuntu,刚开始我看了半天没看懂,不禁开始怀疑人生。谁能想到这个设计的不像选项卡的选项卡还是可以点击的呢。Mac和Windows系统的自己手动切换一下。
我们刚才已经安装好了Docker,所以直接按照网站上写的下列步骤操作就可以啦。(我这里写的是Mac系统的操作步骤,可以看到阿里云官网也是默认推荐使用Docker的!!!)
针对安装了Docker for Mac的用户,您可以参考以下配置步骤:
右键点击桌面顶栏的 docker 图标,选择 Preferences ,在 Daemon 标签(Docker 17.03 之前版本为 Advanced 标签)下的 Registry mirrors 列表中将
https://8p0vcewm.mirror.aliyuncs.com加到"registry-mirrors"的数组里,点击 Apply & Restart按钮,等待Docker重启并应用配置的镜像加速器。
在docker中配置好镜像文件后我们再回到终端中执行docker pull mongo命令,将mongoDB数据库的镜像加载到我们本地。默认会给你下载最新的版本,如果需要特定的版本号,在该命令后加冒号,后面写版本号,例如:docker pull mongo:3.6,下载3.6版本的mongoDB数据库。
mySQL数据库最新版本会有一些功能不稳定的情况,建议不要安装最新版本,而mongoDB不会,所以直接执行docker pull mongo下载就可以了。
运行docker images查看我们拉取到本地的所有镜像, TAG显示当前版本信息。
如果想移除镜像只需要运行docker rmi mongo:版本号就可以了
下载好mongoDB镜像后我们再运行一下docker run --name some-mongo -p 27017:27017 -d mongo
这条命令会用 mongodb 镜像启动一个容器,命名为 some-mongo ,并且映射了 27017端口。
如果你不暴露27017的端口号在node.js中连接的时候会报这个错误,提示你找不到这个端口号。
启动容器后运行docker ps -a查看所有启动的容器,确保容器的STATUS不是处于Exited阻塞状态,如果处于阻塞状态需要运行docker restart容器ID或容器名来重新启动。停止一个容器的命令是docker stop容器ID或容器名。
查看自己的容器启动好之后就可以运行docker exec -it some-mongo bash命令,然后输入mongo就可以优雅地连接mongoDB数据库了。
Docker 常用命令
我们可以通过 docker -h 去查看命令的详细的帮助文档。在这里我整理一些日常我们可能会用的比较多的一些命令。
docker pull image_name :拉取一个 Docker 镜像
docker images :查看主机下存在的镜像
docker ps -a :查看当前容器的运行状态(-a 是查看当前所有的容器,包括未运行的)
docker restart 容器名或ID:重启容器
docker stop 容器名或ID:停止容器
docker rmi image_name :删除镜像(先停止容器)
好了,以上就是初步接触Docker的一点心得体会,简单整理分享,祝各位食用愉快!