- 为什么会有docker出现?
- docker能干什么?
docker 是基于go语言开发的云开源项目,通过对应用组件的封装,分发,部署,运行等生命周期的管理,使用户应用等及其运行环境能够做到一次封装,到处运行。实现跨平台、跨服务器。
image文件生成的容器实例,本身也是一个文件,称为镜像文件。
一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例。也就是我们的容器
至于仓库,就是放一堆镜像的地方。我们可以可以吧镜像发布到仓储中,也可以从中拉下来。
3.docker 是怎么工作的? 明白了 Docker 客户端与 Docker 服务器进行交互时, Docker 服务端负责构建、运行和分发 Docker 镜像。 也知道了 Docker 客户端和服务端可以运行在一台机器上,可以通过 RESTful 、 stock 或网络接口与远程 Docker 服务端进行通信。
Docker是一个cs结构的系统,docker的守护进程运行在主机上,通过socket从客户端访问。
我们从下图可以很直观的了解到Docker的架构:
Docker 采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 socket 或 REST API 与远程的服务器通信。
4.docker为什么比虚拟机快?? 1.Docker有着比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu、内存利用率上Docker将会在效率上有明显优势。
2.Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟。
命令:docker rmi -f $(docker images -aq)
docker run [参数] image
#参数说明
--name='name' 容器名字
-d 后台运行方式
-it 使用交互式方式运行
-p 容器端口,主机端口,容器端口,随机指定端口
docker start/stop/restart/kill 容器
查看日志:docker logs -f -t --tail id 具体查看相应文档
进入容器:docker exec -it 进入容器后开启一个新的终端
docker attach 进入容器正在执行的终端
5.容器数据卷
数据持久化,容器之间可以有一个数据共享技术。将容器内的目录挂在到linux上面。
-v
所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/..data
具名挂在可以方便找到我们的一个卷。卷名:卷内路径
匿名挂载, 卷内路径
6.dockerfile
就是用来构建docker镜像的构建文件,命令脚本,生成镜像,一个一个命令
mkdir 文件
vim 文件
FROM centos
VOLUME ["volume01","volume01"]
CMD echo "---end---"
CMD /bin/bash
docker build -f 文件路径 -t 镜像名/文件名:版本 .
docker run运行镜像
docker push
6.docker file指令:
maintainer:名字+邮箱
run
add 添加内容
workdir: 工作目录
volume :挂载目录
expose:端口配置
....
7.docker网络
我们每启动一个docker容器,docker就会给docker容器分配一个ip。
这个容器的网卡都是一对对的。
evth-pair就是一堆的虚拟设备接口,我们都是成对出现的,一段连着协议,一段彼此相连
evth-piar作为桥梁,连接各种虚拟网络设备。
docker中的所有的网络接口都是虚拟的,虚拟的转发效率搞,只要容器删除,对应网络一堆就没有了
--link:解决网络连通问题,ip换掉。 不建议使用,使用自定义网络
8.自定义网络
docker network --help
docker network ls
--net bridge命令
需要跨网络操作别人,需要使用docker network connect
9.docker compose
批量容器编排。
这里docker的提升就不一一介绍了,不是专业的运维工程师,哈哈
- web与模型服务对接逻辑
学习线上使用、部署模型的流程
掌握深度学习模型的部署框架
Tensorflow serving是一个灵活的高性能服务系统,适用于机器学习模型,专为生产环境而设计。可以轻松部署服务器新算法和实验,同事保存相同的服务器架构和API。
docker run -p 8500:8500
--mount type=bind,source=/home/huzhihao/projects/EAST/models,target=/models
-t --entrypoint=tensorflow_model_server tensorflow/serving:latest-gpu
--port=8500 --per_process_gpu_memory_fraction=0.5
--enable_batching=true --model_name=east -- model_base_path=/models/east_model & 这里解释一下各个参数的意义:
-p 8500:8500 :指的是开放8500这个gRPC端口。
--mount type=bind, source=/your/local/model, target=/models:把你导出的本地模型文件夹挂载到docker container的/models这个文件夹,tensorflow serving会从容器内的/models文件夹里面找到你的模型。
-t --entrypoint=tensorflow_model_server tensorflow/serving:latest-gpu:如果使用非devel版的docker,启动docker之后是不能进入容器内部bash环境的,
--entrypoint的作用是允许你“间接”进入容器内部,然后调用tensorflow_model_server命令来启动TensorFlow Serving,这样才能输入后面的参数。紧接着指定使用tensorflow/serving:latest-gpu 这个镜像,可以换成你想要的任何版本。
--port=8500:开放8500这个gRPC端口(需要先设置上面entrypoint参数,否则无效。下面参数亦然)
--per_process_gpu_memory_fraction=0.5:只允许模型使用多少百分比的显存,数值在[0, 1]之间。
--enable_batching:允许模型进行批推理,提高GPU使用效率。
--model_name:模型名字,在导出模型的时候设置的名字。
--model_base_path:模型所在容器内的路径,前面的mount已经挂载到了/models文件夹内,这里需要进一步指定到某个模型文件夹,例如/models/east_model指的是使用/models/east_model这个文件夹下面的模型。
当你想把本地文件夹里面的文件复制到容器内部的某个文件夹内,可以使用docker cp命令:
sudo docker cp /your/local/file YOUR_CONTAINER_ID:/your/container/dir
这里的YOUR_CONTAINER_ID可以在你的容器命令行终端里面,root@后面接的一串英文数字组合就是你的container id,如root@dc238c481f14:,“dc238c481f14”就是容器id。
当你一切设置妥当后,此时如果直接exit退出容器会导致你所做的一切改动都会全部消失! 必须先commit一下你的新镜像,保存下来(注意以下命令不要在容器内部的shell执行,新开一个命令行):
docker commit $(docker ps --last 1 -q) YOUR_IMAGE_NAME:VERSION
YOUR_IMAGE_NAME:VERSION就是你想改的镜像名:版本号了,完成后输入sudo docker images就能看到你的新镜像了,此时你就可以容器内部输入exit来退出你的容器。
TensorFlow serving部署模型:
首先训练生成模型
安装部署TensorFlow serving
在docker启动TensorFlow serving容器
docker run -p 8500:8500 --mount type=bind,source=/user/local/test,target=/models/test -e MODEL_NAME=test -t tensorflow/serving &
执行测试Python文件
部署机器学习的模型: