前言:要在Docker上运行应用程序,首先必须构建一个容器,而且必须包含使用的所有依赖项。因此,docker容器化部署的基本流程是:
1.新建一个包含所有依赖包的 requirements.txt 文件;
2.创建一个Dockerfile,该文件用来描述构建映像过程;
3.生成docker镜像;
3.实例化该镜像得到一个容器,启动该容器完成部署;当启动容器时还需要放开应用程序的HTTP端口。
python生成requests.txt文件
有三种方法可以自动生成requests.txt文件。
pip
进入所需的python环境,在命令行里输入:
pip freeze > ./requirements.txt
生成的requirements.txt里包含这个环境里下所有的python包。
pipreqs
进入所需的python环境,在命令行里输入:
pip install pipreqs
pipreqs . --encoding=utf8 --force
生成的requirements.txt里只包含代码里import的python包。
pip-compile
使用前需要先进行安装:
pip install pip-tools
如果权限不够,请使用sudo先在项目目录中创建 requirements.in 文件,然后手动写入包文件名称,然后执行 pip-compile requirements.in, 最后 cat requirements.txt。
总结
PS:在我的项目中,使用了第二种方法,一般的项目用第二种基本够用
创建Dockerfile
确定程序目录结构
接下来,需要将整个应用程序工程都放在顶层文件夹中下,同时建议将主入口程序命名为 app.py(相当于工程中的main.py) ,将脚本中创建的Flask对象命名为 app 是一种通常的做法,这样也可以简化部署。最后,形成的目录结构如下:
XXXApp
├── requirements.txt
├── Dockerfile
└── app.py
└── <other python packges>
PS:这一步的工作和Dockerfile中的内容息息相关,如果程序结构改变,Dockerfile的内容需要相应改变。
在这里,本机Pycharm测试时,工程的目录如下(main.py即app.py):
XXXProject
└── main.py
└── <other python packges>
Dockerfile创建
Dockerfile是一个文本文件,包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。它是创建镜像的必须文件,示例如下:
# 基于镜像基础
FROM python:3.6.8
# 设置代码在docker中的工作目录为 /app
# 相当于在docker中创建一个名为app的文件夹
WORKDIR /app
# 将(运行docker命令时的)当前目录下的所有内容复制到 /app 下
# 即XXXApp/下的所有内容复制到/app下
ADD . /app
# 允许外界访问容器的19958端口
EXPOSE 19958
# 安装所需的包
RUN pip install --trusted-host pypi.douban.com -r requirements.txt
#RUN pip install --trusted-host pypi.python.org -r requirements.txt
# Run app.py when the container launches
CMD ["python", "app.py"]
生成镜像
本文采用的CentOS7环境:进入到工程目录下,即:XXXApp/下,输入以下命令。
docker build -t my_dev:v1 -f Dockerfile .
说明:
(1)“.”表示dockerfile在当前打开的目录之下;my_dev是对镜像的命名;v1是版本号
(2)确认新镜像已经安装的方法:在终端中输入下面命令,可查看本机中已有的镜像。
docker images
可能会报错:
找不到Dockerfile文件:
unable to prepare context: unable to evaluate symlinks in Dockerfile path: GetFileAttributesEx D:\EvaluationApp\Dockerfile: The system cannot find the file specified.
解决问题的办法是最好在终端对dockerfile进行创建、保存和修改:
#创建Dockerfile,注意这里的Dockerfile的首字母是大写的
touch Dockerfile
#使用windows的记事本打开Dockerfile文件
notepad Dockerfile&
输入内容后,点击保存
实例化镜像并启动容器、设置映射端口、
输入以下命令:
docker run -itd -p 19958:19958 --name my_dev --restart=always my_dev:v1
说明:
(1)my_dev为容器名;my_dev:v1为镜像名
(2)有可以查看docker容器运行时状态的启动方法,如下:
docker run -it -d -p 19958:19958 --name my_dev my_dev:v1 /bin/bash
docker exec -it my_dev /bin/bash
(3)在终端中输入下面命令,可查看本机中已有的容器及其运行状态:
docker ps -a
(4)可以对镜像打包成tar包,方便传输,输入以下命令:
#压缩命令
docker save -o /home/my/my_dev.v1.tar my_dev:v1
/home/my/my_dev.v1.tar为压缩后的文件的地址
my_dev:v1为需要打包的镜像名(包括版本号)
(5)进行部署时,可以将压缩后的文件传输到某一目录下,在该目录下,运行解压命令,如下:
#解压命令
docker load -i my_dev.v1.tar
解压后,即可使用相应命令看到镜像已存在,然后使用启动命令即可完成部署。
Docker管理镜像和容器
可以参见:
Docker 删除镜像