基于Docker构建Python后端项目落地总结

Docker使用总结

基于Dockerfile的镜像构建

示例dockerfile解析

#加载centos7 的最小镜像源
FROM centos:7
RUN yum clean all
RUN yum -y update
#修改时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
#安装中文支持 
RUN yum -y install kde-l10n-Chinese && yum -y reinstall glibc-common
#配置显示中文 
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
#设置环境变量
ENV LC_ALL zh_CN.utf8

# 安装所需要的python环境依赖包
RUN yum -y install epel-release 
RUN yum -y install python-pip
RUN yum groupinstall -y 'development tools'
RUN yum install -y zlib-devel bzip2-devel openssl-devel xz-libs wget
RUN yum -y install openssl openssl-devel ncurses-devel.x86_64  bzip2-devel sqlite-devel python-devel zlib2 gcc 
RUN yum -y install MySQL-python

# 安装项目的python依赖
RUN easy_install setuptools==1.4.2
RUN pip install mysql-python
#RUN pip install -r $DOCKYARD_SRCPROJ/requirements/common.txt
RUN pip install xlrd 
RUN pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
RUN pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
RUN pip install jieba -i https://pypi.tuna.tsinghua.edu.cn/simple/  
RUN pip install keras -i https://pypi.tuna.tsinghua.edu.cn/simple/  
RUN pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
RUN pip install sklearn -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
RUN pip install regex -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
RUN pip install arrow -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
RUN pip install gensim==1.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
RUN pip install pika -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
RUN pip install schedule -i https://pypi.tuna.tsinghua.edu.cn/simple/ 

由上述可知,From 用于加载源镜像,RUN 用于执行命令,而 ENV 用于设置更新环境变量,Python依赖可以通过文件安装,但是这样要先定项目路径,方法如下。

# Set the file maintainer 
MAINTAINER mandie,[email protected]

# 设置项目路径
ENV DOCKYARD_SRC=pro_name

# 设置docker中的路径
ENV DOCKYARD_SRCHOME=/opt 
# 设置docker中的项目路径
ENV DOCKYARD_SRCPROJ=/opt/mandie

# 把项目从本地复制到docker中去
COPY $DOCKYARD_SRC $DOCKYARD_SRCPROJ

# 进入路径创建log文件夹
WORKDIR $DOCKYARD_SRCPROJ 
RUN mkdir log 
# 创建日志文件路径
VOLUME ['$DOCKYARD_SRCPROJ/log/']

# 允许外部访问的端口
EXPOSE 8000

# Copy entrypoint script into the image 
#WORKDIR $DOCKYARD_SRCPROJ 

CMD ["python", "tf_receive.py"]

上述中,COPY 如其含义可用于文件复制。WORKDIR 可用于代替类似 RUN cd …&& do something 的指令。
VOLUME 指令用于暴露任何数据库存储文件,配置文件,或容器创建的文件和目录。Expose 用于指定容器将要监听的端口。CMD 指令用于执行目标镜像中包含的软件,可以包含参数,通常以 CMD [“executable”, “param1”, “param2”…]的形式使用,一个 dockerfile 只能由一个 CMD 命令。

使用dockerfile构建镜像

docker build -t mandie/test .

此命令的使用必须在项目路径的上一级路径下,并且 dockerfile 也需要放置在项目路径同一级,如下所示。

|-- test
    |-- dockerfile
    `-- pro_name

docker build 由很多选项,这里使用的 -t 为 -tag 的缩写,用于设置镜像的名字及标签,通常 name:tag ,若不写 tag ,则为 latest。

Docker镜像的使用

交互式使用

交互式使用在测试的过程中很常用,其命令如下:

docker run -it mandie/test /bin/bash

其中,docker run 的选项 -it 中,i 指的是以交互模式运行容器,而 t 指的是为容器重新分配一个伪输入终端,这两个选项就提供了类似 linux shell 的交互界面,可以在此容器中进行修改测试,而 mandie/test 是之前所创建的 docker 镜像,我们要进入的是这个镜像,而后面跟的命令可简写为 bash ,即在容器内执行 bash 命令。
执行之后会生成容器的ID,假设前三位为 673 ,想要保存在容器中的修改并且同步到镜像,其命令为:

docker commit 673 mandie/test

而容器不删除,退出之后仍然存在,因而,为了减少内存的占用,最好删除无用容器,命令为:

docker rm 673

一个个删除很不方便,以下命令可以直接全部停止运行和删除。

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

后台使用

由于我使用的目的是在后台运行多个 python 程序,而且我需要的不仅是纯 python ,还需要环境依赖,因此这里以 centos7 为基础镜像,安装 python 环境依赖,以及程序需要的 python 包,以此作为固定的环境镜像。之后,在以刚才生成的镜像为基础,生成包含项目文件,以及其他设置的 dockerfile,生成新的镜像,这里取名为 pro/src ,用下面的命令运行 python 程序。

docker run -d --name test pro/src python test.py 

这里,-d 意思是后台容器运行并返回容器ID,–name 是给容器命名,名字必须唯一,最好是需要执行的命令,这里执行的是运行 python 程序。

其他

docker logs的使用

为了可以实时看到 python 中 print 出来的日志,需要在 dockerfile 中增加环境变量如下:

ENV PYTHONUNBUFFERED 0

虽然在 dockerfile 中已经由中文支持,但这个只是系统支持中文,为了让 python 可以使用中文,最好在 dockerfile 中增加以下配置:

ENV PYTHONIOENCODING=utf-8

docker logs 的使用方法如下:

语法:	docker logs [OPTIONS] CONTAINER

选项:
  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
      --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)

这里存在打印的时间和容器时间对不上,这个问题不影响检索,因而先忽略不计。【主要是真的查不到解决方法,如有解决方法,烦请告知!】

一些命令

显示所有镜像

docker images
docker image ls -a

删除镜像(后面可跟一个及以上)

docker image rm pro/src mandie/test
docker rmi pro/src mandie/test

显示运行容器

docker ps

显示所有容器

docker ps -a
docker container ls -a

停止容器

docker stop 123 

删除容器

docker rm 123 

在项目部署过程中,我还遇见了dead状态的进程,其删除方法,见:
docker中删除dead状态容器方法。

总结

以上是我个人使用 Docker 进行 python 项目部署中所遇到的问题以及所使用的命令,能满足我的项目需求,若需要更多资料,可以查阅官方文档,谢谢!

你可能感兴趣的:(基于Docker构建Python后端项目落地总结)