Docker部署flask项目(Ubuntu)
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 容器ID
或docker 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"
]
}
可能存在更改这些后也无法成功的情况,多试几个镜像源
注:
- 如果提示文件只读,使用
sudo vim
编辑文件- 进入后使用
i
键进行编辑- 退出方法先按
ESC
键,然后输入:wq
实现保存并退出,或者ESC
后在大写状态下按两下Z
实现保存退出
方法二 先拉镜像再docker build
在https://docker.aityp.com/r/docker.io/python找到要用的镜像,如
点进去下拉,找到命令部分
复制一条命令到服务器,先拉取镜像
再运行docker build -t {镜像名称} .
注:dockerfile中的python环境镜像部分也要做对应修改
挖坑
flask端口问题
- 为什么flask中写
app.run(host='0.0.0.0', port = 5100, debug=False, threaded=True)
运行时的端口号还是5000
部署文件及docker端口问题
- flask项目运行端口号和dockerfile里的端口号以及docker run 时写的端口号的关系
- 为什么在Ubuntu系统中找不到开放的端口。
这个问题源自第一次部署到服务器上之后,外部一直扫描不到dockerfile暴漏的5100端口(使用ScanPort.exe)只能扫描到22端口,外部也一直无法访问测试端口,使用ufw查看防火墙状态是未激活,因此使用ufw打开了防火墙,结果直接g了,22也进不去。。。
接下来通过图形界面关闭了防火墙之后,再部署,dockerfile里写的暴漏的端口就可以访问了 ??? 且用ScanPort.exe可以扫描到端口???
这实在是太离谱了
Ubuntu防火墙问题
- 不要用ufw开启防火墙,会关闭所有端口 ===》防火墙策略(如何正确打开/关闭防火墙,或者开启端口)
- Ubuntu服务器的安全组问题