零、应用背景

先看下面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命令可以将容器发布成镜像,可以理解为 读写层的文件和镜像的文件合并成一个新的镜像。