前面我们学习了Dockerfile的语法,大部分的指令都介绍过了。今天就来一个Dockerfile的练习。把一个python中的flask web程序打包成镜像,这个镜像包括python编译环境和flask web程序输出hello world的python代码。
1 程序准备
这是一个python中一个web框架的一个简单例子,flask程序的一个hello world的入门例子。
先看看linux中python的版本号,默认是python 2.7系列
新建一个flask-hello-world的文件夹,然后在这个文件夹下新建一个app.py文件
文件app.py代码如下
这里贴下代码
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "hello docker"
if __name__ == '__main__':
app.run()
保存退出,然后本地先通过pip install flask安装flask
我检查了我centos 7环境,虽然给我安装了python2.7, 但是没有安装pip2组件。
然后再运行yum 安装pip
可能需要升级pip版本(执行 sudo pip install --upgrade pip)
然后pip install flask
等flask安装完成之后,输入python app.py看看效果
根据上面提示,浏览器输入http://127.0.0.1:5000,由于我们IP地址是192.168.24.128,而且是在linux 系统,所以,我们到自己笔记本电脑浏览器去访问。
如果你上面浏览器打不开,先在linux机器上关闭防火墙,命令为sudo systemctl stop firewalld. 然后刷新浏览器,如果还是出现不了hello docker字符串,那么编辑app.py文件,修改如下:
这样修改之后,应该是可以访问并且显示hello docker的效果。
2. 编写Dockerfile
我们在flask-hello-world文件下创建一个Dockerfile,并写下如下内容
贴出Dockerfile的代码
FROM python:2.7
LABEL maintainer="Anthony"
RUN pip install flask
COPY app.py /app/
WORKDIR /app
EXPOSE 5000
CMD ["python","/app/app.py"]
3. 制作镜像
利用之前学习过的docker build命令来制作镜像
由于我们FROM使用的base image是python:2.7,这个镜像在我们本地没有下载过,所以需要先下载python:2.7这个镜像里面的不同layer。
下载完之后,我在安装flask之后,报错了。
这里来说一下debug技巧,我们发现在执行RUN pip install flask这行出问题了,我们怎么去调试呢?先主意到这里。
上面红圈表示之执行step 2/7中,红圈这个是一个临时的容器,在docker build的过程中自动创建的容器,运行完之后又自动删除了这个临时的容器。所以,我们可以找到报错这个步骤的容器的id是上面我鼠标话白色背景的,那么我们可以进入这个容器,执行容器里面的bash程序,进行调试。
发现容器里面就是这个步骤报错了。然后这个问题网上搜索下,说是dns设置修改就可以了,和pip安装源没有关系。
我们需要修改一个文件vim /lib/systemd/system/docker.service
添加这行之后(这种方法只在centos和redhat系统里适合),重启docker服务,然后再来docker build
4. 启动镜像测试
这个加参数-d是后台运行的意思,来一个不加参数d的对比效果
这个时候,我们的容器是访问看不到hello docker的效果。我们需要run容器的时候指定端口。
看看浏览器访问效果
现在不用去明白为什么外层linux机器我指定8001端口,而容器指定5000端口就能访问,端口之间映射关系暂时不要去弄明白。