Docker 是一个开源项目,为开发人员和系统管理员提供了一个开放平台,可以将应用程序构建、打包为一个轻量级容器,并在任何地方运行。Docker 会在软件容器中自动部署应用程序。
在本篇中,我将介绍如何 docker 化一个 Python Django 应用程序,然后使用一个 docker-compose
脚本将应用程序作为容器部署到 docker 环境。
环境
操作系统
1 | dbnuo@localhost ~ sw_vers |
Docker 版本
1 | dbnuo@localhost ~ docker -v |
Docker Compose 版本
1 | dbnuo@localhost ~ docker-compose -v |
目录结构
这里列出本次用到的相关文件和目录,以下会介绍每个文件目录的作用和内容。
1 | . |
- bash.alias:用以记录本地终端的命令。
- docker-compose.yml:容器配置文件。
- .env:环境变量设置文件。
- services/python/Dockerfile:镜像构建文件。
- services/python/requirements.txt:依赖包管理文件。
- www/python:项目/代码存放目录。
构建部署
设置环境变量
打开 .env
文件,添加以下内容:
1 | # |
PYTHON_VERSION:用以设置 Python Tags,可以在 Docker Hub 上查看所有 Tags。
PYTHON_PORT:本地映射容器端口的端口。
构建镜像
打开 services/python/Dockerfile
文件,添加以下内容:
1 | ARG PYTHON_VERSION |
我描述下每个部分:
- 首先,指定要在其上构建镜像的 Python 镜像。这是由 Docker 组织提供的官方镜像,该 Python 镜像版本由环境变量
PYTHON_VERSION
设置。我们为该镜像命名python-base
,它将在下个阶段使用到:
1 | ARG PYTHON_VERSION |
- 接下来,设置环境变量以正确设置语言环境,阻止Python生成
.pyc
文件,并在 segfaults 上启用 Python 追溯:
1 | ENV LANG C.UTF-8 |
- 最后,使用
python-base
镜像开始新的构建阶段。我们将在python-deps
映像中安装所有 Python 依赖项:
1 | FROM python-base AS python-deps |
依赖包管理
打开 services/python/requirements.txt
文件,添加项目需要的依赖。示例:
1 | Django==3.0.4 |
容器配置
打开 docker-compose.yml
文件,配置容器:
1 | version: "3" |
有关 Docker Compose 的详细介绍,大家可以查阅官方文档。
这里主要说明下 command
,这是配置在容器启动后执行的命令,类似 Dockerfile 的 CMD
。
配置中又两个 command
,其中一个注释了,二者只能使用一个。第一个是单条命令的配置方式,下面的是多条命令的配置方式。视个人情况修改其中命令和路径(初次测试,建议使用下面的 command ,会自动初始化一个 HelloWorld 项目并启动)。
启动容器
在文件根目录下运行命令:
1 | docker-compose up -d |
运行该命令会自动构建镜像并启动容器,执行完毕后:
查看镜像:
1 | docker images |
1 | REPOSITORY TAG IMAGE ID CREATED SIZE |
查看容器:
1 | docker-compose ps -a |
1 | Name Command State Ports |
State
状态为 Up 说明启动成功。
打开浏览器访问试一试:
运行成功。这里列几个常用的命令:
启动容器:docker-compose start python
停止容器:docker-compose stop python
重启容器:docker-compose restart python
删除容器:docker-compose && docker-compose rm python
查看日志:docker logs python
Host 使用 Python 命令
终端命令都会记录在文件 bash.alias
中。
这里说下如何在本地使用 python
命令:
打开 ~/.bashrc
(如果是 zsh 客户端的使用 ~/.zshrc
)
添加以下代码至文件:
1 | python () { |
刷新配置文件,使之生效:source ~/.bashrc
(如果是 zsh 客户端的使用 source ~/.zshrc
)
这时候在本地即可使用 python
命令了,试一下:
1 | dbnuo@localhost ~ python -V |
完整的示例,可以查看我的 GitHub 项目: BNDong/dnmp