docker部署flask项目(Ubuntu)以及无法拉取镜像问题(timeout)

1. 生成requirements.txt

Flask项目在运行的时候需要一些python库,为了方便在docker上进行安装,需要的库会整合在requirements.txt中

在终端进入项目目录下,生成requirements.txt

pip freeze > requirements.txt

生成的文件内容如下:
在这里插入图片描述

注:不用的库在requirements中删除,这样部署上去后拉取也会快一些

2. 创建Dockeifile

在项目根目录下创建Dockerfile文件
在这里插入图片描述

编辑Dockerfile文件

# python 基础镜像版本
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/python:3.11-slim-bookworm

# 设置⼯作⽬录,容器运⾏时,命令⾏默认就在这个⽬录
WORKDIR /app

# 将当前目录代码复制到镜像中的⽬录下
COPY . /app

# 安装依赖
RUN pip install -r requirements.txt

# 启动容器时,对外暴露5000端⼝
EXPOSE 5000

CMD ["python", "app.py"]

注: dockerfile和requirements都在项目根目录下面

3. 创建镜像

使用docker build -t {镜像名称} .创建镜像

在这里插入图片描述

在这里插入图片描述

  • 使用sudo su切换到root用户,就不用每次输入sudo,如 sudo docker ...
  • 构建时使用 --no-cache 参数可以强制docker构建镜像时不使用现有缓存

4. 启动容器

使用 docker run --net=host -d -p 5000:5000 {镜像名称} 启动容器

在这里插入图片描述

  • --net=host 参数来指定网络模型使用host模式
  • -d参数在后台运行容器
  • 第一次启动使用docker run,后面启动直接docker start 容器ID即可
  • 删除容器需要先docker stop 容器ID暂停容器接着再docker rm 容器IDdocker rm -f 容器ID前3位
  • docker run 应该还有别的命令方式,后续再找

5. 访问页面或调用接口

在这里插入图片描述

补充docker命令

  • 查看容器内部内容,使用exit退出
docker exec -it 容器id /bin/bash
  • 查看容器日志输出
docker logs -f 容器ID


拉镜像时timeout问题

使用docker拉取镜像的时候会出现timeout问题,如下图。这里提供两个解决办法

在这里插入图片描述

方法一 修改配置文件daemon.json

通过cd /etc/docker进入文件内,使用vim daemon.json编辑文件 在这里插入图片描述
编辑daemon.json文件内容

{
	"registry-mirrors": [
		"https://hub.uuuadc.top", 
		"https://docker.anyhub.us.kg", 
		"https://dockerhub.jobcher.com",
		"https://dockerhub.icu", 
		"https://docker.ckyl.me", 
		"https://docker.awsl9527.cn"
	 ]
}

可能存在更改这些后也无法成功的情况,多试几个镜像源
注:

  1. 如果提示文件只读,使用sudo vim编辑文件
  2. 进入后使用i键进行编辑
  3. 退出方法先按ESC键,然后输入:wq实现保存并退出,或者ESC后在大写状态下按两下Z实现保存退出

方法二 先拉镜像再docker build

https://docker.aityp.com/r/docker.io/python找到要用的镜像,如
在这里插入图片描述

点进去下拉,找到命令部分

在这里插入图片描述
复制一条命令到服务器,先拉取镜像

在这里插入图片描述

再运行docker build -t {镜像名称} .

在这里插入图片描述

注:dockerfile中的python环境镜像部分也要做对应修改
在这里插入图片描述


挖坑

flask端口问题

  1. 为什么flask中写 app.run(host='0.0.0.0', port = 5100, debug=False, threaded=True) 运行时的端口号还是5000

部署文件及docker端口问题

  1. flask项目运行端口号和dockerfile里的端口号以及docker run 时写的端口号的关系
  2. 为什么在Ubuntu系统中找不到开放的端口。

这个问题源自第一次部署到服务器上之后,外部一直扫描不到dockerfile暴漏的5100端口(使用ScanPort.exe)只能扫描到22端口,外部也一直无法访问测试端口,使用ufw查看防火墙状态是未激活,因此使用ufw打开了防火墙,结果直接g了,22也进不去。。。
接下来通过图形界面关闭了防火墙之后,再部署,dockerfile里写的暴漏的端口就可以访问了 ??? 且用ScanPort.exe可以扫描到端口???
这实在是太离谱了

Ubuntu防火墙问题

  1. 不要用ufw开启防火墙,会关闭所有端口 ===》防火墙策略(如何正确打开/关闭防火墙,或者开启端口)
  2. Ubuntu服务器的安全组问题
  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Docker部署Flask应用程序。以下是一些步骤可以帮助你完成这个过程: 1. 首先,创建一个名为`Dockerfile`的文件,并在其中定义Docker镜像的配置。以下是一个简单的示例: ``` FROM python:3.9 WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "app.py"] ``` 这个例子使用Python 3.9作为基础镜像,将当前目录中的`requirements.txt`复制到镜像中,并安装所需的依赖项。然后,将整个应用程序复制到镜像中,并定义启动应用程序的命令。 2. 在你的Flask应用程序目录中创建一个`requirements.txt`文件,并在其中列出你的依赖项。例如: ``` Flask==2.0.1 ``` 确保将所有需要的依赖项包括在其中。 3. 接下来,使用以下命令构建Docker镜像: ``` docker build -t flask-app . ``` 这将在当前目录中的`Dockerfile`中构建一个名为`flask-app`的镜像。确保在执行此命令之前,你已经进入了包含`Dockerfile`的目录。 4. 构建完成后,可以使用以下命令运行你的Flask应用程序: ``` docker run -p 5000:5000 flask-app ``` 这将在容器内部的端口5000上运行你的应用程序,并将其映射到主机的端口5000上。你可以根据需要更改端口映射。 现在,你的Flask应用程序应该已经成功部署Docker容器中了。你可以通过访问`http://localhost:5000`来访问它。如果你在远程服务器上部署,将`localhost`替换为服务器的IP地址或域名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值