<commit_before># 在centos7上构建基于docker的应用
---
###这篇文稿主要分两部份,一部份以ppt为原形,相对原ppt,把一些讲的东西细化进这个文稿里,
另一部份则以fanli网web服务器的构建来说明我们如何把docker应用到当前系统架构中.


####此稿重讲述
   * [1.为什么要尝试docker](#why)
   * [2.docker及容器虚拟化和传统虚拟化的区别](#dockervsvm)
   * [3.安装体验](#install)
   
   
   * [2.基本网络架构](#netarch)
   * [3.base镜像构建](#base)
   * [2.网络问题](#network)
   * [3.容器构建及文件共享](#build)
   * [4.应用配置变更后的自动刷新](#app)
   * [5.日志管理](#log)

<a name="why"/>
#### 一.为什么要尝试docker
  目前是为了解决生产环境以虚拟机为单位的phpweb 服务集群横向扩展成本过高的问题.将来会逐渐影响我们内网的开发环境,和生产的应用部署流程和架构.
  
<a name="dockervsvm"/> 
#### 二.docker及容器虚拟化和传统虚拟化的区别

Docker 是一套管理容器虚拟化的工具套件,或者是一套基于容器虚拟化技术实现的容器虚拟化解决方案.主要解决app的构建和-发布-和运行(build->ship-> run)  

更多更专业的解释: 请参考: 

* [1. basics-docker-containers-hypervisors-coreos](http://etherealmind.com/basics-docker-containers-hypervisors-coreos/  
)
* [2. Understanding Docker](https://docs.docker.com/introduction/understanding-docker/#how-does-a-docker-image-work 
)


Container(容器)虚拟化：
基于OS的系统级虚拟化，需内核支持，其原理是将系统资源按照类型和需求分割给多个对象且相互隔离对像使用,比如 linux Container虚拟化是基于cgroup 和namespace 

(Hypervisor) VM虚拟化是基于硬件层面的虚拟化技术, 有三种：全虚拟化、半虚拟化. 
硬件虚拟化,全虚拟化由Hypervisor截获并翻译所有虚拟机特权指令；半虚拟化通过修改虚拟机内核，将部分特权指令替换成与Hypervisor通信;硬件虚拟化借助服务器硬件虚拟化功能，不需要截获虚拟机特权指令，虚拟机也不需要修改内核（比如Intel VT和AMD-V）

摘录一段来自 [basics-docker-containers-hypervisors-coreos](http://etherealmind.com/basics-docker-containers-hypervisors-coreos/)  (此文件基本上是公认的写得比较好的basics docker vs hypervisors 的文章了)

```

Hypervisors virtualize at the hardware level,Containers virtualize at the operating system level

Hypervisors abstract the operating system from hardware, containers abstract the application from the operation system.

Hypervisors consumes storage space for each instance,Containers use a single storage space plus smaller deltas for each layer and thus are much more efficient.

Hypervisors boot according to the OS typically 20 seconds, depending on storage speed
Containers can boot and be application-ready in less than 500ms and creates new designs opportunities for rapid scaling. 

Hypervisors have lower quality APIs that have limited cloud orchestration value,Containers have built-in and high value APIs for cloud orchestration. 

```

	  
![Alt text](imgs/dockervsvm.png)
	 


关于docker的其它需要了解的:

* 1.docker不是谁的替代者,相比vm他们有各自己的优劣.
* 2.当然针对docker本身来说,它还有很多方面不成熟,比如docker的网络目前仍倾向于单机模式,所以默认情况下他的网络不能很好的容合进当前的网络架构中,尤其针对docker的多主机网络互通,目前仍没有一个得到管方很认可的方案,将来可能会和openvswith 方面做些整合工作,所以如果你业务场景比较复杂,想顺利的融合docker,这个仍需要开发运维做很多工作
* 3.安全问题 相对传统的虚拟机,容器技术从安全的角度上来说也要弱于虚拟机,一是公用内核,另一个是缺少一层中间代理,当然安全这个话题本身就是相对的,所以这里不说
    
<a name="install">
####三. 安装体验
基于官方建义,linux 内核要在3.8以上, 且 3.10.x 建义 ,所以os我们就只接用centos7 了,但是centos6.5 以上也是可以玩的,只是会缺少一些特性而已,所以具体
1.安装
   yum install docker -y

2.启动: 
   service docker start ;

3.确认启动:
   docker info

更多操作系级及安装细节  https://docs.docker.com/installation/ 

##### 1. 基本元素

* 镜像: 一个只读的系统模版,基本上就是一个关了机的虚拟机
* 容器: 基于镜像起动的一个”虚拟机”
* 仓库: 存放和索引镜像

2.基本命令,基本命令分为三大块

* 镜像管理 ,列出已有镜像,创建和删除镜像等
* 容器运行 创建启动关闭等
* 信息显示  列出在运行的实例,实例的具体信息等

3.命令详细列表

* [`docker images`](http://docs.docker.io/reference/commandline/cli/#images) shows all images.
* [`docker import`](http://docs.docker.io/reference/commandline/cli/#import) creates an image from a tarball.
* [`docker build`](http://docs.docker.io/reference/commandline/cli/#build) creates image from Dockerfile.
* [`docker commit`](http://docs.docker.io/reference/commandline/cli/#commit) creates image from a container.
* [`docker rmi`](http://docs.docker.io/reference/commandline/cli/#rmi) removes an image.

----
* [`docker run`](http://docs.docker.io/reference/commandline/cli/#run) creates and starts a container in one operation.
* [`docker stop`](http://docs.docker.io/reference/commandline/cli/#stop) stops it.
* [`docker start`](http://docs.docker.io/reference/commandline/cli/#start) will start it again.
* [`docker restart`](http://docs.docker.io/reference/commandline/cli/#restart) restarts a container.
* [`docker rm`](http://docs.docker.io/reference/commandline/cli/#rm) deletes a container.
* [`docker kill`](http://docs.docker.io/reference/commandline/cli/#kill) sends a SIGKILL to a container.
* [`docker attach`](http://docs.docker.io/reference/commandline/cli/#attach) will connect to a running container.

----
* [`docker ps`](http://docs.docker.io/reference/commandline/cli/#ps) shows running containers.
* [`docker inspect`](http://docs.docker.io/reference/commandline/cli/#inspect) looks at all the info on a container (including IP address).
* [`docker logs`](http://docs.docker.io/reference/commandline/cli/#logs) gets logs from container.
* [`docker top`](http://docs.docker.io/reference/commandline/cli/#top) shows running processes in container.

`docker ps -a` shows running and stopped containers.

---

#### 2. Dockerfile
Docker can build images automatically by reading the instructions from a Dockerfile. A Dockerfile is a text document that contains all the commands you would normally execute manually in order to build a Docker image. 

https://docs.docker.com/reference/builder/ 

####3.logs,data,volumes,network
容器化虚拟机的基本系统可以是只读的,多次复用的,所以app产生的数据一般都是通过卷共享的方式存在于基本系统之外的.这些数据包括Logs,私有数据及共享数据的存储,主要是通过volumes mount来实现.


#####4. docker 网络及我们的实现

Docker 的成熟的网络解决方案仍处在发展期,就目前来说仍然没有最优化的使用方法和最佳实践,所以这个问题得分解着去了解,主要是下面几个问题,主些问题目前都有解决方法,如如果展开来讲又会是一个很大的话题,所以这里不展开太多.

* 容器和宿主机的通信
* 容器和容器间的通信
* 容器和宿主机以外的网络通信
* 宿主机以外的网络和容器通信 

[docker 网络](https://docs.docker.com/articles/networking/)


<a name="netarch">	
####2. 基本架构
   我们的web服务器包括phpweb和javaweb 等相对来说没有复杂的网络场景,但是对于我们来phpweb来说主动流出的流量可能大于主动流进的流量,所以为了谨慎也为了更好的融合进当前的系统架构,所以我们还是需要做一些调整,基本架构请看数据流赂示意图

#####数据流向示意图(系统架构图)
![Alt text](imgs/docker-network-traffice.png "docker-network-traffice")

---

#####网络连接示意图
针对我们当前的架构,我们采用macvlan bridge + staticip 的方式,如下图,macvlan的桥接网络性能除了passthou以外应该是最接近物理网卡的性能了,不过网上也有人评测说用openswith的桥接性能会更优一些,为了简化,这个我们可能会考虑测试下.
![Alt text](imgs/docker.with.macvlan.png "docker with macvlan")

<a name="base"/>
####二. 基本镜像构建
   
操作系统版本及基本镜像系统版本:

&#8195;&#8195;目前我们使用的所有应用都是基于centos6.3,但基于最近的一次glib库的bug,所以我们把centos更新到了6.5,又基于之前的各种对os的优化对容器应用来说其实无意义,所以放弃自己构建基本系统镜像,转而使用centos官方,好处是管方更新快镜像有针对容器应用做了相应的调整. 
    
    git pull centos:6
	  
2.使用Dockerfile构健应用镜像

  Dockerfile的作用类似于shell 脚本,让特定的过程按按特定的方式走(workflow).简单说确保每一次stage过程.都一样.<commit_msg>	modified:   createcontainer.md<commit_after># 在centos7上构建基于docker的应用
---
###这篇文稿主要分两部份,一部份以ppt为原形,相对原ppt,把一些讲的东西细化进这个文稿里,
另一部份则以fanli网web服务器的构建来说明我们如何把docker应用到当前系统架构中.


####此稿重讲述
   * [1.为什么要尝试docker](#why)
   * [2.docker及容器虚拟化和传统虚拟化的区别](#dockervsvm)
   * [3.安装体验](#install)
   
   
   * [2.基本网络架构](#netarch)
   * [3.base镜像构建](#base)
   * [2.网络问题](#network)
   * [3.容器构建及文件共享](#build)
   * [4.应用配置变更后的自动刷新](#app)
   * [5.日志管理](#log)

<a name="why"/>
#### 一.为什么要尝试docker
  目前是为了解决生产环境以虚拟机为单位的phpweb 服务集群横向扩展成本过高的问题.将来会逐渐影响我们内网的开发环境,和生产的应用部署流程和架构.
  
<a name="dockervsvm"/> 
#### 二.docker及容器虚拟化和传统虚拟化的区别

Docker 是一套管理容器虚拟化的工具套件,或者是一套基于容器虚拟化技术实现的容器虚拟化解决方案.主要解决app的构建和-发布-和运行(build->ship-> run)  

更多更专业的解释: 请参考: 

* [1. basics-docker-containers-hypervisors-coreos](http://etherealmind.com/basics-docker-containers-hypervisors-coreos/  
)
* [2. Understanding Docker](https://docs.docker.com/introduction/understanding-docker/#how-does-a-docker-image-work 
)


Container(容器)虚拟化：
基于OS的系统级虚拟化，需内核支持，其原理是将系统资源按照类型和需求分割给多个对象且相互隔离对像使用,比如 linux Container虚拟化是基于cgroup 和namespace 

(Hypervisor) VM虚拟化是基于硬件层面的虚拟化技术, 有三种：全虚拟化、半虚拟化. 
硬件虚拟化,全虚拟化由Hypervisor截获并翻译所有虚拟机特权指令；半虚拟化通过修改虚拟机内核，将部分特权指令替换成与Hypervisor通信;硬件虚拟化借助服务器硬件虚拟化功能，不需要截获虚拟机特权指令，虚拟机也不需要修改内核（比如Intel VT和AMD-V）

摘录一段来自 [basics-docker-containers-hypervisors-coreos](http://etherealmind.com/basics-docker-containers-hypervisors-coreos/)  (此文件基本上是公认的写得比较好的basics docker vs hypervisors 的文章了)

```

Hypervisors virtualize at the hardware level,Containers virtualize at the operating system level

Hypervisors abstract the operating system from hardware, containers abstract the application from the operation system.

Hypervisors consumes storage space for each instance,Containers use a single storage space plus smaller deltas for each layer and thus are much more efficient.

Hypervisors boot according to the OS typically 20 seconds, depending on storage speed
Containers can boot and be application-ready in less than 500ms and creates new designs opportunities for rapid scaling. 

Hypervisors have lower quality APIs that have limited cloud orchestration value,Containers have built-in and high value APIs for cloud orchestration. 

```

	  
![Alt text](imgs/dockervsvm.png)
	 


关于docker的其它需要了解的:

* 1.docker不是谁的替代者,相比vm他们有各自己的优劣.
* 2.当然针对docker本身来说,它还有很多方面不成熟,比如docker的网络目前仍倾向于单机模式,所以默认情况下他的网络不能很好的容合进当前的网络架构中,尤其针对docker的多主机网络互通,目前仍没有一个得到管方很认可的方案,将来可能会和openvswith 方面做些整合工作,所以如果你业务场景比较复杂,想顺利的融合docker,这个仍需要开发运维做很多工作
* 3.安全问题 相对传统的虚拟机,容器技术从安全的角度上来说也要弱于虚拟机,一是公用内核,另一个是缺少一层中间代理,当然安全这个话题本身就是相对的,所以这里不说
    
<a name="install">
####三. 安装体验
基于官方建义,linux 内核要在3.8以上, 且 3.10.x 建义 ,所以os我们就只接用centos7 了,但是centos6.5 以上也是可以玩的,只是会缺少一些特性而已,所以具体
1.安装
   yum install docker -y

2.启动: 
   service docker start ;

3.确认启动:
   docker info

更多操作系级及安装细节  https://docs.docker.com/installation/ 

##### 1. 基本元素

* 镜像: 一个只读的系统模版,基本上就是一个关了机的虚拟机
* 容器: 基于镜像起动的一个”虚拟机”
* 仓库: 存放和索引镜像

2.基本命令,基本命令分为三大块

* 镜像管理 ,列出已有镜像,创建和删除镜像等
* 容器运行 创建启动关闭等
* 信息显示  列出在运行的实例,实例的具体信息等

3.命令详细列表

* [`docker images`](http://docs.docker.io/reference/commandline/cli/#images) shows all images.
* [`docker import`](http://docs.docker.io/reference/commandline/cli/#import) creates an image from a tarball.
* [`docker build`](http://docs.docker.io/reference/commandline/cli/#build) creates image from Dockerfile.
* [`docker commit`](http://docs.docker.io/reference/commandline/cli/#commit) creates image from a container.
* [`docker rmi`](http://docs.docker.io/reference/commandline/cli/#rmi) removes an image.

----
* [`docker run`](http://docs.docker.io/reference/commandline/cli/#run) creates and starts a container in one operation.
* [`docker stop`](http://docs.docker.io/reference/commandline/cli/#stop) stops it.
* [`docker start`](http://docs.docker.io/reference/commandline/cli/#start) will start it again.
* [`docker restart`](http://docs.docker.io/reference/commandline/cli/#restart) restarts a container.
* [`docker rm`](http://docs.docker.io/reference/commandline/cli/#rm) deletes a container.
* [`docker kill`](http://docs.docker.io/reference/commandline/cli/#kill) sends a SIGKILL to a container.
* [`docker attach`](http://docs.docker.io/reference/commandline/cli/#attach) will connect to a running container.

----
* [`docker ps`](http://docs.docker.io/reference/commandline/cli/#ps) shows running containers.
* [`docker inspect`](http://docs.docker.io/reference/commandline/cli/#inspect) looks at all the info on a container (including IP address).
* [`docker logs`](http://docs.docker.io/reference/commandline/cli/#logs) gets logs from container.
* [`docker top`](http://docs.docker.io/reference/commandline/cli/#top) shows running processes in container.

`docker ps -a` shows running and stopped containers.

---

#### 2. Dockerfile
Docker can build images automatically by reading the instructions from a Dockerfile. A Dockerfile is a text document that contains all the commands you would normally execute manually in order to build a Docker image. 

https://docs.docker.com/reference/builder/ 

####3.logs,data,volumes,network
容器化虚拟机的基本系统可以是只读的,多次复用的,所以app产生的数据一般都是通过卷共享的方式存在于基本系统之外的.这些数据包括Logs,私有数据及共享数据的存储,主要是通过volumes mount来实现.


#####4. docker 网络及我们的实现

Docker 的成熟的网络解决方案仍处在发展期,就目前来说仍然没有最优化的使用方法和最佳实践,所以这个问题得分解着去了解,主要是下面几个问题,这些问题目前都有解决方法,如果展开来讲又会是一个很大的话题,所以这里不展开太多.

* 容器和宿主机的通信
* 容器和容器间的通信
* 容器和宿主机以外的网络通信
* 宿主机以外的网络和容器通信 

[docker 网络](https://docs.docker.com/articles/networking/)

----

 我们的web服务器包括phpweb和javaweb等相对来说没有很复杂的网络场景,但是phpweb的主动流出的流量可能大于主动流进的流量,所以为了谨慎也为了更好的融合进当前的系统架构,所以我们采用macvlan bridge + staticip 的方式.
 
 macvlan的桥接网络性能除了passthou以外应该是最接近物理网卡的性能了,不过网上也有人评测说用openswith的桥接性能会更优一些,我们没有去测,目前我们为了降低docker使用和融合的的复杂性,暂时这个处于了解阶段.
 
 所以基本网络架构及连接图如下:
 ![Alt text](imgs/docker.with.macvlan.png "docker with macvlan")

<a name="netarch">	
#####数据流向示意图(系统架构图)
![Alt text](imgs/docker-network-traffice.png "docker-network-traffice")

---


<a name="base"/>
####二. 基本镜像构建
   
操作系统版本及基本镜像系统版本:

&#8195;&#8195;目前我们使用的所有应用都是基于centos6.3,但基于最近的一次glib库的bug,所以我们把centos更新到了6.5,又基于之前的各种对os的优化对容器应用来说其实无意义,所以放弃自己构建基本系统镜像,转而使用centos官方,好处是管方更新快镜像有针对容器应用做了相应的调整. 
    
    git pull centos:6
	  
2.使用Dockerfile构健应用镜像

  Dockerfile的作用类似于shell 脚本,让特定的过程按按特定的方式走(workflow).简单说确保每一次stage过程.都一样.
{'fraction_non_alphanumeric': 0.12296403805837768, 'fraction_numerical': 0.008305112078696985, 'mean_word_length': 5.773894046968869, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 17, 'https://': 8, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1023765', 'n_tokens_mistral': 6522, 'n_tokens_neox': 7031, 'n_words': 800}