算法工程师工具系列–Docker快速入门
首先放一个非常实用的入门教程《Docker入门教程》: 链接.
1.Docker的主要用途:
- 提供一次性环境:比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境
- 提供弹性的云服务:因为 Docker 容器可以随开随关,很适合动态扩容和缩容
- 组件微服务架构:通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构
上述的功能用简单通俗的语言表述就是docker可以将自己环境打包给别人,提供给别人使用,而且在这个基础上可以扩充更多的功能,而且可以模拟出微服务
2.Docker的几个基本概念
(1)镜像:将软件环境打包好的模板,可以用来创建容器。这个和我们给电脑装系统那个ISO镜像类似,就相当于系统
(2)容器:镜像运行后产生的实例,这个就好比系统在电脑a上运行
(3)仓库:用于保存镜像的仓库,这个就好比github是用于存放代码的仓库,只是这里的仓库只用于存放镜像
(4)tar文件/Dockerfile文件:这个就相当于我把镜像给压缩到tar文件中,Dockerfile可以用来配置镜像(iamge)文件
通过上述的图发现,生成镜像的方式主要有三种:
- 通过编写Dockerfile文件–build构建(这里需要注意的是Dockerfile名称大小写不能出错)
- 通过压缩tar文件load 进去
- 从镜像库文件pull下来
3.手把手部署(flask网页)部署到Docker中
可以参考这篇文章: Docker部署flask程序.这里面在安装库文件的时候少安装了requests库
(1)安装Docker Desktop(windows版本) 这里不再赘述
(2)生成代码运行所需要的安装库,只需要在切换到代码所在的目录下,执行pip freeze指令即可(powershell、anaconda prompt均可 )
pip freeze > requirements.txt
执行完该代码会把你当前环境下的所有库文件都生成出来,而命名实体识别的代码只需要如下的库即可,其他的可以删除:
(3)创建Dockerfile
在创建Dockerfile的过程中注意名称的大小写;编写Dockerfile内容文件
#设置python的环境镜像,从python3.6导入
FROM python:3.6
# 将BILSTM-CRF-FLASK的代码添加到镜像文件的code路径下(code路径是docker执行的时候自动创建)
ADD ./BILSTM-CRF-FLASK /code
#将镜像中的/code文件夹设置成工作路径
WORKDIR /code
#根据之间的环境文件在镜像中安装相应的库文件
RUN pip install -r requirements.txt
#在/code路径下,执行app.py文件
CMD ["python", "/code/app.py"]
(4)创建镜像文件
本次使用的是Dockerfile文件生成的镜像,首先使用powershell切换到代码路径,使用下列命令,可以查看当前的镜像:
docker images
可以发现当前运行的镜像
切换到代码路径下:
使用docker build 构建镜像,名称为cheng
上面代码中,-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点
使用docker images查看,镜像已经开始运行
(5)启动容器
docker run -it -p 5000:5000 --name=cheng cheng
其中:
-it:表示交互式终端的容器,非启动后立刻结束的容器
-p是端口映射,表示将docker的5000端口,映射到本机的5000端口
–name 给容器起个名称,这里命名为cheng
启动后的效果如下:
(6)访问容器
此时的容器内已经跑了代码,这个内容和我们在本地运行的一模一样,本地运行的图如下所示
在容器运行的时候,我们发现这个代码在地址172.17.0.2:5000上运行,这里的地址是docker容器的ip地址。
此时docker容器和我们的个人pc属于两个机器,为了本地的pc机能够访问容器,需要在flask程序中将host设置成“0.0.0.0”。
这一部分的知识可以参考: 文章.
在CMD中使用ipconfig查看本地pc的ip地址:
然后在浏览器中输入网址:http://172.28.16.1:5000/
输入文本“张三毕业于北京大学”,点击机构识别:
4.Docker常见的指令
docker ps -a #查看当前运行的容器
docker rm id #删除当前id号的容器(容器如果没有停止,删除不了)
docker stop id #停止当前id号的容器
docker rmi id #删除当前id号的镜像文件