说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!
文章目录
一、Dockerfile Build App(应用程序)实战
1.叙述
接下来博主将实操演示如何将一个python程序打包成功一个 docker image
2.准备python程序
- 创建一个简单的基于flask web框架的路由
- 运行app.py程序
- 在浏览器输入http://127.0.0.1:5000/,查看响应
3.构建Docker Image
- 创建flask-hello-world目录,并在目录下创建一个app.py程序
- 根据以上python程序,创建Dockerfile文件
- 构建image,因为要去下载python2.7基础镜像,所以需要一定时间,根据build日志可以发现到第5步指定/app工作目录时,提示/app不是一个目录
- 那么遇到以上构建时出现的错误,可以通过debug模式进行定位原因,那么如何debug,很简单我们在build image时每一步都会生成一个中间状态临时的image,那么我们就可以使用docker run -it去交互式创建并运行这个image的container,那么这个image则是第4步生成/app目录生成的,进入这个容器,然后cd进入app目录时提示不是一个目录,那么使用more以文件查看却发现并不是目录而是文件,文件这是app.py中的代码
- 导致以上没有创建app目录,而是生成app文件的原因是在Dockerfile中COPY键指定复制到/app目录后面添加/,这样就不会创建app文件了
- 再次build,成功
- 查看构建的image
- 通过构建成功的image创建并运行容器,如下成功打印出flask日志,说明这个app成功在容器中运行了
- 但是以上app在前台运行,不小心可能会被终止运行,在后台运行加上-d参数则会在后台运行,通过docker ps命令查看正在运行的容器,就能看到该容器是在后台运行,command这是python app.py
二、Container的操作
1.在运行的容器中执行命令
- 通过docker exce命令,首先查看该命令可以添加哪些参数
docker exec --help
- 交互式进入容器shell里面
docker exec -it <CONTAINER ID> /bin/bash
- 在容器中,查看后台运行的python进程,看到运行的命令在后台进程中
ps -ef | grep python
- 退出容器,交互式运行python命令,因为容器的base image是python,所以直接运行python是没有问题的
docker exec -it <CONTAINER ID> python
- 查看正在运行中的容器IP地址
docker exec -it <CONTAINER ID> ip a
2.补充容器操作
- 停止在正在运行的容器
- 删除所有的容器
- 创建指定容器name并运行,可通过其name停止或运行容器
- 获取容器/镜像的元数据
- 获取容器的日志
- 关于容器的操作,可以参考官方文档
三、Dockerfile Build Command(命令)实战
说明: stress是一个linux下的压力测试工具,专门为那些想要测试自己的系统,完全高负荷和监督这些设备运行的用户。
1.运行ubuntu容器并安装stress工具
- 首先创建运行容器,在容器中安装stress
- 查看stress路径,发现在usr/bin下为可执行文件,查看帮助
2.stress工具简单使用
- 使用stress工具,启动一个worker,那么一个worker占用内存默认为256M
- 使用debug模式查看启用一个worker日志
- 设置每个vm进程为50000M内存,提示无法分配
- 退出容器,查看宿主机docker host的总内存一共是995748kb,大约是927M,所以分配50000M肯定是无法分配的,分配的容器内存肯定必须小于宿主机的内存
3.构建Docker Image
- 创建Dockerfile文件
- 通过以上Dockerfile构建image
- 通过以上构建的image,创建并运行容器,查看效果,相当于在之前ubuntu容器中直接运行stress命令
- 运行容器并添加命令参数,原理是通过build时Dockerfile中的CMD来接收此命令参数
- 添加–verbose参数,debug显示创建1个worker分配默认的256M内存、释放内存整个过程
- 以上命令后面的–vm 1 –verbose参数都是放在build image的Dockerfile文件中的CMD里面的,而交互式运行容器执行的是ENTRYPOINT中的/usr/bin/stress命令,通过ENTRYPOINT+CMD来执行一个命令+命令参数,那么在CMD中添加一个默认参数如:–verbose,那么构建出来的image,直接docker run 则会默认使用–verbose参数
以上则就是通过Dockerfile去构建一个命令行程序的image,跟前面构建python web application image不太一样,这两种docker image是比较典型的两种类型
四、Container资源限制
1.容器的限制有哪些
- 首先先聊聊虚拟化技术,在容器技术初出之前有虚拟化技术,在一台物理机上面可以创建多个虚拟机,比如VMware Workstation或者virtualbox,我们在创建虚拟机时候可以对这太虚拟机进行内存和cpu以及网络、磁盘等一些资源的限制(设置),那么同样容器也是可以进行资源限制的
- 通过docker run –help命令,查看容器创建帮助文档,那么可以指定创建的这个容器限制用多少内存或者多少个cpu等
2.限制容器的内存
说明: 如果直接设置内存 -m(–memory),-m 默认就是设置memory,而没有设置swap(交换分区)内存,那么 swap内存就为memory的内存,–memory-swap 是必须要与 –memory 一起使用的,说明一下–memory-swap是指的值包含容器可用memory和可用swap的,比如–memory=300M –memory-swap=1000M,意思是指容器可以使用300M 的memory,并且可以使用 700M(1000M -300M) 的 swap,再比如设置–memory=200M,那么swap就等于200M,即–memory-swap就等于memory+swap也就是200+200=400M
- 如下博主docker run构建的stress image创建内存为200M swap为200M,一共为400M的容器并在该容器中分配一个默认内存为256M的worker以debug模式运行,那么肯定是成功的,因为256M是小于这个容器的总内存400M
- 使用以上命令,并为这个worker分配500M的内存,那么500M memory是大于这个容器的总memory400M,此时肯定会提示失败的
3.显示容器的cpu
说明: –cpu-shares int该命令参数类型是int整数,设置的是cpu的相对权重,而不是cpu的个数,相对权重的理解,举个例子比如创建了两个容器,第一个容器权重为10,第二个容器的权重为5,当宿主机(物理机)cpu被这个两个运行的容器占满(cpu使用100%),也就是说两个正在运行的容器占满物理机百分之百cpu,那么第一个容器所占的cpu百分数是第二个容器的cpu的两倍
- 现在博主在xshell中需要分屏显示连接三个ssh会话,第一个窗口创建并运行名为test1容器,设置这个容器的相对权重为10,并在容器中通过stress命令启动一个进程去占用cpu(也就是通过stress命令参数–cpu 1),第二个窗口同上只是相对权重设置为5,第三个窗口执行top命令监控cpu资源消耗情况,如下
- 此时为了查看权重效果,先执行右边窗口中权重为5的容器,并查看top中的cpu资源,此时占用为99.7几乎占满了,该stress进程的PID为14221
- 现在开始执行左边窗口权重为10的容器,查看最下面窗口资源消耗,慢慢的右边窗口的运行的容器通stress进程占用cpu会慢慢下去,而权重为10的stress进程占用cpu百分比会是权重为5的两倍,也就是以上PID为14221的两倍
- 再创建一个窗口,来查看正在运行的test1和test2这两个容器
那么当需要运行多个容器时,可以通过–cpu-shares命令参数来设定比较重要的容器的cpu权重了,那么系统就会为该容器分配较多的cpu了
评论前必须登录!
注册