我们使用compose建设一个python的web应用, 我们会使用到flash框架和redis.

预备知识

请确保你已经安装了docker enginedocker compose, 你不需要安装python和redis, 因为我们要使用docker镜像.

步骤一

定义程序的依赖

  1. 创建一个文件夹来存放程序

    mkdir compose-test cd compose-test

  2. 创建一个app.py文件, 并且把下面内容粘贴进文件中

    import time

    import redis from flask import Flask

    app = Flask(name) cache = redis.Redis(host='redis', port=6379)

    def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5) @app.route('/') def hello(): count = get_hit_count() return 'Hello World! I have been seen {} times.\n'.format(count)

  3. 创建一个requirements.txt文件, 并粘贴下面内容到文件, 该文件是让python知道安装哪些依赖包.

    flask redis

步骤二 创建一个Dockerfile

这个Dockerfile是以python镜像为基础来构建我们的python应用.

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

我们来解释下上面的内容:

  • python:3.7-alpine为基础镜像
  • 设置我们的工作目录为/code
  • 设置flask需要用到的两个环境变量
  • 安装gcc和其他依赖
  • 复制requirement.txt到镜像并且安装python依赖
  • 让启动后的容器打开5000端口
  • 复制当前目录的所有文件到镜像的工作目录/code里面(主要是复制app.py文件)
  • 设置容器启动后执行的命令flask run

步骤三 开始写我们的compose文件

创建一个docker-compose.yml文件, 并粘贴下面内容到里面

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

解释 ①这个compose创建了两个容器, 一个名叫web, 另一个叫redis ②这个web容器是使用Dockerfile构建的镜像生成的, 并且把容器5000端口和本机的5000端口绑定

步骤四 使用compose来构建和运行我们的程序

  1. compose-test目录里面, 运行docker-compose up命令

compose会根据docker-compose.yml的代码来配置镜像, 然后启动这些配置好的镜像, 生成容器.

  1. 在浏览器中输入http://localhost:5000/来观察程序的运行情况.

你会观察到下图的内容 20210213150152-2021-12-30-09-53-01

  1. 刷新页面

数字应该会增加

Hello World! I have been seen 2 times.
  1. 在命令行窗口输入docker image ls列出本地的所有镜像

在本地镜像中一定有webredis两个镜像. 你可以通过docker inspect <tag or id>来检查具体的镜像信息.

  1. 命令行输入docker-compose down命令停止程序的运行

步骤五 编辑docker-compose.yml使用挂载卷

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
  redis:
    image: "redis:alpine"

我们使用了新的volumes关键字, 它会让主机上的当前文件夹和容器内的/code文件夹进行绑定. 这样我们就可以自由修改主机当前文件夹内容而不需重新构建镜像.

而且我们增加了FLASK_ENV: development, 该命令的意思是告诉flask框架进入开发者模式, 该模式的主要作用就是当检测到文件改变就热启动应用程序.(容器内热启动, 不会重新构建镜像启动容器)

步骤六 重新构建并运行容器

在你的项目目录下, 运行docker-compose up命令, 然后在浏览器中重新检查

步骤七 修改主机上挂载的卷内容,然后观察变化

修改app.py, 把Hello world!修改为Hello from docker!

return 'Hello from Docker! I have been seen {} times.\n'.format(count)

重新刷新浏览器就可以看见我们的应用被更新了

20210213152528-2021-12-30-09-53-16

步骤八 可以测试其他的docker-compose命令

#使用守护进程启动应用
docker-compose up -d
#查看应用的状态
docker-compose ps
#如果使用守护进程模式启动后,必须使用该命令来停止应用
docker-compose stop
#停止应用并且删除容器
docker-compose down
THE END
开启精彩搜索

历史搜索

用户名或邮箱
密码
用户名
密码
重复密码
邮箱
注册
找回密码
注册 登录
邮箱
邮箱验证码
发送验证码
59秒后可重发
新密码
重复密码
请选择支付方式
余额支付

购买将消耗【10

微信支付
微信扫码支付 0 元
[ 04分50秒 ]
请使用微信扫一扫
扫描二维码支付
支付宝支付
支付宝扫码支付 0 元
[ 04分50秒 ]
请使用支付宝扫一扫
扫描二维码支付
已完成支付
未完成支付

请输入验证码

点击验证码可以刷新

你确认吗?

确认

2024年10月1日

新增

新增