flask文件
app.py
from flask import Flask
from redis import StrictRedis
import os
import socket
app = Flask(__name__)
redis = StrictRedis(host=os.environ.get('REDIS_HOST', '127.0.0.1'),
port=6379, password=os.environ.get("REDIS_PASS"))
@app.route('/')
def hello():
redis.incr('hits')
return f"Hello Container World! I have been seen {redis.get('hits').decode('utf-8')} times and my hostname is {socket.gethostname()}.\n"
Dockerfile
FROM python:3.9.5-slim
RUN pip install flask redis && \
groupadd -r flask && useradd -r -g flask flask && \
mkdir /src && \
chown -R flask:flask /src
USER flask
COPY app.py /src/app.py
WORKDIR /src
ENV FLASK=app.py REDIS_HOST=redis
EXPOSE 5000
CMD ["flask", "run", "-h", "0.0.0.0"]
nginx
nginx.conf
server {
listen 80 default_server;
location / {
proxy_pass http://flask:5000;
}
}
.dockerignore
.DS_Store
.idea
.git
.gitignore
.env
.dockerignore
Dockerfile
docker-compose.yaml
nginx.conf
var
docker-compose.yml
version: "3.8"
services:
flask:
build: # 构建 属于自己的 flask程序
context: ./flask # 到那个文件夹下面构建
dockerfile: Dockerfile # 读取 dockerfile 的名字叫: Dockerfile
image: flask-demo:latest # 这里起到命名的作用
environment: # 设置环境变量
- REDIS_HOST=redis-server
- REDIS_PASS=${REDIS_PASSWORD}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5000"]
interval: 30s
timeout: 3s
retries: 3
start_period: 40s
depends_on:
redis-server:
condition: service_healthy
networks: # 连接网络为 backend frontend
- backend
- frontend
redis-server:
image: redis:latest # 拉取 redis:latest
command: redis-server --requirepass ${REDIS_PASSWORD}
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 1s
timeout: 3s
retries: 30
networks: # 连接网络为 backend
- backend
nginx:
image: nginx:stable-alpine # 拉取 nginx
ports: # 将 80端口 映射 为 8000端口
- 8000:80
depends_on: # depends_on 启动顺序 只要 flask先启动后 此程序才能启动
flask:
condition: service_healthy
volumes:
- C:\Users\CZC\Desktop\docker_project\M-docker-compose-scale-new\nginx\nginx.conf:/etc/nginx/conf.d/default.conf:ro
- C:\Users\CZC\Desktop\docker_project\M-docker-compose-scale-new\var\log\nginx:/var/log/nginx # /var/log/nginx
# - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro # 将 /etc/nginx/conf.d/default.conf 映射 到 ./nginx/nginx.conf ro:readonly只读 rw:读写
# - ./var/log/nginx:/var/log/nginx # /var/log/nginx 映射 到 ./var/log/nginx 上
networks: # 连接网络为 frontend
- frontend
networks:
backend:
frontend:
.env
REDIS_PASSWORD=56248123
验证替换的效果
docker-compose config
如果 .env 改名字 可以指定名字
比如改成 myenv
docker-compose --env-file .\myenv config