使用Docker部署一个python的web服务?
由于是从事算法相关工作,之前在项目中,需要将写完的代码服务,部署在docker上,以此是开始接触了Docker这个工具,由于之前也没系统学习过,之后应该可能还会用上,所以打算通过一遍博客的方式记录一下也学习一下,这篇博客主要记录一个基础过程,把整个流程简化,重在理解思路,如果有问题或者写的不对的地方,欢迎留言或私信交流。
Docker 是一个开源平台,利用容器技术将应用程序及其所有依赖打包到一个标准化的单元中,从而确保它们能够在任何计算环境中一致地运行。容器是轻量级的、可移植的,并且在不同的操作系统和云环境中运行时具有一致性,使得应用程序的开发、测试和部署过程更加高效和可靠。Docker 使开发人员和运维人员能够更容易地协作,简化了持续集成和持续部署(CI/CD)工作流程。
文章目录
使用Docker部署一个python的web服务?1.Docker 安装2.编写一个简单的web服务2.1 本地python环境配置安装2.1 使用Flask编写一个 hello_world 服务 3.编写一个doceker file3.1 使用FROM 命令导入一个基础镜像3.2 创建一个工作目录3.3拷贝项目根目录下的所有文件到工作目录3.4在镜像中安装Flask3.5运行服务程序app.py3.6完整的Dockerfile文件 4. 在命令控制台搭建Docker镜像4.1 使用Docker build 搭建docker镜像源4.2 使用Docker RUN 运行容器4.3 使用浏览器访问Docker镜像中运行的服务 结束
1.Docker 安装
首先到官网点击Download进行下载,由于我自己的电脑是windows所以这里下载了一个windows版本
https://www.docker.com/
下载完成之后,正常安装就一直点就行,打开应用,首先会出现启动引擎的加载动画,然后进入到如下界面。
然后打开电脑的powershell输入docker --version
查看一下docker版本,检查一下通过powershell能不能使用docker命令,这也是检查docker安装成功的关键一步,如果打印出版本信息了,表示安装成功了。
docker --version
2.编写一个简单的web服务
安装好了docker之后可以先简单写一个python的服务程序,在写一个新的python项目之前先在anaconda中建一个虚拟环境。
2.1 本地python环境配置安装
新建环境命令,我这里起的名字是doceker_web(这个命令最后安装的python的具体版本为3.10.14)
conda create --name docker_web python=3.10
运行上述命令之后,输入y开始下载虚拟环境的各种文件。
输入激活虚拟环境的命令进入虚拟环境
conda activate docker_web
然后安装一个Flask框架,这里我由于我配置了全局清华镜像源,所以是从镜像源里下载的。
pip install Flask
之后新建一个项目然后选一下解释器,0基础的同学,可以找一下周围会做的让你帮着改一下,或者自己搜一下。
2.1 使用Flask编写一个 hello_world 服务
之后这里直接写一个最简单的服务代码,如果零基础的同学可移步在下之前的文章。
Flask框架初探-如何在本机发布一个web服务并通过requests访问自己发布的服务-简易入门版
from flask import Flaskapp = Flask(__name__)@app.route("/")def hello_world(): return "Hello, World!"if __name__ == "__main__": app.run(host="0.0.0.0", debug=False)
运行之后使用电脑浏览器访问这个IP地址,可以看到浏览器上显示了一个Hello World。
3.编写一个doceker file
首先右键新建一个file文件,然后命名为Dockerfile
然后就会得到一个空白的Dockerfile文件并自动打开,其实在新建的时候,也有Dockerfile文件的选项,但是新建出来的不是空的,自带的几行代码也没啥必要,索性直接建一个空的了。
3.1 使用FROM 命令导入一个基础镜像
我们需要首先导入一个python的基础镜像,首先需要取看一下有哪些基础镜像,首先需要点右上角的九个小正方形组成的图标,然后点击DockerHub。
进入到以下网站,然后在搜索框中输入python
搜索之后点击python
点击之后下滑可以看到python包含的docker镜像的版本。
每个镜像文件由不同的python版本和一些使用操作系统的信息的后缀,这里我们以3.10.14版本为例(由于我们新建的anaconda的虚拟环境中的python版本是3.10.14)
不同的镜像使用了不同的操作系统,这里通常情况下我们选择3.10.14-slim
镜像标签 | 基础操作系统 | 描述 |
---|---|---|
3.10.14-bookworm | Debian 12 (Bookworm) | 基于Debian 12 (Bookworm) |
3.10.14-slim-bookworm | Debian 12 (Bookworm) | 基于Debian 12 (Bookworm),精简版 |
3.10.14-bullseye | Debian 11 (Bullseye) | 基于Debian 11 (Bullseye) |
3.10.14-slim-bullseye | Debian 11 (Bullseye) | 基于Debian 11 (Bullseye),精简版 |
3.10.14-alpine3.20 | Alpine Linux 3.20 | 基于Alpine Linux 3.20 |
3.10.14-alpine3.19 | Alpine Linux 3.19 | 基于Alpine Linux 3.19 |
3.10.14-slim | 多种操作系统的精简版 | 精简版,减少了不必要的文件和组件 |
FROM python:3.10.14-slim
3.2 创建一个工作目录
创作工作目录的作用是,方便归拢文件,嗯,我是这吗理解的,相当于在docker的模拟镜像系统下,新建了一个文件夹,然后之后会把项目文件通过后续的COPY命令给移动过去,之后还可以在生成文件夹的目录下执行命令,类似于windows有时候需要cd到指定路径的文件夹下,然后再执行命令,这样避免每一条命令都要带着绝对路径。
WORKDIR /app
3.3拷贝项目根目录下的所有文件到工作目录
该命令,可以将项目文件夹下是所有文件移动到,之前使用WORKDIR目录中新建的/app目录下,第一个点表示当前项目的根目录下的文件,第二个点表示目标路径,也就是Docker镜像中的/app目录,再解释一句就是执行了WORKDIR /app之后,第二个点就被指定为/app目录(理解成文件夹也行)了
COPY . .
3.4在镜像中安装Flask
移动完文件,然后就可以给镜像安装需要的库了由于我们只用到了flask,,这里我们为了精简内容,所以就先只安装Flask。
# 安装FlaskRUN pip install Flask
3.5运行服务程序app.py
最后再加一句运行命令就可以了,这是个固定的格式,等效于我们在控制台中直接执行 python3 app.py 命令。
CMD ["python3", "app.py"]
3.6完整的Dockerfile文件
# 使用基础镜像FROM python:3.10.14-slim# 设置工作目录WORKDIR /app# 拷贝当前项目文件到工作目录文件夹 COPY<本地路径><目标路径>COPY . .# 安装FlaskRUN pip install Flask# 运行应用CMD ["python3", "app.py"]
4. 在命令控制台搭建Docker镜像
4.1 使用Docker build 搭建docker镜像源
点击pycharm右下侧的小图标进入到终端(也可以在外部cmd终端cd进入到项目文件夹下)。
之后在控制台输入下面的命令,创建一个名为docker_web的的镜像(最后的点很重要不能省略)。
docker build -t docker_web .
docker build:构建 Docker 镜像的命令。-t docker_web:为构建的镜像指定一个标签(docker_web)。.:指定构建上下文,即当前目录。Docker 会使用该目录中的 Dockerfile 和所有相关文件来构建镜像(从当前目录下搜索Dockerfile)。 运行之后结果如下,该命令完成了加载python镜像源,拷贝项目文件,和安装Flask的任务。
4.2 使用Docker RUN 运行容器
docker run -p 80:5000 -d docker_web
docker run:运行一个新的容器。-p 80:5000:将主机的80端口映射到容器的5000端口。这意味着你可以通过访问主机的80端口来访问容器中运行的服务(假设服务在容器的5000端口上运行)。-d:以守护进程模式(后台)运行容器。docker_web:要运行的镜像名称。 这里的5000端口是Flask默认的端口,如果需要修改需要在app.py中设置指定的端口号
if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
4.3 使用浏览器访问Docker镜像中运行的服务
之后再浏览器中访问http://127.0.0.1:80
或http://localhost:80
,由于localhost的默认端口是80,所以可以省略端口号的输入,直接访问http://127.0.0.1
或http://localhost
,就可以访问docker容器中运行的web服务了。
如果想查看docker镜像中运行服务的输出,可以在docker desktop 中的 Containers中点击容器名字。
就可以查看到镜像容器控制台的输出,这里虽然服务的的端口号是5000但这是docker内部镜像中的端口号,我们在服务端需要通过80号端口访问,因为我们已经将5000号端口映射到了80号端口。
结束
这篇算是一个基础笔记性质的博客吧,后续如有用到了一些更多的操作会回来更新,这个暂时就先这样,留一份以后自己要是用到了就回来看看。