app.py
from flask import Flask
from redis import StrictRedis
import os
import socketapp = 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-slimRUN pip install flask redis && \groupadd -r flask && useradd -r -g flask flask && \mkdir /src && \chown -R flask:flask /srcUSER flaskCOPY app.py /src/app.pyWORKDIR /srcENV FLASK=app.py REDIS_HOST=redisEXPOSE 5000CMD ["flask", "run", "-h", "0.0.0.0"]
nginx.conf
server {listen 80 default_server;location / {proxy_pass http://flask:5000;}
}
docker install?docker-compose.yml
environment
環境變量參數
version: "3.8"services:flask:build:context: ./flaskdockerfile: Dockerfileimage: flask-demo:latestenvironment:- REDIS_HOST=redis-server- REDIS_PASS=abc123 # app.py 讀取密碼networks:- backend- frontendredis-server:image: redis:latestcommand: redis-server --requirepass abc123networks:- backendnginx:image: nginx:stable-alpineports:- 8000:80depends_on:- flaskvolumes:- ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro- ./var/log/nginx:/var/log/nginxnetworks:- frontendnetworks:backend:frontend:
執行步驟:
PS C:\Users\柏杉\Downloads\compose-env> docker-compose build
redis-server uses an image, skipping
nginx uses an image, skipping
Building flask
Sending build context to Docker daemon 3.072kB
Step 1/8 : FROM python:3.9.5-slim---> c71955050276
Step 2/8 : RUN pip install flask redis && groupadd -r flask && useradd -r -g flask flask && mkdir /src && chown -R flask:flask /src---> Using cache---> cbe62d2158d1
Step 3/8 : USER flask---> Using cache---> 6f59861a4345
Step 4/8 : COPY app.py /src/app.py---> Using cache---> 11fe82f12b2b
Step 5/8 : WORKDIR /src---> Using cache---> f7b7dce07bf7
Step 6/8 : ENV FLASK=app.py REDIS_HOST=redis---> Using cache---> 8457b24cf78f
Step 7/8 : EXPOSE 5000---> Using cache---> 960825bd910b
Step 8/8 : CMD ["flask", "run", "-h", "0.0.0.0"]---> Using cache---> f19971896f07
Successfully built f19971896f07
Successfully tagged flask-demo:latest
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
PS C:\Users\柏杉\Downloads\compose-env> docker-compose up -d
Creating network "compose-env_backend" with the default driver
Creating network "compose-env_frontend" with the default driver
Creating compose-env_flask_1 ... done
Creating compose-env_redis-server_1 ... done
Creating compose-env_nginx_1 ... done
PS C:\Users\柏杉\Downloads\compose-env> docker-compose psName Command State Ports
------------------------------------------------------------------------------------------
compose-env_flask_1 flask run -h 0.0.0.0 Up 5000/tcp
compose-env_nginx_1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:8000->80/tcp
compose-env_redis-server_1 docker-entrypoint.sh redis ... Up 6379/tcp
PS C:\Users\柏杉\Downloads\compose-env>
瀏覽器訪問:http://127.0.0.1:8000/
查看啟動成功!
把密碼 abc123
改成${REDIS_PASSWORD}
docker環境變量?別人無法根docker-compose.yml
看到密碼,據提高了安全性。在構建時才把密碼放進去!
version: "3.8"services:flask:build:context: ./flaskdockerfile: Dockerfileimage: flask-demo:latestenvironment:- REDIS_HOST=redis-server- REDIS_PASS=${REDIS_PASSWORD}networks:- backend- frontendredis-server:image: redis:latestcommand: redis-server --requirepass ${REDIS_PASSWORD}networks:- backendnginx:image: nginx:stable-alpineports:- 8000:80depends_on:- flaskvolumes:- ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro- ./var/log/nginx:/var/log/nginxnetworks:- frontendnetworks:backend:frontend:
.env
管理環境變量docker-compose.yml
出現環境變量時,會自動找.env文件
REDIS_PASSWORD=ABC123
.gitignore
,管理上傳文件.env
提前預覽一下,查看設置的有沒有問題
PS C:\Users\柏杉\Downloads\compose-env> docker-compose config
networks:backend: {}frontend: {}
services:flask:build:context: C:\Users\柏杉\Downloads\compose-env\flaskdockerfile: Dockerfileenvironment:REDIS_HOST: redis-serverREDIS_PASS: abc123image: flask-demo:latestnetworks:backend: nullfrontend: nullnginx:depends_on:flask:condition: service_startedimage: nginx:stable-alpinenetworks:frontend: nullports:- published: 8000target: 80volumes:- C:\Users\柏杉\Downloads\compose-env\nginx\nginx.conf:/etc/nginx/conf.d/default.conf:ro- C:\Users\柏杉\Downloads\compose-env\var\log\nginx:/var/log/nginx:rwredis-server:command: redis-server --requirepass abc123image: redis:latestnetworks:backend: null
version: '3.8'
若要沒有設置.env
文件
出現提示:REDIS_PASSWORD
沒有設置,默認為空的字符串。
WARNING: The REDIS_PASSWORD variable is not set. Defaulting to a blank string.
docker環境,默認是.env
創建自定義的文件 myenv
:
REDIS_PASSWORD=ABC123
--env-file
參數
查看
docker-compose --env-file .\myenv config
docker內安裝docker?啟動
docker-compose --env-file .\myenv up -d
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态