1. 到项目根目录,并在根目录创建requirements.txt(内为pip freeze 导出需要安装的包列表)文件和Dockerfile,如下,

FROM python:3.7

ADD . /

RUN pip install -r requirements.txt

EXPOSE 8080

CMD python ./wen.py

第一条语句,定义了当前镜像需要从什么原始镜像创建,可以指定原始镜像为操作系统,例如ubuntu,这里docker hub中有python可以直接使用(因为python的原始镜像可能是os,所以直接使用python作为原始镜像即继承了其os),这里python是repository的名称,3.7是tag,3.7并未指定os,这里是所谓的sharing tag,表明可以支持包括Linux windows在内的多操作系统,如果需要指明特定的os中的python,需要使用所谓的single tag,具体含义可以参考https://github.com/docker-library/faq#whats-the-difference-between-shared-and-simple-tags

第二条语句, 将当前根目录以及包括所有子目录文件都拷贝到docker中os环境中的根目录下,

第三条语句,根据requirements.txt文件中的清单安装package

第四条语句, docker 创建container后监听的端口号,docker file文档中是这样描述的,

The EXPOSE instruction informs Docker that the container listens on the specified network ports at runtime.这里需要注意的是container监听的是container之间或者内部程序的端口,因此,这里EXPOSE的端口号需要和python web程序运行所指定的端口号保持一致,因为container需要监听的就是我们访问python web网页的端口。

第四条语句,指定在运行该image的时候需要执行的命令,

以上所有涉及命令可以通过以下docker file 文档查询:https://docs.docker.com/engine/reference/builder/

2. 在项目根目录启动bash,执行以下命令

docker build --network=host -t .

注意最后的.不能省略,指明用当前目录下的所有文件创建镜像,此外 network需要设置host,

因为我电脑使用了vpn,所以在使用pip安装package的时候出现了问题,加上此参数可以解决问题。

3. 运行镜像,执行以下命令

docker run -dp 5500:8080

其中5500代表container对外映射的端口号,8080即为Dockerfile中EXPOSE的端口号,可以把这两个端口号对应为两个不同世界的端口,一个我们电脑正常使用的世界,一个docker创建的由container组成的世界,

4.访问网页,

在浏览器输入 localhost: 5500即可访问docker中运行的网页

done ; )