目录结构
- suggestion/
- backend/ # 我的后端项目
- app.py
- other_files/
- docker-compose.yml
- Dockerfile
- requirements.txt
获得requirements.txt
命令行输入:pip list --format=freeze > requirements.txt
因为使用 pip freeze > requirements.txt 导出的文件中含有 @file://
使用这个文件在其他环境下安装就会出现 找不到路径的错误
原因是这种方法生成的文件只能用于本地环境
belike:
blinker==1.6.2
Brotli==1.0.9
certifi==2024.7.4
cffi==1.16.0
charset-normalizer==3.3.2
click==8.1.7
colorama==0.4.6
cryptography==3.4.8
filelock==3.13.1
Flask==3.0.3
Flask-Cors==4.0.1
Flask-SQLAlchemy==3.1.1
Dockerfile文件
# 基于 Python 3.8 镜像构建
FROM python:3.8
# 设置时区环境变量
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 设置工作目录
WORKDIR ./backend
# 将当前目录下的所有文件复制到工作目录中
COPY . /backend
# 安装 Python 依赖
RUN pip install --no-cache-dir -r requirements.txt
# 暴露容器端口 5000 供宿主机与容器连接使用
EXPOSE 5000
# 运行应用程序
CMD ["python", "./backend/app.py"]
docker-compose.yml文件
version: '3.8'
services:
flaskapp:
image: testdashboards-flaskapp:latest # 表示拉取镜像(如果之前已经构建了镜像的话)没有镜像就执行下一行的build构建镜像
build: . # 表示构建镜像 . 表示当前路径下的文件 默认文件名为 Dockerfile
container_name: flaskapp # 定义容器名称
ports:
- "5000:5000" # Flask 端口映射
environment:
- DATABASE_URL="mysql:192.168.137.128//root:admin@test_mysql/question" #这里注意@test_mysql和下面的mysql的container_name一样
depends_on: # 表示依赖于这两个服务 在启动flaskqpp服务时会先启动mysql redis
- mysql
networks:
test_net:
ipv4_address: 192.168.137.130
tty: true # 重要参数,必须加
test_mysql:
image: mysql:8.0.36 # 表示从镜像仓库拉取mysql8.0.36的镜像
container_name: test_mysql # 定义容器名称
environment:
MYSQL_DATABASE: 'question' #数据库
MYSQL_ROOT_PASSWORD: admin #数据库root用户密码
MYSQL_CHARACTER_SET_SERVER: utf8mb4
MYSQL_COLLATION_SERVER: utf8mb4_general_ci
volumes:
- type: bind
source: ./sql
target: /docker-entrypoint-initdb.d # 注意,只有容器首次启动时才会执行/docker-entrypoint-initdb.d下的文件
- type: bind # 若非首次启动,删除挂在的data目录,再新建data
source: ./data
target: /var/lib/mysql
networks:
test_net: # 添加该服务到名为test_net 的网络中
ipv4_address: 192.168.137.128 # MySQL容器 指定 IP 地址
ports:
- "5001:3306" # 端口映射
tty: true
networks: # 创建一个自定义的虚拟网络
test_net:
driver: bridge
ipam:
config:
- subnet: 192.168.137.0/24
在Dockerfile所在文件夹中执行docker-compose up -d
因为我的文件夹叫suggestion,所以我的容器叫suggestion
创建成功,进入浏览器:http://localhost:5000/#/login能看到网页
注意:
有时候你发现没有初始化数据库:
点击进入data文件夹,看看里面有没有初始化你的表,有时候需要等等才会有
data里面,这样就是对的
打包镜像:
输入:
docker save -o flaskapp.tar testdashboards-flaskapp:latest mysql:8.0.36
因为我想测试一下这个方法,所以我对两个镜像改了个名:
docker tag 3329b8fb0fab new-flaskapp:latest
docker tag 197b02e0f708 new-mysql:8.0.36
然后进行打包:
docker save -o app.tar new-flaskapp:latest new-mysql:8.0.36
于是在suggestion文件夹中出现了app.tar
加载镜像:
docker load -i app.tar
docker-compose使用镜像:
sg文件夹:
docker-compose.yml文件:
version: '3.8'
services:
sgapp:
image: new-flaskapp:latest
container_name: sgapp
ports:
- "5000:5000"
environment:
- DATABASE_URL="mysql:192.168.137.128//root:admin@test_mysql/question"
depends_on:
- mysql
networks:
sg_net:
ipv4_address: 172.20.0.3
tty: true
mysql:
image: new-mysql:8.0.36
container_name: test_mysql
environment:
MYSQL_ROOT_PASSWORD: "admin"
MYSQL_DATABASE: question
MYSQL_CHARACTER_SET_SERVER: utf8mb4
MYSQL_COLLATION_SERVER: utf8mb4_general_ci
volumes:
- type: bind
source: ./sql #sql文件在里面
target: /docker-entrypoint-initdb.d
- type: bind
source: ./data
target: /var/lib/mysql
networks:
sg_net:
ipv4_address: 172.20.0.2
ports:
- "5001:3306"
tty: true
networks:
sg_net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
在命令行中输入:docker-compose up -d
结束!