为何要用Docker?
若是咱们想使用某种pc软件, 那么在互联网上查找并安装软件的流程大体以下图:html
那么这就有几个问题要弄清楚:mysql
- 从哪里得到软件
- App Store
- Linux的包管理
- 从某些网站直接下载
软件是否提供了相关信息和数据
- 例如流行度, 下载次数, 存在的bug, 上次的更新时间等等.
- 信任问题
- 下载软件的网站是否为官方网站
- http 仍是 https
- 代码
- 是否还能够下载
- 是否收费
第一个使人困扰的问题: 安装软件
- 软件是否支持个人操做系统/版本
- 是否支持个人设备的CPU架构
- 软件的格式
- 有些是从源码进行安装
- 有些是单独的exe文件
- 有的是exe+dlls
- 有时候是exe+dlls+依赖某些运行时
- 软件的安装方式
- 有自带的安装器
- 使用包管理工具安装
- 手动安装
- 软件的更新和卸载
- 自动更新?
- 软件的配置(对于新手来讲可能这就是个噩梦)
从上面这些问题能够看出, 如今这个年代, 安装个软件真是个挺麻烦的事, 尤为是用于开发相关的软件, 有时候让人头疼.linux
第二个问题: 软件的运行
这方面可能会存在如下问题:sql
- 是否有详细的帮助文档
- 软件在哪运行
- 是否须要手动修改系统某些设置
- 是否须要设置环境变量PATH
- 如何开始, 如何结束
- 是否须要注册服务
- 如何注册服务
- 是否须要手动编写服务配置
- 是否须要许可
- 如何安装和运行软件的依赖项
- 若是没找到依赖项会怎么处理
- 循环的依赖项
- 安全性, 沙箱运行?
- 破坏性更新
- 系统更新是否对软件有破坏性影响
- 共享的库有更新
什么是容器
Docker不是虚拟机的替代者, docker不是虚拟化技术, 它更可能是关于软件的运行.mongodb
什么是容器,它和虚拟机有什么区别?docker
首先介绍一下虚拟机:windows
虚拟机管理其把服务器的硬件资源(CPU,内存,硬盘,网络等)切割成多个虚拟的版本, 而后基于这些虚拟的硬件创建操做系统.安全
虚拟机创建的系统就像是正常的系统服务同样.bash
与虚拟机管理器不一样, Docker或者其余的容器引擎切割的是操做系统的资源, 例如进程的命名空间, 网络栈, 存储栈等等:服务器
每一个容器都有PID为1的进程, 每一个容器也都有本身的根文件系统(windows的C盘, linux的/).
因此docker能够称做是对针对操做系统的虚拟化操做, 它很是的轻量级.
能够举一些例子, 安装 sql server, mysql, mongodb, postgresql 等, 下载, 安装, 配置. 有的仍是挺麻烦的.
下面看看使用docker会怎么样, 首先须要安装docker.
安装Docker
Docker for windows 下载地址: https://store.docker.com/editions/community/docker-ce-desktop-windows
安装好docker后, 系统右下角托盘处会有docker的图标, 等到图标再也不闪烁了, 说明docker已经启动成功了.
右键点击图标有Settings.
能够经过命令行看一下docker的状态:
docker version
能够看到client是windows, server是linux(系统须要启用Hyper-V)虚拟机.
从Hyper-V管理器能够看到这个linux虚拟机:
使用Docker的例子: Postgresql
首先去 https://hub.docker.com/ 这里查找须要使用的软件, 例如postgresql : https://hub.docker.com/_/postgres/
从页面能够看到 postgres是docker官方承认的库. 页面的下方有使用说明等.
首先别忘了运行docker.
而后从docker hub下载postgres这个软件(应该叫image), 命令行执行:
docker pull postgres
下载的过程有时候比较慢, 尤为是在国内 (若是速度实在太慢, 那么可使用阿里云的容器镜像: https://dev.aliyun.com/search.html?spm=5176.1972343.0.1.340c5aaafU9rRJ):
等了一段时间以后, 下载完毕:
如今image已经下载了, 那么接下来就是须要经过某种方式运行这个image, 这就涉及到了container容器.
容器就像是一个已经安装好的软件, 它负责把这个image配置并安装好, 而后就能够运行这个安装好的postgresql了.
普通的软件安装好以后运行的是exe, 而这个运行的是容器, 容器里面是postgresql.
整个针对普通的软件安装的流程以下:
docker run 命令
docker run 这个命令会一次性执行上面整个流程.
注: 全部的docker命令都是以docker开头, 也就是调用docker程序. docker run xxx表示让docker运行某个image. 而后客户端就会经过API调用告诉服务端(Daemon守护进程, 它实现了Docker Remote Api或者叫Docker Engine Api). Daemon首先看看本地有没有这个image, 而后没找到这个image, 而后daemon就会从docker hub 拉取下来这个image到本地, 而后使用这个image来建立新的container.
下面执行docker run postgres:
能够看到postgresql已经运行起来了. 其内容和单独安装的postgresql运行起来是同样的.
使用 docker ps 命令查看正在运行的容器:
而后按照官方文档的命令使用psql去链接postgresql:
能够看到, 进入到psql环境了. 这个postgres和传统方式安装的postgresql功能是同样的.
写个postgresql命令试试:
docker exec 运行容器内的命令:
我电脑如今运行的是docker的linux容器, 因此可使用这个命令运行一下linux的bash:
首先使用docker ps命令查看正在运行的容器, 而后使用docker exec -it 08 bash执行ID为08开头的容器内的bash命令. -it表示交互模式.
而后使用ps -e查看该容器内的linux的进程, 里面有bash, 刚才启动运行的psql, ps.
退出
在交互模式下使用exit命令进行退出:
中止运行容器则须要使用docker stop 容器ID这个命令:
以上这些就是使用docker的缘由.......