docker
- 什么是docker:小海腾
- KVM、Xen、VMware、VirtualBox、Hyper-V
- VMM
- 容器技术:在计算机的世界中, 容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化 (hypervisor virtualization,HV)有所不同,管理程序虚拟化通过中间层将一台或者多台独立 的机器虚拟运行与物理硬件之上,而容器则是直接运行在操作系统内核之上的用户空间。因 此,容器虚拟化也被称为“操作系统级虚拟化”,容器技术可以让多个独立的用户空间运行 在同一台宿主机上。
- xwindows
- docker-ee:收费的
- docker-ce:免费的
- virtualenv :李想
- 如果现在有一个视频内容是一样的,但是格式不一样,那么怎么利用fastdfs的文件指纹
- fastdfs中拥有两个服务:
- tracker
- storage
docker特点
-
上手快:用户只需要几分钟,就可以把自己的程序“Docker 化”。Docker 依赖于“写时复制” (copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心所致,代码即改” 的境界;随后,就可以创建容器来运行应用程序了。大多数 Docker 容器只需要不到 1 秒中即可 启动。由于去除了管理程序的开销,Docker 容器拥有很高的性能,同时同一台宿主机中也 可以运行更多的容器,使用户尽可能的充分利用系统资源
-
职责的逻辑分类:使用 Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如 何管理容器。Docker 设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署 的生产环境一致性。从而降低那种“开发时一切正常,肯定是运维的问题(测试环境都是正 常的,上线后出了问题就归结为肯定是运维的问题)”
-
快速高效的开发生命周期:Docker 的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用 程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker 就像一个盒子,里面 可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒子中一件 件的取。)
-
鼓励使用面向服务的架构:Docker 还鼓励面向服务的体系结构和微服务架构。Docker 推荐单个容器只运行一个应 用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服 务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序 都变得非常简单,同时也提高了程序的内省性。(当然,可以在一个容器中运行多个应用程 序)
Docker客户端和服务器
- Docker 是一个客户端-服务器(C/S)架构程序。Docker 客户端只需要向 Docker 服务器 或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker 提供了 一个命令行工具 Docker 以及一整套 RESTful API。你可以在同一台宿主机上运行 Docker 守护 进程和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程
Docker镜像
- 镜像是构建 Docker 的基石。用户基于镜像来运行自己的容器,镜像也是 Docker 生命周 期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构 建出来。例如:
- 添加一个文件;
- 执行一个命令;
- 打开一个窗口。
- 也可以将镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新
Registry镜像注册
- Docker 用 Registry 来保存用户构建的镜像。
- Registry 分为公共和私有两种。Docker 公司 运营公共的 Registry 叫做 Docker Hub
- 用户可以在 Docker Hub 注册账号,分享并保存自己的 镜像(说明:在 Docker Hub 下载镜像巨慢,可以自己构建私有的 Registry)
Docker容器
- Docker 可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容 器即可
- 容器是基于镜像启动起来的,容器中可以运行一个或多个进程
- 我们可以认为,镜像是Docker生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。容器基于 镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务
- 安装好的一个虚拟机
Docker镜像
- Docker 把应用程序及其依赖,打包在 image 文件里面
- 只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例
- image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。举例来说,你可以在自己操作系统所使用的image 基础上,往里面加入 Apache 服务器,形成你的image
- 就是一个操作系统文件
Docker容器操作
创建容器
sudo docker run [option] 镜像名
-i 表示以“交互模式”运行容器
-t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。
–name 为创建的容器命名
-v 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录,即 宿主机目录:容器中目录),可以使 用多个-v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后 共享到容器上。
-d 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不 会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。
-p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p 做多个端口映射
-e 为容器设置环境变量
–network=host 表示将主机的网络环境映射到容器中,容器的网络与主机相同
停止或启动容器
docker container stop 容器名或ID
centos部署docker
- 安装docker
yum -y install yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 添加docker-repo源
yum install docker-ce
# 尝试安装docker-ce
yum erase docker-common-2:1.13.1-96.gitb2f74b2.el7.centos.x86_64
# 删除已安装的docker
安装 docker 时 yum报错 Error rpmdbopen failed 解决办法:
1. 进入报错目录, 查看相关rpmdb文件
[root ~]# cd /var/lib/rpm/
[root ~]# ls | grep 'db.'
__db.001
__db.002
__db.003
__db.004
2. 删除损坏的rpmdb文件
将原rpmdb文件都更名为结尾带.bak的文件
[root ~]# for i in `ls | grep 'db.'`;do mv $i $i.bak;done
或
[root ~]# rm -f __db.* # 清除原rpmdb文件
3. 重建rpm数据库
[root ~]# rpm --rebuilddb
4. 清除所有yum的缓存
[root ~]# yum clean all
- 开启docker服务
systemctl start docker
- 查看docker镜像
- REPOSITORY:镜像所在的仓库名称
- TAG:镜像标签
- IMAGEID:镜像ID
- CREATED:镜像的创建日期(不是获取该镜像的日期)
- SIZE:镜像大小
docker image ls
docker rm
- 拉取镜像及删除镜像
sudo docker image pull delron/fastdfs
FastDFS
- FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务
- FastDFS架构包括 Tracker server 和 Storage server。客户端请求Trackerserver进行过文件上传、下载
- 通过
Tracker server
调度最终由Storage server完成文件上传、下载
- 通过
- Tracker server
- 作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将tracker称为追踪服务器或 调度服务器
- Storage server
- 作用是文件存储,客户端上传的文件最终存储在Storage存储器上,Storageserver没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将storage称为存储服务器
就以拉取并使用FastDFS为例:
上面代码中,docker image pull是抓取 image 文件的命令。delron/fastdfs是 image 文件在仓库里面的位置,其中delron是 image 文件所在的组,fastdfs是 image 文件的名字
- 开启fastdfs的tracker服务
docker run -dti --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker
- 开启fastdfs的storage服务
docker run -dti --network=host --name storage -e TRACKER_SERVER=123.57.**.***:22122 -v /var/fdfs/storage:/var/fdfs delron/fastdfs storage
- 关闭docker容器
docker stop container_id
- 查看当前运行的容器
docker container ls
Fastdfs使用
python客户端
- 下载安装
fastdfs
的python
客户端
- windows兼容问题
解压下载好的压缩包,提取fdfs_client文件夹
- 将该文件夹放入python的三方包目录下
C:\Python37\Lib\site-packages
- 安装所需的两个额外模块
pip install mutagen
pip isntall requests
- 注释fdfs_client/storage_client.py文件中的第十二行
#from fdfs_client.sendfile import *
- 创建client.conf文件到django下
# project/client.conf
# connect timeout in seconds
# default value is 30s
connect_timeout=30
# network timeout in seconds
# default value is 30s
network_timeout=60
# the base path to store log files
base_path=\static #FastDFS客户端存放日志文件的目录
# tracker_server can ocur more than once, and tracker_server format is
# "host:port", host can be hostname or ip address
tracker_server=47.**.**.***:22122 #运行tracker服务的机器IP地址
#standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level=info
# if use connection pool
# default value is false
# since V4.05
use_connection_pool = false
# connections whose the idle time exceeds this time will be closed
# unit: second
# default value is 3600
# since V4.05
connection_pool_max_idle_time = 3600
# if load FastDFS parameters from tracker server
# since V4.05
# default value is false
load_fdfs_parameters_from_tracker=false
# if use storage ID instead of IP address
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# default value is false
# since V4.05
use_storage_id = false
# specify storage ids filename, can use relative or absolute path
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# since V4.05
storage_ids_filename = storage_ids.conf
#HTTP settings
http.tracker_server_port=80
#use "#include" directive to include HTTP other settiongs
##include http.conf
- 上传测试代码
#client.upload_by_filename(文件名)
#client.upload_by_buffer(文件bytes数据)
from fdfs_client.client import Fdfs_client
client = Fdfs_client("client.conf")
ret = client.upload_by_filename('123.jpg')
print(ret)
其中返回结果中的Remote file_id就是上传成功的保存文件名
{
'Group name': 'group1',
'Remote file_id': 'group1\\M00/00/00/rBEUWlz_HzSAPPzBAAQ2UAPajsU035.jpg',
'Status': 'Upload successed.',
'Local file name': '123.jpg',
'Uploaded size': '269.00KB',
'Storage IP': '123.57.61.168\x008'
}
Django
文件引擎
- 重构
django
文件上传引擎
存储类中必须实现_open()和_save()方法,以及任何后续使用中可能用到的其他方法。
_open(name, mode = ‘rb’)
:被Storage.open()
调用,在打开文件时被调用save(name, content)
:被Storage.save()
调用,name是传入的文件名,content
是Django
接收到的文件内容,该方法需要将content
文件内容保存。Django
会将该方法的返回值保存到数据库中对应的文件字段,也就是说该方法应该返回要保存在数据库中的文件名信息。exists(name)
:如果名为name
的文件在文件系统中存在,按返回True
,否则返回False
url(name)
:返回文件的完整访问URL
delete(name)
:删除name
文件listdir(path)
:列出指定路径的文件size(name)
:返回name
文件的总大小
from django.conf import settings
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
class FastDFSStroage(Storage):
"""定义FastDFS客户端类"""
def __init__(self, base_url = None, client_conf = None):
"""
初始化对象
:param base_url:
:param client_conf:
"""
if base_url is None:
base_url = settings.FDAS_URL
# 'http://47.***.**.***:8888'
self.base_url = base_url
if client_conf is None:
client_conf = settings.FDFS_CLIENT_CONF
# FDFS_CLIENT_CONF = os.path.join(BASE_DIR, 'client.conf')
self.client_conf = client_conf
def _open(self, name, mode = 'rb'):
"""
打开文件
:param name:
:param mode:
:return:
"""
pass
def _save(self, name, content):
"""
保存文件
:param name: 传入文件名
:param content: 文件内容
:return:保存到数据库中的FastDFSDE文件名
"""
client = Fdfs_client(self.client_conf)
ret = client.upload_by_buffer(content.read())
if ret.get("Status") != "Upload successed.":
raise Exception("upload file failed")
file_name = ret.get("Remote file_id")
return file_name
def exists(self, name):
"""
检查文件是否重复, FastDFS自动区分重复文件
:param name:
:return:
"""
return False
def url(self, name):
"""
获取name文件的完整url
:param name:
:return:
"""
return self.base_url + name
- 将文件引擎设置到settings中
#settings.py
DEFAULT_FILE_STORAGE = 'goods.views.FastDFSStorage'
- 上传成功后的访问地址
在服务器IP地址的
8888
端口,记得打开对应阿里云的端口规则
- 注意:在新版本的Remote file_id,由
\\
斜杠变为了/
['Remote file_id'].replace('\\','/')
我们需要的认知:
-
了解docker和kvm的区别
- docker的优势
- docker的缺点
- kvm的优点、缺点
-
了解fastdfs和ext4的区别
- fastdfs的优势在哪里,对比同类型文件系统