文章目录

  • 1.docker-compose是什么
  • 2.官方案例:python_web + redis 项目
  • 3.docker-compose.yaml 文件的规范
  • 4.CMD命令使用:flask run
  • 5.redis中incr()函数

  • 本博文主要通过官方的案例讲解docker-compose的使用情况。
  • 你也可以移步官方地址:docker-compose 官方案例地址

1.docker-compose是什么

  • Docker Compose 是一个工具,命令行工具。
  • 这个工具可以通过yml文件定义多容器的docker应用
  • 通过一条命令就可以根据yml文件的定义去创建或者管理这多个容器

2.官方案例:python_web + redis 项目

step1: 创建文件夹


mkdir composetest
cd composetest

step2: 创建python文件,app.py,输入里面的内容如下:

import timeimport redis
from flask import Flaskapp = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)       # 此处连接的是容器名称,后续有redis集群,也连接的是集群名称def get_hit_count():retries = 5while True:try:return cache.incr('hits')               # 这个函数啥东东?下面会讲except redis.exceptions.ConnectionError as exc:if retries == 0:raise excretries -= 1time.sleep(0.5)@app.route('/')
def hello():count = get_hit_count()return 'Hello World! I have been seen {} times.\n'.format(count)

step3: 创建requirements.txt文件, 输入里面的内容如下:


flask
redis

step4: 创建Dockerfile文件, 输入里面的内容如下:


FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py                       # 这里是否可以不用设置
ENV FLASK_RUN_HOST=0.0.0.0                 # 这里是否可以不用设置
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]                        # 为啥要使用flask run 而不是python3 app.py??后面说到

step5: 创建docker-compose.yml文件, 输入里面的内容如下:


version: "3.9"
services:web:build: .ports:- "5000:5000"redis:image: "redis:alpine"             # 这里的redis,就是容器启动后的名称

step6: 启动docker-compose up .


[root@10-23-51-219 composetest]# docker-compose up
Building webStep 1/10 : FROM python:3.7-alpine---> 79d8d54b1857
Step 2/10 : WORKDIR /code---> Using cache---> 9eb6495ea257
Step 3/10 : ENV FLASK_APP app.py---> Using cache---> 15e7277f57f3
Step 4/10 : ENV FLASK_RUN_HOST 0.0.0.0---> Using cache---> 57a4af5435e8
Step 5/10 : RUN echo -e http://mirrors.ustc.edu.cn/alpine/v3.7/main/ > /etc/apk/repositories---> Using cache---> eae158bf812e
Step 6/10 : COPY requirements.txt requirements.txt---> eb041643c8e3
Removing intermediate container c53c92a22253
Step 7/10 : RUN pip install -r requirements.txt---> Running in a627e281c5b6Collecting flaskDownloading Flask-1.1.2-py2.py3-none-any.whl (94 kB)
Collecting redisDownloading redis-3.5.3-py2.py3-none-any.whl (72 kB)
Collecting itsdangerous>=0.24Downloading itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting Jinja2>=2.10.1Downloading Jinja2-2.11.3-py2.py3-none-any.whl (125 kB)
Collecting click>=5.1Downloading click-7.1.2-py2.py3-none-any.whl (82 kB)
Collecting Werkzeug>=0.15Downloading Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)
Collecting MarkupSafe>=0.23Downloading MarkupSafe-1.1.1.tar.gz (19 kB)
Building wheels for collected packages: MarkupSafeBuilding wheel for MarkupSafe (setup.py): startedBuilding wheel for MarkupSafe (setup.py): finished with status 'done'Created wheel for MarkupSafe: filename=MarkupSafe-1.1.1-py3-none-any.whl size=12629 sha256=4882ae01e0a1d50b0f836df700813c945bced6a8e4e0bfd9718a79635560cbefStored in directory: /root/.cache/pip/wheels/b9/d9/ae/63bf9056b0a22b13ade9f6b9e08187c1bb71c47ef21a8c9924
Successfully built MarkupSafe
Installing collected packages: MarkupSafe, Werkzeug, Jinja2, itsdangerous, click, redis, flask
Successfully installed Jinja2-2.11.3 MarkupSafe-1.1.1 Werkzeug-1.0.1 click-7.1.2 flask-1.1.2 itsdangerous-1.1.0 redis-3.5.3---> 6dc4a3381526
Removing intermediate container a627e281c5b6Step 8/10 : EXPOSE 5000---> Running in bba8382e87dc---> 27e23e0ecac8
Removing intermediate container bba8382e87dcStep 9/10 : COPY . .---> cf8485c26c53
Removing intermediate container e7597a071556Step 10/10 : CMD flask run---> Running in 6e860518647c---> a05ff568c639
Removing intermediate container 6e860518647c
Successfully built a05ff568c639WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Pulling redis (redis:alpine)...
alpine: Pulling from library/redis
ba3557a56b15: Already exists
4f47664a3e94: Pull complete
f5c47feea59c: Pull complete
dd29ad3f8731: Pull complete
961a5851f331: Pull complete
24af1e6d2f46: Pull complete
Digest: sha256:5c0374e9d2af14c0fb5cf0406d6fe74220998f7ec0250de33344d8e2a3b46305
Status: Downloaded newer image for redis:alpine
Creating composetest_web_1   ... done
Creating composetest_redis_1 ... done
Attaching to composetest_redis_1, composetest_web_1redis_1  | 1:C 25 Feb 2021 03:20:01.956 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 25 Feb 2021 03:20:01.956 # Redis version=6.2.0, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 25 Feb 2021 03:20:01.956 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1  | 1:M 25 Feb 2021 03:20:01.957 * monotonic clock: POSIX clock_gettime
redis_1  | 1:M 25 Feb 2021 03:20:01.957 * Running mode=standalone, port=6379.
redis_1  | 1:M 25 Feb 2021 03:20:01.957 # Server initialized
redis_1  | 1:M 25 Feb 2021 03:20:01.957 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1  | 1:M 25 Feb 2021 03:20:01.957 * Ready to accept connections
web_1    |  * Serving Flask app "app.py"
web_1    |  * Environment: production
web_1    |    WARNING: This is a development server. Do not use it in a production deployment.
web_1    |    Use a production WSGI server instead.
web_1    |  * Debug mode: off
web_1    |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
web_1    | 172.18.0.1 - - [25/Feb/2021 03:22:26] "GET / HTTP/1.1" 200 -
web_1    | 113.31.115.41 - - [25/Feb/2021 03:24:00] "GET / HTTP/1.1" 200 -
web_1    | 180.166.147.10 - - [25/Feb/2021 03:24:22] "GET / HTTP/1.1" 200 -
web_1    | 180.166.147.10 - - [25/Feb/2021 03:24:22] "GET /favicon.ico HTTP/1.1" 404 -
redis_1  | 1:M 25 Feb 2021 04:20:02.041 * 1 changes in 3600 seconds. Saving...
redis_1  | 1:M 25 Feb 2021 04:20:02.042 * Background saving started by pid 12
redis_1  | 12:C 25 Feb 2021 04:20:02.043 * DB saved on disk
redis_1  | 12:C 25 Feb 2021 04:20:02.043 * RDB: 0 MB of memory used by copy-on-write
redis_1  | 1:M 25 Feb 2021 04:20:02.142 * Background saving terminated with success

