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-network
depends_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 SSL
volumes:
- ./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=8084
networks:
- app-network
nginx:
image: nginx:latest # 使用官方 Nginx 镜像
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf # 自定义 Nginx 配置
- ./ssl:/etc/nginx/ssl # 挂载 SSL 证书
ports:
- "80:80" # HTTP
- "443:443" # HTTPS
depends_on:
- flask-app
- emqx
networks:
- app-network
networks:
app-network:
driver: bridge
version: '3'
services:
my-python-app: # 会根据dockerfile创建image
build: .
expose:
- "5000" # 暴露给同一网络中的其他容器
networks:
- app-network
nginx:
image: nginx:latest
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf # 挂载配置文件
ports:
- "80:80" # 将容器的80端口映射到主机的80端口
depends_on:
- my-python-app # 确保 Flask 容器启动后再启动 Nginx
networks:
- app-network
networks:
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