docker(容器技术)是实现虚拟化技术的一种方案,经过利用linux中命名空间,控制组和联合文件系统这个三个主要技术,来实现应用程序空间的隔离.经过对应用程序运行环境的封装来生成镜像并部署来实现跨平台,必定程度上加快了服务交付的总体流程.这篇文章主要介绍docker的一些基本概念来对容器技术有个简单的认识.python
经过NameSpace技术能够修改容器的视图.linux
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);
复制代码
在linux中能够经过系统调用clone来建立新的进程,当第三个参数flags指定CLONE_NEWNS就会在新的namespace下启动新进程.
在上面的例子中系统自己有已经运行的不少进程,经过运行镜像而且执行bin/sh进程能够进入容器的交互界面.在容器中只能看到root进程和ps进程.这样经过namespace技术就实现了不一样进程间的隔离.nginx
namespace建立的进程与其余进程以前对主机的资源是竞争关系的.Linux Control Group技术就是限制进程组可以使用资源上限的一种技术.经过对容器使用资源的上线进行设置能有效地使用主机的资源和防止资源的过渡占用.redis
联合文件系统能够同时挂载不一样的实际文件或者目录到同一目录.Docker基于联合文件系统提出AUFS(Advanced Union File System).AUFS经过将更新挂载到老的文件之上,来实现文件的保存修改.(空间的减小).docker
镜像是封装了虚拟环境的运行内容的文件包,docker经过利用AUFS实现了增量的镜像结构.flask
容器是隔离的虚拟环境,里面运行着docker镜像.容器有如下的几种状态:bash
状态 | 含义 |
---|---|
Created | 容器已经被建立资源已经就绪,应用程序未运行 |
Running | 容器中的应用容器处于运行中 |
Paused | 容器暂停 |
Stopped | 容器中止 |
Deleted | 容器被删除,占有的资源以及资源的的管理信息已经被删除 |
docker运行时的持久化目录,经过将外部目录挂载到容器中,来实现数据的持久化.app
docker engine是负责启动镜像的服务,经过docker client提供的指令调用docker server提供的接口来实现对镜像和容器的操做.学习
docker run --name nginx -p 80:80 -d nginx // --name 执行容器名 -p 宿主端口:容器端口 将宿主端口映射到容器的端口 -d 后台的方式启动
docker run --name myredis redis
docekr run --name test --link myredis:redis debian // --link Container:Alias 目标容器的名称:目标容器的别名 创建容器之间的连接
复制代码
docker ps -a // 查看全部的容器
docker images // 查看全部本地镜像
docker stop name/ID // 中止某个容器
docker rm name/ID // 删除某个容器
docker rm $(docker ps -aq) // 删除全部容器
docker rmi $(docker images -q) // 删除全部本地镜像
复制代码
建立一个目录结构以下:
在index.py中编写程序的主要功能以下:ui
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello world\n'
if __name__ == '__main__':
app.run(debug=True,host="0.0.0.0") // 建立一个服务 在/路径下返回Hello world
复制代码
镜像的构建能够经过Dockerfile和构建环境的上下文来完成.经过Dockerfile能够将镜像的构建过程持久化.
From python:3.4 // 从某一个基础镜像开始 From语句必须是Dockerfile的第一条语句
Run pip install Flask==0.10.1 // 执行指定的指令 因为每次执行的执行都会行成新的镜像层,能够将多个指令进行合并
WORKDIR /app // 执行Dockerfile指令执行的工做目录
COPY app /app // src dest 这个指令将上下文的app目录复制到容器的app目录
CMD python index.py // 容器启动时执行的指令
复制代码
docker build -t hello . //在当前目录的上下文上构建镜像
docker run --name haha -p 5000:5000 helloworld // 以haha容器名字启动helloword镜像 而且将容器的5000端口映射到外部的5000端口
复制代码
欢迎你们关注个人公众号,一块儿学习