使用DockerCompose(从源代码开始)部署和管理应用程序

前言

示例应用程序使用Python编写并采用Flask框架,通过Redis服务维护一个计数器。Python开发环境和Redis可以由Docker镜像提供,不必安装。

一、创建项目目录并准备应用程序的代码及其依赖

(1)执行以下命令创建项目目录,并切换到该目录下。

[gqb@localhost ch05]$ mkdri flask-web && cd flask-web

 (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)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)
复制代码

(3)在项目目录中创建文本文件requirements.txt并添加以下内容。

flask
redis

二、创建Dockerfile

(1)在项目目录中创建一个名为Dockerfile的文件并添加一下内容。

FROM python:3.7-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

三、在Compose文件中定义服务

(1)在项目目录中创建一个名为docker-compose.yml的文件并添加以下内容。

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

四、通过Docker Compose构建并运行应用程序

(1)在项目目录中执行docker-compose up命令启动应用程序。

复制代码
[gqb@localhost flask-web]$ docker-compose up
Creating network "flask-web_default" with the default driver
Building web
Step 1/5 : FROM python:3.7-alpine
......
Creating flask-web_redis_1 ... done
Creating flask-web_web_1   ... done
Attaching to flask-web_redis_1, flask-web_web_1
redis_1  | 1:C 29 May 2022 14:01:34.718 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
......
redis_1  | 1:M 29 May 2022 14:01:34.721 * Ready to accept connections
web_1    |  * Serving Flask app 'app' (lazy loading)
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: on
web_1    |  * Running on all addresses (0.0.0.0)
web_1    |  * Running on http://127.0.0.1:5000
web_1    |  * Running on http://172.20.0.2:5000 (Press CTRL+C to quit)
web_1    |  * Restarting with stat
web_1    |  * Debugger is active!
web_1    |  * Debugger PIN: 527-644-234
web_1    | 172.20.0.1 - - [29/May/2022 14:02:05] "GET / HTTP/1.1" 200 -
复制代码

(2)切换到另一个终端窗口,使用curl工具访问http://0.0.0.0:5000查看返回的消息。

[gqb@localhost ~]$ curl http://0.0.0.0:5000
Hello from Docker! I have been seen 1 times.

(3)再次执行上述命令(或者在浏览器上刷新页面),会发现次数增加。

[gqb@localhost ~]$ curl http://0.0.0.0:5000
Hello from Docker! I have been seen 2 times.

(4)执行docker images命令列出本地镜像。

[gqb@localhost ~]$ docker images
REPOSITORY      TAG          IMAGE ID       CREATED              SIZE
flask-web_web   latest       7d9877afb6bd   About a minute ago   60.6MB
redis           alpine       c3ea2db12504   3 days ago           28.4MB
python          3.7-alpine   7642396105af   3 days ago           45.5MB

(5)将工作目录切换到项目根目录,执行docker-compose down命令停止应用程序。也可以切回启动该应用的原终端窗口,按<Ctrl>+<C>组合键停止应用程序。

^CGracefully stopping... (press Ctrl+C again to force)
Stopping flask-web_web_1   ... done
Stopping flask-web_redis_1 ... done

五、编辑Compose文件添加绑定挂载

(1)编辑项目目录中的docker-compose.yml文件,为Web服务添加绑定挂载,如下所示。

复制代码
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  redis:
    image: "redis:alpine"
复制代码

六、使用DockerCompose重新构建并运行应用程序

(1)在项目目录中再次执行docker-compose up命令。

(2)切换到另一个终端窗口,使用curl工具访问http://0.0.0.0:5000查看返回的消息,发现计数还会增加,如下所示。

[gqb@localhost flask-web]$ curl http://0.0.0.0:5000
Hello from Docker! I have been seen 3 times.

七、升级应用程序

(1)更改app.py文件中的问候语并保存。例如,将其中的“Hello World!”消息改为“Hello from Docker!”。

(2)再次使用curl工具访问http://0.0.0.0:5000查看返回的消息,发现问候语句会风范,计数也还会增加,如下所示。

[gqb@localhost flask-web]$ curl http://0.0.0.0:5000
Hello from Docker! I have been seen 4 times.

(3)切换到执行docker-compose up命令的终端窗口,按<Ctrl>+<C>组合键停止应用程序。

八、试用其他Docker Compose命令

(1)如果要在后台运行服务,则可以在执行docker-compose up命令时加上-d选项,如下所示。

[gqb@localhost flask-web]$ docker-compose up -d
Starting flask-web_web_1   ... done
Starting flask-web_redis_1 ... done

(2)还可以执行docker-compose ps命令查看当前正在运行的服务。

[gqb@localhost flask-web]$ docker-compose ps
      Name                     Command               State                    Ports                  
-----------------------------------------------------------------------------------------------------
flask-web_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp                                
flask-web_web_1     python app.py                    Up      0.0.0.0:5000->5000/tcp,:::5000->5000/tcp

(3)还可以执行docker-compose run web env命令查看web服务的环境变量。

复制代码
[gqb@localhost flask-web]$ docker-compose run web env
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=dde90cff2d5f
TERM=xterm
LANG=C.UTF-8
GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D
PYTHON_VERSION=3.7.13
PYTHON_PIP_VERSION=22.0.4
PYTHON_SETUPTOOLS_VERSION=57.5.0
PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/a312303dbd516f6a692f2fee59852701bd828dd8/public/get-pip.py
PYTHON_GET_PIP_SHA256=8dd03e99645c19f49bbb629ce65c46b665ee92a1d94d246418bad6afade89f8d
HOME=/root
复制代码

最后执行以下命令停止应用程序,完全删除容器以及卷

[gqb@localhost flask-web]$ docker-compose down --volumes
Stopping flask-web_web_1   ... done
Stopping flask-web_redis_1 ... done
Removing flask-web_web_run_b2b716a32ed2 ... done
Removing flask-web_web_1                ... done
Removing flask-web_redis_1              ... done
Removing network flask-web_default

 

 

posted @   学习快乐快乐学习  阅读(658)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示