先决条件
- 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镜像和容器
现在已经创建了Dockerfile、requirements.txt和app.py,您应该在本地环境中测试Python应用程序以确保其正常工作。
您将从创建的Dockerfile构建Docker映像。此映像是一组用于构建和部署Docker容器的只读命令。
要构建Docker镜像,请使用
Docker build-tag dockerpy
命令。使用标签是常见的做法;Docker会给镜像一个默认的最新标签。
你应该看到这样的东西:
在终端中键入docker镜像以查看新创建的镜像:
使用docker标签<imageId><hostname>/<imagename>标记图像:<Tag>:
$ docker tag 8fbb6cdc5e76 adenicole/dockerpy:latest
现在Docker镜像已经创建并标记,使用
Docker run--publish 5000:5000<imagename>
运行镜像来构建容器:
然后,使用docker ps查看存在的容器列表:
现在,您可以使用http://localhost:5000查看你的python应用。
运行Docker推送
容器映像可以从Docker Hub注册表中推送和检索。
Docker Hub是一个用于容器镜像的开源库和社区。推送的图像可以在团队、客户和社区之间共享。它使用一个命令,
docker push<hub user>/<repo name>:<tag>
要获取中心用户名,请在网站上注册。然后,单击页面右上角的“创建存储库”:
为仓库命名和描述,然后单击“创建”:
跳转到新的页面
将页面右侧的命令复制到终端,用版本或单词latest替换标记名。
在您的终端中,运行命令docker login将远程存储库连接到本地环境。添加您的用户名和密码以验证您的登录,如下所示:
运行命令docker push<hub user>/<repo name>:标记名:
通过重新加载Docker Hub页面确认您的镜像已被推送:
在任何终端中,运行docker pull<hub user>/<repo name>:latest来拉取docker镜像:
运行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 run -d \
--name devtest \
-v <volumename>:/app \
nginx:latest
运行docker inspect devtest并向下滚动到“Mounts”部分,以确认卷是否已连接到容器:
测试持久性
运行
docker Run-it-v<volumename>:/app ubuntu bash
以ubuntu为基础映像运行与容器的交互式会话:
要检查文件系统,cd app跳转目录,创建一个文件,然后退出:
使用Docker rm-f<container id>列出Docker容器并删除dockerpy容器:
$ docker rm -f 1979
1979
使用相同的卷创建另一个交互式容器,cd跳转容器应用程序目录,并查看其文件。你会发现,即使容器被销毁,文件仍然存在: