Docker 是一個開源項目,為開發人員和系統管理員提供了一個開放平台,可以將應用程序構建、打包為一個輕量級容器,並在任何地方運行。Docker 會在軟件容器中自動部署應用程序。
在本篇中,我將介紹如何 docker 化一個 Python Django 應用程序,然后使用一個 docker-compose 腳本將應用程序作為容器部署到 docker 環境。
環境
操作系統
dbnuo@localhost ~ sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.3
BuildVersion: 19D76
dbnuo@localhost ~ uname -v
Darwin Kernel Version 19.3.0: Thu Jan 9 20:58:23 PST 2020; root:xnu-6153.81.5~1/RELEASE_X86_64
Docker 版本
dbnuo@localhost ~ docker -v
Docker version 19.03.8, build afacb8b
Docker Compose 版本
dbnuo@localhost ~ docker-compose -v
docker-compose version 1.25.4, build 8d51620a
目錄結構
這里列出本次用到的相關文件和目錄,以下會介紹每個文件目錄的作用和內容。
.
├── bash.alias
├── docker-compose.yml
├── .env
├── services
│ └── python
│ │ ├── Dockerfile
│ │ └── requirements.txt
└── www
└── python
- bash.alias:用以記錄本地終端的命令。
- docker-compose.yml:容器配置文件。
- .env:環境變量設置文件。
- services/python/Dockerfile:鏡像構建文件。
- services/python/requirements.txt:依賴包管理文件。
- www/python:項目/代碼存放目錄。
構建部署
設置環境變量
打開 .env 文件,添加以下內容:
#
# python
#
PYTHON_VERSION=3.8.2
PYTHON_PORT=9100
-
PYTHON_VERSION:用以設置 Python Tags,可以在 Docker Hub 上查看所有 Tags。
-
PYTHON_PORT:本地映射容器端口的端口。
構建鏡像
打開 services/python/Dockerfile 文件,添加以下內容:
ARG PYTHON_VERSION
FROM python:${PYTHON_VERSION} AS python-base
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONFAULTHANDLER 1
FROM python-base AS python-deps
WORKDIR /code
RUN apt-get update \
&& apt-get -y install freetds-dev \
&& apt-get -y install unixodbc-dev
COPY requirements.txt ./
RUN pip install -r requirements.txt -i https://pypi.douban.com/simple
我描述下每個部分:
- 首先,指定要在其上構建鏡像的 Python 鏡像。這是由 Docker 組織提供的官方鏡像,該 Python 鏡像版本由環境變量
PYTHON_VERSION設置。我們為該鏡像命名python-base,它將在下個階段使用到:
ARG PYTHON_VERSION
FROM python:${PYTHON_VERSION} AS python-base
- 接下來,設置環境變量以正確設置語言環境,阻止Python生成
.pyc文件,並在 segfaults 上啟用 Python 追溯:
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONFAULTHANDLER 1
- 最后,使用
python-base鏡像開始新的構建階段。我們將在python-deps映像中安裝所有 Python 依賴項:
FROM python-base AS python-deps
WORKDIR /code
RUN apt-get update \
&& apt-get -y install freetds-dev \
&& apt-get -y install unixodbc-dev
COPY requirements.txt ./
RUN pip install -r requirements.txt -i https://pypi.douban.com/simple
依賴包管理
打開 services/python/requirements.txt 文件,添加項目需要的依賴。示例:
Django==3.0.4
djangorestframework==3.11.0
pyDes==2.0.1
PyMySQL==0.9.3
redis==3.4.1
requests==2.23.0
pyodbc==4.0.30
paramiko==2.7.1
psutil==5.7.0
容器配置
打開 docker-compose.yml 文件,配置容器:
version: "3"
services:
python:
build:
context: ./services/python
args:
PYTHON_VERSION: ${PYTHON_VERSION}
command: python3 /code/HelloWorld/manage.py runserver 0.0.0.0:8000
# command:
# - /bin/sh
# - -c
# - |
# django-admin startproject HelloWorld
# python3 /code/HelloWorld/manage.py runserver 0.0.0.0:8000
container_name: python
hostname: python
volumes:
- ${SOURCE_DIR}/python:/code:rw
expose:
- "8000"
ports:
- "${PYTHON_PORT}:8000"
privileged: true
restart: always
networks:
- default
networks:
default:
有關 Docker Compose 的詳細介紹,大家可以查閱官方文檔。
這里主要說明下 command ,這是配置在容器啟動后執行的命令,類似 Dockerfile 的 CMD。
配置中又兩個 command,其中一個注釋了,二者只能使用一個。第一個是單條命令的配置方式,下面的是多條命令的配置方式。視個人情況修改其中命令和路徑(初次測試,建議使用下面的 command ,會自動初始化一個 HelloWorld 項目並啟動)。
啟動容器
在文件根目錄下運行命令:
docker-compose up -d
運行該命令會自動構建鏡像並啟動容器,執行完畢后:
查看鏡像:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dnmp_python latest 7218552b8814 17 hours ago 1.02GB
python 3.8.2 f88b2f81f83a 3 weeks ago 933MB
查看容器:
docker-compose ps -a
Name Command State Ports
-------------------------------------------------------------------------------------------------
python python3 /code/HelloWorld/m ... Up 0.0.0.0:9100->8000/tcp
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)
添加以下代碼至文件:
python () {
tty=
tty -s && tty=--tty
docker run \
$tty \
--interactive \
--rm \
--volume $PWD:/code:rw \
--workdir /code \
dnmp_python python "$@"
}
刷新配置文件,使之生效:source ~/.bashrc(如果是 zsh 客戶端的使用 source ~/.zshrc)
這時候在本地即可使用 python 命令了,試一下:
dbnuo@localhost ~ python -V
Python 3.8.2
完整的示例,可以查看我的 GitHub 項目: BNDong/dnmp
