目录
技术背景
Dockerfile的创建
对于简单的场景而言,尤其是别人已经把基础容器镜像做的比较完善的情况下,使得我们减少了大量的工作量。比如这里我们直接使用一个别人做好的python3.7的基础镜像,而获得该镜像的方法在上一篇博客中也作了介绍。那么我们在dockerfile里面只需要安装好我们所需要的ortools的python包即可:
这里FROM后面所跟随的基础镜像是必须在本地所具备的,可以在docker images里面看到的才行。最好也在本地通过运行docker run your_iamge来测试一下这个容器镜像是否正常工作,因为有些容器镜像必须要跟随版本 才能正常使用。在上述dockerfile中我们先对pip管理工具做了一个升级,然后才安装ortools工具包。有一个需要注意的点是,我们也可以选择使用多次的RUN来制作一个dockerfile,但是这会导致添加了多层的镜像,因此最好我们是可以用命令拼接的方式一次性完成所有的任务,这样只会增加一层镜像(截图来自于参考链接2):
按照上述流程编写好dockerfile之后,我们就可以使用docker build来构建一个本地的容器镜像:
我们可以看到2条dockerfile的指令的运行结果都在屏幕上输出,显示是成功安装了的。在执行完build之后,我们可以在本地的images仓库里面看到这个新的容器镜像:
我们也可以测试一下这个容器镜像的功能是否正常:
通过执行一个简单的python指令我们可以看到ortools这个工具已经被成功的部署在容器镜像内,在下一个章节中我们会介绍如何使用ortools来解决一个实际问题。当然,上述测试方案也有一个更加简单的方法,使用-c标签来运行代码:
这里再补充介绍一下在docker中如何删除一个容器镜像的方法,那就是使用rmi和rm指令。这两个指令也容易区分,如果是在docker images指令下找到的容器镜像,那就用rmi来进行删除,如果是在docker ps里面看到的容器,那就用rm来删除,以下是两个示例:
上面这个用例是表示我们在docker images中有一个名为cplex-py37的容器镜像,其实也是在上一篇博客中制作的产物。假如我们需要删除这个镜像,就用删除的rmi指令。当我们第一次尝试删除的时候,我们收到一个提示,关于一些冲突的提示。假如我们认定了这个冲突并不影响我们的操作,那么我们可以强制删除,也就是加上-f指令。
另外也展示一下rm指令的使用场景。假如我们使用docker ps -n 5查看过去执行的最近5条指令,并且需要删除第一条镜像id为2df3的容器:
可以看到用rm删除之后就不会在最新的结果查询中出现这个容器,这也方便我们释放不需要的容器资源给本地环境。
ortools案例
这里我们还是使用上一篇博客中所提到的单背包问题(Knapsack Problem)来进行测试。相关问题的定义如下:
当然在ortools的案例中我们不需要写lp文件,只是借用这个lp文件来展示一下我们的约束条件和目标函数。这个问题的含义也在上一篇博客中介绍过了,这里我们直接截图引用:
ortools求解器的使用
在这个案例中我们使用了一个第三方的求解器后端来进行计算,叫SCIP。我们得到的最终解已经达到了最优解,这个我们在上一篇博客中也分析过了。到这里为止,我们就成功的使用ortools提供的框架求解了一个实际的背包问题。
总结概要
在本地构建基于Docker的编程环境是一个兼容性和可用性非常强的解决方案,这里我们介绍了一个使用Dockerfile来构建Docker容器镜像的简单实例。同时也用谷歌所主导的开源线性规划求解器ortools来测试这个容器化的编程环境解决方案,最终我们用ortools成功的求解了一个单背包问题,并且跟前面一篇博客中所介绍的IBM主导的cplex一样都得到了问题的最优解。
版权声明
参考链接
- https://developers.google.cn/optimization/mip/integer_opt?hl=zh-cn
- https://www.runoob.com/docker/docker-dockerfile.html
- https://www.cnblogs.com/dechinphy/p/cplex.html#
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!