零、应用背景
先看下面2个问题:
1. 单机多系统。如:windows上跑linux、VPS服务、PaSS服务。
windows上跑linux,一般用VM技术实现。
VPS提供商需要将一台机器划分成多个虚拟机,提供给用户,例如将一台8核16G的物理机器划分成8个1核2G(实际上会比这个少)给8个用户使用,目的是实现用户应用隔离。
PaSS服务提供商同VPS。
问题关键:模拟操作系统、用户应用分隔。
2. 应用发布。
为了减少bug出现,要尽量使开发环境和生产环境一样。
比如开发环境采用的是centos6.5 + nginx1.10.2 + php 5.6 + mysql 5.5,那么生产环境就要采取一样的软件环境。如果开发环境做了修改,生产环境最好做一样的修改(主要指安装插件,系统软件版本升级)。
问题关键:环境同步
一、Docker和VM
VM可以很好的解决模拟操作系统、用户应用分隔这两个问题。
Docker可以比VM更好的解决这两个问题 并且 解决环境同步问题。
相比VM,Docker是轻量级的,快速的。
二、Docker的镜像和容器
Docker如何实现VM的功能?使用静态镜像 + 一个动态读写层
从docker的使用方法来看,例如我们想在docker中运行nginx服务。
我们两个思路:
1. 先pull一个centos镜像,再在该镜像上装一个nginx。
2. 直接pull装好nginx的镜像
镜像是容器的运行环境
如果我们采取思路1,pull下一个centos镜像
# docker pull centos
docker的镜像由name:tag组成,上面的命令等价于下载最新的centos
# docker pull centos:latest
如果想下载centos6.8,则可以运行
# docker pull centos:6.8
使用run命令运行一个镜像:
# docker run -it centos /bin/bash
该命令会用centos这个镜像去创建一个容器,相当于在VM里面用镜像创建了一个虚拟机,通过docker ps -a可以看到所有容器。
细心的朋友会发现系统提示符变了,这是因为-it参数,使得容器内部的shell输入输出和当前主机挂钩了,叫做attach。
在容器内部的所有操作只在容器内有效,不会影响宿主主机,也不会影响镜像,因为所有的操作都会作用在读写层上。
如果下次要使用怎么办?可以用docker ps -a找到这个容器的id,使用docker start CONTAINER_ID 运行这个容器,当然上次安装的nginx还在。
如果把这个容器当做开发环境,部署的时候可以采取非常简单的方法,将这个容器发布成镜像即可,在生产环境中导入这个镜像,即可实现环境同步。
docker commit命令可以将容器发布成镜像,可以理解为 读写层的文件和镜像的文件合并成一个新的镜像。