Docker Engine:应用打包工具,用于封装应用程序。
Docker Hub:用于管理云上容器应用程序的工具。
FROM:所有Dockerfile的第一个指令都必须是FROM ,用于指定一个构建镜像的基础源镜像,如果本地没有就会从公共库中拉取,没有指定镜像的标签会使用默认的latest标签,如果需要在一个Dockerfile中构建多个镜像,可以使用多次。
MAINTAINER:描述镜像的创建者,名称和邮箱。
RUN:RUN命令是一个常用的命令,执行完成之后会成为一个新的镜像,通常用于运行安装任务从而向镜像中添加额外的内容。在这里,我们需更新包,安装python3和pip 。在第二个RUN命令中使用pip来安装requirements.txt文件中的所有包。
COPY:复制本机文件或目录,添加到指定的容器目录,本例中将requirements.txt复制到镜像中。
WORKDIR:为RUN、CMD、ENTRYPOINT指令配置工作目录。可以使用多个WORKDIR指令,后续参数如果是相对路径,则会基于之前命令指定的路径。
ENTRYPOINT:在启动容器的时候提供一个默认的命令项。
RUN:运行app目录中的app.py。
基于之前构建的docker-flask镜像启动一个容器;
这个容器的名称被设置为flask_app 。如果没有——name选项,Docker将为容器生成一个名称。显式指定名称可以帮助我们定位容器(用来停止等操作);
-v选项将主机的app目录挂载到容器;
-
然后创建uWSGI配置文件app.ini:
和Nginx配置文件nginx.conf:
最后,修改Dockerfile将Nginx和uWSGI安装到镜像,将配置文件复制到镜像中,并设置运行Nginx所需的用户权限:
然后重新打包镜像:
然后使用Nginx启动应用程序:
该镜像包含Python、Nginx、uWSGI完整环境,只需要在部署时指定端口映射便可以自动部署应用。要停止并删除此容器,请运行下面命令:
此外,如果我们仍然需要上面调试功能或修改部分代码,也可以像上面一样以调试模式运行容器:
管理外部依赖
如果将应用程序作为容器交付时,需要记住的一个关键事项是,开发人员管理依赖项的责任增加了。除了识别和指定正确的依赖项和版本之外,还需要负责在容器环境中安装和设置这些依赖项。在Python项目中管理安装依赖比较容易,可以使用requirements.txt指定依赖项和对应版本,然后通过pip安装。需要重申的是是,无论何时修改requirements.txt文件,都需要重新构建Docker镜像。
启动时安装依赖项可能在某次版本更新时需要安装额外的依赖项。比如,在开发过程中使用了一个新的包。如果不希望每次都重新构建Docker镜像,或者希望在启动时使用最新的可用版本。可以通过修改启动程序在应用程序启动时运行安装程序来实现这一点。同样,我们也可以安装额外的系统级包依赖项。修改entry-point.sh:
这样我们可以在requirements_os.txt中指定将要安装的系统软件包名称,这些包名以空格分隔放在同一行。他们将和requirements.txt中的Python依赖库一样在应用程序启动之前安装。尽管这样对应用的迭代开发期间提供了便利,但是出于几个原因,在启动时安装依赖项不是一个好的实践:
它破坏了容器化的目标之一,即修复和测试由于部署环境的变化而不会改变的依赖关系;
增加了应用程序启动的额外开销,这将增加容器的启动时间;
每次启动应用程序时需要安装依赖项,这样对网络资源有要求。