3.docker-compose.yaml 文件的规范

详情可参考:
《docker-compose命令及yaml文件》
《Docker学习记录 - docker compose yaml文件详解》


4.CMD命令使用:flask run

  • 最初的时候,看到官方的CMD命令使用flask run,启动了程序感觉很懵逼。后来在pycharm上测试了一下,果然也成功了。

使用flask run命令,需要注意的地方:

  • flask run 启动flask项目,默认的flask的启动项目文件名为官方的app.py文件
  • 如果你的项目中,启动文件是run.py,那么需要先设置FLASK_APP=run.py环境变量,才能使用,否者失败
  • 使用flask run,启动文件中,不需要添加if name == 'main’这个main函数了
#
if __name__ == '__main__':app.run(host="0.0.0.0", port=5000, debug=True)

CMD中, 使用python3 app.py命令:

  • app.py 文件中,需要添加如上的main函数的部分
  • 不需要设置环境变量FLASK_APP & FLASK_RUN_HOST了,因为在main函数中都设置好了

5.redis中incr()函数


import redis# 创建连接池:可以减少频繁的连接、断开数据库的开销
pool = redis.ConnectionPool(host="xxxxx", port=xxxx, db=0, password="xxxx", decode_responses=True)# 创建redis对象
cache = redis.StrictRedis(connection_pool=pool)# redis存储页面点击次数在合适不过了
cache.incr("page_hits")print(r.get("page_hits"))

redis中incr函数:

  • 如果我们想实现计数的功能:在这个过程中,如果有并发就可能导致计数错误,所以,更新文章访问量的代码都是需要加锁的,以防止同时修改。
  • Redis的所有操作都是原子性的,也就是说,不论多少个客户端在对一个key进行操作,你不必担心并发导致的类似错误,因为Redis在实现上已经对这类问题进行处理。
  • 每次调用incr(key_name)函数,redis都会计数一次,对应的value值加一

