先决条件

  • Python 3.9.9 版
  • Docker 20.10.5,使用内部版本 55c4c88


设置Dockerfile

首先,您将设置Dockerfile,它是构建Docker镜像时使用的一组连续命令。为此,您将使用pythonunbuffered,这是一个Python环境变量,当设置为非空字符串或在命令行上使用-u选项执行时,允许Python输出直接发送到终端。

当需要实时日志消息时,这很有用。

它还可以防止由于消息“卡住”在缓冲区中而导致应用程序崩溃而不提供相关详细信息等问题。

创建一个项目目录,并使用cd <directory_name(目录名)>切换到该目录:

运行以下命令以创建虚拟环境。这隔离了Python项目的环境,这样它就不会影响或受本地环境上运行的其他Python项目的影响。安装的任何依赖项都不会干扰其他Python项目。

python3 -m venv <directory_name>
source <directory_name>/bin/activate

使用以下代码,在空项目目录中创建一个名为Dockerfile的新文件:

FROM python:3.8-slim-buster
ENV PYTHONUNBUFFERED=1
WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

EXPOSE 5000

CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0", "--port=5000"]

此代码从python:3.8-slim-buster中提取的基础映像,并确保输出直接发送到终端。它确认当前工作目录位置、要复制到当前目录的Python应用程序以及要安装requirements.txt中的包。

保存并关闭文件。

创建一个python应用

创建一个app.py文件并复制以下代码:

 from flask import Flask
 app = Flask(__name__)

 @app.route('/')
 def hello_world():
     return 'Hello, Docker!'

保存并关闭。

这创建了一个简单的Python web应用程序,显示Hello,Docker!文本。

创建requirements.txt文件。这应该包含应用程序运行所需的依赖关系。

工作目录现在应该看起来像这样:

Dockerfile

app.py

requirements.txt

在终端中运行以下命令,安装运行Python应用程序所需的Flask框架,并将其添加到requirements.txt文件中。pip3冻结显示通过pip安装的所有软件包。

pip3 install Flask
pip3 freeze | grep Flask >> requirements.txt

requirements.txt文件不应再为空:

requirements.txt

Flask=2.0.3
pylint

使用

python3 -m flask run--host=0.0.0.0--port=5000

测试应用程序是否正常工作,

然后从浏览器中打开http://localhost:5000

在 Docker 上运行 Python的全图文攻略_Docker

构建Docker镜像和容器

现在已经创建了Dockerfile、requirements.txt和app.py,您应该在本地环境中测试Python应用程序以确保其正常工作。

您将从创建的Dockerfile构建Docker映像。此映像是一组用于构建和部署Docker容器的只读命令。

要构建Docker镜像,请使用

Docker build-tag dockerpy

命令。使用标签是常见的做法;Docker会给镜像一个默认的最新标签。

你应该看到这样的东西:

在 Docker 上运行 Python的全图文攻略_docker卷_02

在终端中键入docker镜像以查看新创建的镜像:

在 Docker 上运行 Python的全图文攻略_容器和镜像_03

使用docker标签<imageId><hostname>/<imagename>标记图像:<Tag>:

$ docker tag 8fbb6cdc5e76 adenicole/dockerpy:latest

现在Docker镜像已经创建并标记,使用

Docker run--publish 5000:5000<imagename>

运行镜像来构建容器:

在 Docker 上运行 Python的全图文攻略_docker compose_04

然后,使用docker ps查看存在的容器列表:

在 Docker 上运行 Python的全图文攻略_docker推送_05

现在,您可以使用http://localhost:5000查看你的python应用。

运行Docker推送

容器映像可以从Docker Hub注册表中推送和检索。

Docker Hub是一个用于容器镜像的开源库和社区。推送的图像可以在团队、客户和社区之间共享。它使用一个命令,

docker push<hub user>/<repo name>:<tag>

要获取中心用户名,请在网站上注册。然后,单击页面右上角的“创建存储库”:

在 Docker 上运行 Python的全图文攻略_docker compose_06

为仓库命名和描述,然后单击“创建”:

在 Docker 上运行 Python的全图文攻略_Docker_07

跳转到新的页面

在 Docker 上运行 Python的全图文攻略_docker推送_08

将页面右侧的命令复制到终端,用版本或单词latest替换标记名。

在您的终端中,运行命令docker login将远程存储库连接到本地环境。添加您的用户名和密码以验证您的登录,如下所示:

在 Docker 上运行 Python的全图文攻略_容器和镜像_09

运行命令docker push<hub user>/<repo name>:标记名:

在 Docker 上运行 Python的全图文攻略_docker卷_10

通过重新加载Docker Hub页面确认您的镜像已被推送:

在 Docker 上运行 Python的全图文攻略_docker推送_11

在任何终端中,运行docker pull<hub user>/<repo name>:latest来拉取docker镜像:

在 Docker 上运行 Python的全图文攻略_docker compose_12

运行Docker Compose

现在,您可以构建、运行、推送和拉取Docker镜像。

Docker Compose是一个用YAML编写的工具,用于在同一主机上开发、定义和共享多容器应用程序。

Docker Compose用于:

自动化测试环境:

Docker Compose使用简单的命令,如

Docker Compose up-d

可以在持续集成和持续交付(CI/CD)测试期间轻松创建和销毁隔离环境。

开发环境:

软件开发的一个重要方面是环境的隔离。

Docker Compose创建了这些环境,使您能够与应用程序的所有服务依赖关系进行交互、记录和配置。

一个简单的docker-compose.yml文件看起来像这样:

version: "3.9"  
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/app
      - logvolume01:/var/log
    links:
      - redis
  
 redis:
     image: redis
 volumes:
   logvolume01: {}

使用Docker卷

有时Docker镜像和容器会被意外删除。Docker卷有助于持久化这些容器和映像以存储数据,因此在意外删除的情况下不会丢失任何东西。

要显示卷,请使用

docker volume ls

如果系统上当前没有卷。要在终端中创建卷,请运行

docker volume create<volumename>

然后再次使用docker volume ls确认卷已创建:

使用

docker volume inspect<volumename>

检查卷以查看有关它的重要信息:

在 Docker 上运行 Python的全图文攻略_Docker_13

当前没有容器连接到此卷。使用以下方法将容器连接到卷上:

docker run -d \
  --name devtest \
  -v <volumename>:/app \
  nginx:latest

运行docker inspect devtest并向下滚动到“Mounts”部分,以确认卷是否已连接到容器:

在 Docker 上运行 Python的全图文攻略_容器和镜像_14

测试持久性

运行

docker Run-it-v<volumename>:/app ubuntu bash

以ubuntu为基础映像运行与容器的交互式会话:

在 Docker 上运行 Python的全图文攻略_容器和镜像_15

要检查文件系统,cd app跳转目录,创建一个文件,然后退出:

在 Docker 上运行 Python的全图文攻略_Docker_16

使用Docker rm-f<container id>列出Docker容器并删除dockerpy容器:

$ docker rm -f 1979
  1979

使用相同的卷创建另一个交互式容器,cd跳转容器应用程序目录,并查看其文件。你会发现,即使容器被销毁,文件仍然存在:

在 Docker 上运行 Python的全图文攻略_Docker_17