使用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

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律