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 支持的所有镜像, 可以看到我们常用的 Node.JS,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 的一点心得体会, 简单整理分享, 祝各位食用愉快!
来源: http://www.jianshu.com/p/4d9919c024b7