文章目录
Docker及其部署
1 Docker是什么?
- docker官网:https://www.docker.com/
- docker hub官网:https://www.docker.com/products/docker-hub
- docker源码:https://github.com/docker/docker-ce
- docker教程:https://www.runoob.com/docker/docker-tutorial.html
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
2 我们为什么选择Docker?
- 算法
- 目前我们的算法,有很多都是增量开发或者迭代开发的,需要持续集成、发布。
- 开发环境、测试环境和客户环境不一致。
- 需要有算法及相应环境的管理平台。
- 有多平台、分布式部署需求。
- 平台
3 如何通过Docker部署我们的算法?
-
必须了解的几个概念:
- 镜像:一种面向Docker引擎的只读模板,包含文件系统
- 容器:类似轻量级的沙箱,Docker利用容器来运行和隔离应用。它是从镜像创建的应用运行实例,可以将其启动、开始、停止和删除,而容器间互相不可见。
- 仓库:类似代码仓库
- DOCKERFILE:一个文本格式的配置文件,可以使用dockerfile快速创建自定义的镜像。
-
必须了解的几个关系:
- Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统。
- 使用docker search可以搜索远程仓库中共享的镜像,默认搜索docker hub官方仓库中的镜像。
3.1 利用DOCKERFILE打包镜像
1 创建一个目录,eg:docker
2 将要打包的代码放在docker文件夹里
3 生成reqirements.txt,即代码所需的第三方包列表放到docker文件夹里
- reqirements.txt生成方法一:
(这种方法的好处是可以生成代码相关第三方包列表,但是conda安装的包就没有,需要手动加)
- 安装pipreqs包
- 执行pipreqs E:\code\fire\fire_detection\workstation --encoding=utf-8
- reqirements.txt生成方法二:
- conda list -e > requirements.txt
- 效果如下图,需要指定版本号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ep1qHVgF-1605842867057)(en-resource://database/1334:1)]
4 创建Dockerfile(就叫这个名字)
如下:
FROM python:3.7.0
MAINTAINER puffy
ENV TZ Asia/Shanghai
COPY ./fire_detection fire_detection
COPY requirements.txt requirements.txt
RUN python -m pip install --upgrade pip
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
RUN apt update
WORKDIR ./fire_detection/bin
CMD ["echo Hello Container"]
- 第一行FROM必须指定基础镜像:可以是python,也可以是ubuntu,centos
- MAINTAINER是维护者信息
- RUN是镜像操作指令,RUN后面的命令语法规则和你指定的容器内操作系统一致,默认ubuntu
- ENV 可以指定环境变量,TZ为时区
- COPY 将宿主机上的文件复制到容器的指定目录下
- WORKDIR 运行容器默认进入的路径
- CMD 运行容器默认执行的命令,一个dokcerfile只能制定一个cmd,但是后期运行容器的时候还可以重新指定
5 前期的准备工作至此就做好了,效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EgrtQ25U-1605842867060)(en-resource://database/1330:1)]
(这里面的share_data是容器和本机的共享文件夹,可以不放在这个目录下,具体后面再说)
6 挂载盘
- 很多情况下我们需要将容器内生成的数据保存在宿主机上,那么就需要在容器上挂载一个本地盘
- windows:
- windows运行dokcer需要借助Oracle VM VirtualBox,当运行docker的时候会在VirtualBox中自动创建名字为【default】的linux虚拟机。
- 先使虚拟机保持退出状态,点击设置
- 点击共享文件夹,设置本地共享文件夹,这样就在windows环境创建了共享文件夹
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PukuxJa1-1605842867062)(en-resource://database/1342:1)]
- linux
- linux下无需上述共享文件夹创建操作,直接在运行的容器时候指定就可以。
(下面所有的命令windows,linux下通用)
7 创建镜像
- 打开docker客户端
- 进入之前创建的docker文件夹
- 执行下面命令(注意那个点“.”)
docker build -t 镜像名:版本 .
8 查看镜像
- 通过这个命令可以看到镜像的id
docker images
9 创建容器
- 直接运行,此时会执行dockefile指定的CMD:
docker run 镜像名:版本(镜像id)
- 指定命令运行:
docker run 镜像名:版本(镜像id) 命令
- 启动bash终端,允许用户交互
docker run -it 镜像名:版本(镜像id) /bin/bash
- 启动bash终端,允许用户交互,挂载本地盘
docker run -v /share_test:/docker_test -it 镜像名:版本(镜像id) /bin/bash
10 查看容器
- 查看所有容器
docker ps -l
- 查看运行中的容器
docker ps
11 停止容器
- 停止某个容器
docker stop 容器id
- 停止所有容器
docker stop $(dokcer ps -aq)
12 重启一个已经退出的容器
docker exec -it 容器id /bin/bash
13 删除容器
- 删除容器之前要先停止容器
docker rm 容器id
docker rm $(docker ps -aq)
3.2 通过容器打包镜像
1 从dokcer hub上面拉一个centos7镜像(因为linux版本的PIE是基于centos7)
docker pull centos:7
2 查看镜像,获取centos7的镜像id
3 创建容器,并进入交互模式
4 安装PIE依赖的各种环境
5 退出容器
6 查看容器id
7 将容器保存为镜像
docker commit <容器id> <镜像名:版本>
8 查看镜像,获取新生成镜像的id
3.3 上传DockerHub
- 上面两种方法运行之后都可以得到目标镜像。我们希望可以把这个镜像部署在各种平台,各个地方。需要把镜像传到docker hub
- 首先需要在docker hub上注册一个账户,再申请一个仓库(每个人可以有很多个共有仓库,但是只能有一个私有仓库)
- 在本地docker客户端登录
docker login
- 修改本地镜像的名字为仓库名:username/fire-detection:版本(如果你很有自信,可以在一开始打包的时候就用这个名字)
docker tag IMAGEID(镜像id) USERNAME/REPOSITORY:TAG(仓库:标签)
- 执行推送
docker push username/fire-detection:latest
- 执行拉取
docker pull username/fire-detection:latest
4 细节
- 上面版本/标签不指定会默认latest
- (镜像id) 和(镜像名:版本)可互相替换
- (容器id) 和(容器名)可互相替换
- docker可以有python接口,可以通过python实现容器的集中控制
- 还有很多强大的docker管理工具,可以可视化的看容器的运行状况:citadel、Shipyard、Kubernetes等。