docker容器

398 阅读3分钟
  1. 为什么会有docker出现?
  2. docker能干什么?

docker 是基于go语言开发的云开源项目,通过对应用组件的封装,分发,部署,运行等生命周期的管理,使用户应用等及其运行环境能够做到一次封装,到处运行。实现跨平台、跨服务器。

image文件生成的容器实例,本身也是一个文件,称为镜像文件。

一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例。也就是我们的容器

至于仓库,就是放一堆镜像的地方。我们可以可以吧镜像发布到仓储中,也可以从中拉下来。

3.docker 是怎么工作的? 明白了 Docker 客户端与 Docker 服务器进行交互时, Docker 服务端负责构建、运行和分发 Docker 镜像。 也知道了 Docker 客户端和服务端可以运行在一台机器上,可以通过 RESTful 、 stock 或网络接口与远程 Docker 服务端进行通信。

Docker是一个cs结构的系统,docker的守护进程运行在主机上,通过socket从客户端访问。

我们从下图可以很直观的了解到Docker的架构:

image.png

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容器只需要几秒钟。

image.png

image.png

命令: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的提升就不一一介绍了,不是专业的运维工程师,哈哈

image.png

  1. 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部署模型:

首先训练生成模型

image.png

安装部署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文件

部署机器学习的模型:

zhuanlan.zhihu.com/p/60286685