Dockerfile
# 使用 Python 3.13-slim 作为基础镜像
FROM python:3.13-slim# 设置工作目录
WORKDIR /app# 复制要求的依赖文件到容器内
COPY requirements.txt /app/# 安装 Python 依赖
RUN pip install --no-cache-dir -r requirements.txt# 复制源代码到容器内
COPY . /app/# 设置环境变量(可选)
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0# 暴露 Flask 服务的端口
EXPOSE 5000# 使用 Gunicorn 启动 Flask 应用
# app:app:格式为 <module>:<application>。
# 第一个 app 是模块名(即包含 Flask 应用实例的 Python 文件名,不包括 .py 扩展名)。
# 第二个 app 是 Flask 应用实例的变量名
#(即在 app.py 文件中定义的 app = Flask(__name__) 中的 app)
CMD ["gunicorn", "--config", "gunicorn_config.py", "app:app"]
docker-compose
version: '3'services:flask-app:build:context: ./app # 这里指向 Flask 应用代码目录,即 Dockerfile 所在目录image: flask-app:latest # 使用构建好的 flask-app 镜像volumes:- ./app:/app # 将代码目录挂载到容器,便于实时更新代码ports:- "8000:8000" # 暴露 Flask 应用端口networks:- app-networkdepends_on:- emqx # Flask 应用依赖 EMQX 服务emqx:image: emqx/emqx:latest # 使用官方 EMQX 镜像ports:- "1883:1883" # MQTT 默认端口- "8883:8883" # MQTT over SSL- "8083:8083" # WebSocket 默认端口- "8084:8084" # WebSocket over SSLvolumes:- ./ssl:/opt/emqx/ssl # 挂载 SSL 证书environment:- EMQX_LISTENER__TCP__DEFAULT=1883- EMQX_LISTENER__SSL__DEFAULT=8883- EMQX_LISTENER__WS__DEFAULT=8083- EMQX_LISTENER__WSS__DEFAULT=8084networks:- app-networknginx:image: nginx:latest # 使用官方 Nginx 镜像volumes:- ./nginx.conf:/etc/nginx/nginx.conf # 自定义 Nginx 配置- ./ssl:/etc/nginx/ssl # 挂载 SSL 证书ports:- "80:80" # HTTP- "443:443" # HTTPSdepends_on:- flask-app- emqxnetworks:- app-networknetworks:app-network:driver: bridge
version: '3'services:my-python-app: # 会根据dockerfile创建imagebuild: .expose:- "5000" # 暴露给同一网络中的其他容器networks:- app-networknginx:image: nginx:latestvolumes:- ./nginx.conf:/etc/nginx/nginx.conf # 挂载配置文件ports:- "80:80" # 将容器的80端口映射到主机的80端口depends_on:- my-python-app # 确保 Flask 容器启动后再启动 Nginxnetworks:- app-networknetworks:app-network:driver: bridge# 构建
docker-compose up --build
# 后台运行
docker-compose up -d
# 重启nginx,这个是yml里的名字
docker-compose restart nginx
# 进入到nginx里
docker exec -it helloproj_nginx_1 bash
# 再nginx里访问容器
curl http://my-python-app:5000