zoukankan      html  css  js  c++  java
  • Docker 容器化部署 Python 应用

    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
    

    我描述下每个部分:

    1. 首先,指定要在其上构建镜像的 Python 镜像。这是由 Docker 组织提供的官方镜像,该 Python 镜像版本由环境变量 PYTHON_VERSION 设置。我们为该镜像命名 python-base,它将在下个阶段使用到:
    ARG PYTHON_VERSION
    FROM python:${PYTHON_VERSION} AS python-base
    
    1. 接下来,设置环境变量以正确设置语言环境,阻止Python生成 .pyc 文件,并在 segfaults 上启用 Python 追溯:
    ENV LANG C.UTF-8
    ENV LC_ALL C.UTF-8
    ENV PYTHONDONTWRITEBYTECODE 1
    ENV PYTHONFAULTHANDLER 1
    
    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

  • 相关阅读:
    重构之重新组织函数(ExTract Method)
    设计模式之桥接模式
    设计模式原则之里氏替换原则
    设计模式原则之依赖倒置原则
    设计模式原则之接口隔离原则
    设计模式原则之单一职责原则
    编译php5.6
    wireshark总结
    Blu-Ray BRRip 和 BDRip 的区别
    openwrt虚拟机的network unreachable
  • 原文地址:https://www.cnblogs.com/bndong/p/12530507.html
Copyright © 2011-2022 走看看