1:Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

2:沙箱

Sandboxie(又叫沙箱、沙盘)即是一个虚拟系统程序,允许你在沙盘环境中运行浏览器或其他程序,因此运行所产生的变化可以随后删除。它创造了一个类似沙盒的独立作业环境,在其内部运行的程序并不能对硬盘产生永久性的影响。其为一个独立的虚拟环境,可以用来测试不受信任的应用程序或上网行为。

GreenBorder为IE和firefox构建了一个安全的虚拟执行环境。用户通过浏览器所作的任何写磁盘操作,都将重定向到一个特定的临时文件夹中。这样,即使网页中包含病毒,木马,广告等恶意程序,被强行安装后,也只是安装到了临时文件夹中,不会对用户pc造成危害。(这里的临时文件夹就是一个沙箱)

3:一个完整的Docker有以下几个部分组成:

dockerClient客户端

DockerDaemon守护进程

DockerImage镜像

DockerContainer容器

Docker由镜像(Image)、容器(Container)、仓库(Repository)三大核心组成。

4:LXC

LinuxContainer容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。

5:

一款开源软件能否在商业上成功,很大程度上依赖三件事- 成功的 usercase(用例), 活跃的社区和一个好故事。dotCloud 自家的 PaaS产品建立在docker之上,长期维护且有大量的用户,社区也十分活跃,接下来我们看看docker的故事。

环境管理复杂- 从各种OS到各种中间件到各种app,一款产品能够成功作为开发者需要关心的东西太多,且难于管理,这个问题几乎在所有现代IT相关行业都需要面对。

云计算时代的到来- AWS的成功,引导开发者将应用转移到 cloud上,解决了硬件管理的问题,然而中间件相关的问题依然存在(所以openstackHEAT和 AWS cloudformation都着力解决这个问题)。开发者思路变化提供了可能性。

虚拟化手段的变化- cloud时代采用标配硬件来降低成本,采用虚拟化手段来满足用户按需使用的需求以及保证可用性和隔离性。然而无论是KVM还是Xen在docker看来,都在浪费资源,因为用户需要的是高效运行环境而非OS,GuestOS既浪费资源又难于管理,更加轻量级的LXC更加灵活和快速

LXC的移动性- LXC在 linux2.6 的 kernel里就已经存在了,但是其设计之初并非为云计算考虑的,缺少标准化的描述手段和容器的可迁移性,决定其构建出的环境难于迁移和标准化管理(相对于KVM之类image和snapshot的概念)。docker就在这个问题上做出实质性的革新。这是docker最独特的地方。

6:

Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。 Docker容器通过 Docker镜像来创建。容器(对象)与镜像(类)的关系类似于面向对象编程中的对象与类.。

Docker采用C/S架构 Dockerdaemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。客户端和服务端既可以运行在一个机器上,也可通过socket 或者RESTfulAPI 来进行通信。Dockerdaemon 一般在宿主主机后台运行,等待接收来自客户端的消息。Docker客户端则为用户提供一系列可执行命令,用户用这些命令实现跟Docker daemon 交互。

7:理解应用程序的迁移过程

参考:https://baike.baidu.com/item/Docker/13344470?fr=aladdin

一般来说,应用程序都是复杂的,它们都有很多的组件。例如,大多数应用程序都需要数据库或中间件服务的支持以实现对数据的存储、检索和集成。所以,需要通过设计和部署把这些服务拆分成为它们自己的容器。如果一个应用程序能够被拆分成为越多的分布式组件,那么应用程序扩展的选择则越多。但是,分布式组件越多也意味着管理的复杂性越高。

8:使用


这个只是用docker封装了一下django:

简单例子

安装docker:yuminstall docker-engine

...docker-v,service docker stauts

创建镜像:dockerbuild -t image-name basedir

创建容器:dockerrun -d --name container-name -p 0.0.0.0:9988:9977 image-name

删除镜像: dockerrmi image_name(image_id)

删除容器: dockerrm container_name(container_id)

进入容器内部:dockerexec -it 【container id】/bin/sh(之后和系统一样,exit退出)

打印容器日志:dockerlogs acc_c

-d:表示后台进程进行

-p:端口映射:容器端口9977映射到宿主机端口99

docker ps:查看有哪些容器

docker stop nginx:停止nginx

9:编写dockerFile

Dockerfile一般包含下面几个部分:

基础镜像:以哪个镜像作为基础进行制作,用法是FROM基础镜像名称

维护者信息:需要写下该Dockerfile编写人的姓名或邮箱,用法是MANITAINER名字/邮箱

镜像操作命令:对基础镜像要进行的改造命令,比如安装新的软件,进行哪些特殊配置等,常见的是RUN命令

容器启动命令:当基于该镜像的容器启动时需要执行哪些命令,常见的是CMD命令或ENTRYPOINT

Dockerfile中的#标志后面为注释。

其中FROM指定基础镜像,如果镜像名称中没有制定TAG,默认为latest。RUN命令默认使用/bin/shShell执行,默认为root权限。如果命令过长需要换行,需要在行末尾加\。CMD命令也是默认在/bin/sh中执行,并且默认只能有一条,如果是多条CMD命令则只有最后一条执行。用户也可以在dockerrun命令创建容器时指定新的CMD命令来覆盖Dockerfile里的CMD。

#一个简单的Dockerfile

FROM centos

MAINTAINERpercy <1372254949@qq.com>

RUNmkdir -p -m 755 /var/www/config

#切换工作目录

WORKDIR /var/www/config

#安装服务

RUN yum update -y

#installpip,万一没有pip呢,epel-release是pip的依赖

RUN yum install -y epel-release

RUN yum install -y python-pip gcc

RUN yum install -y crontabs

#pipinstall,信任主机—trusted-host,requirements.txt的作用的一个体现

RUN pip install –upgrade pip

ADD requirements.txt /var/www

RUNpip install -i http://pypi.mirrors.ustc.edu.cn/simple–trusted-host http://pypi.mirrors.ustc.edu.cn/simple–upgrade pip

RUNpip install -i http://pypi.mirrors.ustc.edu.cn/simple–trusted-host http://pypi.mirrors.ustc.edu.cn/simplepip

RUN pip install -i http://pypi.mirrors.ustc.edu.cn/simple–trusted-host http://pypi.mirrors.ustc.edu.cn/simple-r /var/www/requirements.txt

#clean

RUN rm -rf /var/cache/yum

RUN rm -f /var/www/requirements.txt

#将宿主机上当前目录(这里的当前目录是项目的根目录),拷贝到镜像的/var/www/config/

前面是宿主机的目录,后面是docker的目录。

ADD ./ /var/www/config

#提供给容器间互联使用

EXPOSE 9977

#如果只是看容器启动成功么有,可以在这里将启动命令注释掉,然后进入容器去启动应用。

#这里的run.sh是docker里的文件,由于之前设置当前工作目录为/var/www/config/而run.sh就在这个目录下,所以这样写。

CMD["/bin/bash", "run.sh"]