Docker/Podman使用提高---docker-compose基础(python3)相关推荐

  1. Docker/Podman使用入门---从容器构建镜像 提交镜像到服务器UCloud dockerhub

    文章目录 1.docker commit 提交镜像命令 2.将镜像提交到UCloud服务器 step1: 先在UCloud服务器上面,创建镜像仓库 step2: 登录UCloud镜像仓库 step3: ...

  2. Docker之旅(1)-Docker基础

    一.Docker 简介 1.1 Docker 概念 Docker 于 2013 年开源,其基于 go 语言开发,是一个开源的 PaaS 服务(Platform as a Service,平台即服务的缩 ...

  3. 这就是你日日夜夜想要的docker!!!---------Docker Compose容器编排理论+实操

    文章目录 一.Compose简介 1.在Compose中有两个重要的概念 2.docker,dockerfile与docker-compose区别 二.Compose安装与卸载 1.Centos系统安 ...

  4. Docker 从入门到实践系列四 - Docker 容器编排利器 Docker Compose

    文章目录 Compose简介 概念 组成 安装与卸载 二进制包方式安装 测试 卸载 docker-compose.yml 文件详解 概念 案例 version services image build ...

  5. Docker折腾记: (3)Docker Compose构建Gitlab,从配置(https,邮箱验证)到基本可用

    前言 gitlab 11.1内置了CI/CD,这个特性从gitlab 8+就开始有了,不过配置比较琐碎 经过几个大版本的迭代,现在已经简化了使用方式,也修复了一些坑,这个特性大大吸引了我; gitla ...

  6. Docker Review - dockerfile 实战_给基础镜像增加功能

    文章目录 文件格式 实操Docker file 给基础镜像centos 增加功能 dockerfile镜像制作 docker build 通过dockerfile构建镜像 启动新镜像,验证 docke ...

  7. couchbase_适用于具有Couchbase和WildFly的多容器和多主机应用程序的Docker Machine,Swarm和Compose...

    couchbase 该博客将说明如何使用Docker创建部署在多个主机上的多容器应用程序. 这将使用Docker Machine,Swarm和Compose实现. 是的,这三个工具一起使这个博客变得更 ...

  8. 适用于具有Couchbase和WildFly的多容器和多主机应用程序的Docker Machine,Swarm和Compose...

    该博客将说明如何使用Docker创建部署在多个主机上的多容器应用程序. 这将使用Docker Machine,Swarm和Compose实现. 是的,所有这三个工具一起使此博客更加有趣! 该图说明了关 ...

  9. Docker安装ssh,supervisor等基础工具

    2019独角兽企业重金招聘Python工程师标准>>> Docker安装ssh,supervisor等基础工具 需要提前下载好官方的ubuntu镜像,我这里使用的是ubuntu:14 ...

最新文章

  1. java获取当前日期时间代码
  2. 计算机与USB沟通方式
  3. 实践1-qq邮箱主页
  4. plsql 无法解析指定的连接标识符_Java方法加载、解析、存储、调用
  5. java排列组合算法优缺点,一招彻底弄懂!
  6. 【POJ - 1269 】Intersecting Lines (计算几何,直线间的位置关系)
  7. velocity自定义函数_velocity基本语法和总结
  8. python淘宝抢购_Python 实现毫秒级淘宝抢购脚本的示例代码
  9. 程序员都很老实?你错了,其实程序员真实的样子是这样的
  10. Unity3d开发跳一跳AI(ML-agents)全纪录
  11. java生成world文件_Hello World 项目创建与项目配置文件介绍
  12. 网易python公开课_教程帖-爬取网易云课堂上所有python课程的基本信息
  13. 常见的输入、输出、存储设备
  14. 带你破解时间管理的谜题
  15. 阿米巴经营会计报表复习
  16. 苹果账号打包发布APP流程详解
  17. windows变量环境
  18. 力扣:第 304 场周赛
  19. 60-硅谷课堂6-硅谷课堂-公众号消息和微信授权-- 笔记
  20. Java学生学籍管理系统

热门文章

  1. 数字经济时代,达尔文平台助力广告投放走向数智化
  2. 前端白屏问题_首页白屏优化实践
  3. Excel报:文件已损坏无法打开错误问题解决
  4. 公众号和视频号互相绑定带来的功能
  5. Python3.6-Flask:制作一个语音对话问答机器人系统(网页版)
  6. html背景图片自适应窗口大小
  7. C# 小数点后保留两位小数
  8. 深入创新,共建原生 | 「DaoCloud 道客」与华钦科技签署合作备忘录
  9. amd linux raid,RAID的详解
  10. 内网安全-域横向内网漫游Socks代理隧道技术