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

  • 相关阅读:
    Python 爬虫js加密破解(一) 爬取今日头条as cp 算法 解密
    Python 爬虫实例(2)—— 爬取今日头条
    Python 爬虫实例(1)—— 爬取百度图片
    python 操作redis之——HyperLogLog (八)
    python 操作redis之——有序集合(sorted set) (七)
    Python操作redis系列之 列表(list) (五)
    Python操作redis系列以 哈希(Hash)命令详解(四)
    Python操作redis字符串(String)详解 (三)
    How to Install MySQL on CentOS 7
    Linux SSH远程文件/目录 传输
  • 原文地址:https://www.cnblogs.com/bndong/p/12530507.html
Copyright © 2011-2022 走看看