Docker的学习之旅

这是我参与更文挑战的第20天,活动详情查看: 更文挑战

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 说明启动成功。

打开浏览器访问试一试:

![](https://www.cnblogs.com/###qg1bzp-1-png###)

运行成功。这里列几个常用的命令:

**启动容器**:`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 
```

复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享