Compose容器编排示例

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除

目录如下:

一、从源代码开始构建、部署和管理应用程序

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

1.2、创建Dockerfile

1.3、在Compose文件中定义服务

[1.4、通过Docker Compose构建并运行应用程序](#1.4、通过Docker Compose构建并运行应用程序)

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

[1.6、使用Docker Compose重新构建并运行应用程序](#1.6、使用Docker Compose重新构建并运行应用程序)

1.7、升级应用程序

[1.8、试用其他Docker Compose命令](#1.8、试用其他Docker Compose命令)

[二. 更改Compose文件应用程序以适应不同环境](#二. 更改Compose文件应用程序以适应不同环境)

2.1、针对开发环境的配置

2.2、针对生产环境的配置

2.3、部署生产环境

[三. 针对Docker Compose 应用程序运行管理任务](#三. 针对Docker Compose 应用程序运行管理任务)

3.1、添加管理任务服务

3.2、运行数据库备份任务

致谢


一、从源代码开始构建、部署和管理应用程序

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

(1)创建项目目录并进入:

复制代码
 mkdir flask-web && cd flask-web

(2)创建app.py文件并添加以下代码:

cs 复制代码
 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文件并添加依赖:

cs 复制代码
 flask
 redis

1.2、创建Dockerfile

创建Dockerfile并添加以下内容:

cpp 复制代码
 FROM python:3.4-alpine
 ​
 # 将当前目录添加到镜像值的./code目录
 ADD . /code
 WORKDIR /code
 ​
 RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
 ​
 CMD ['python', 'app.py']

1.3、在Compose文件中定义服务

创建docker-compose.yml文件并添加以下内容:

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

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

启动应用程序:

cpp 复制代码
 [root@docker flask-web]# docker-compose up
 Creating network "flask-web_default" with the default driver
 Building web
 ...
 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 -

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

cpp 复制代码
 [root@docker flask-web]# curl http://0.0.0.0:5000
 Hello from Docker! I have been seen 1 times.

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

cpp 复制代码
 [root@docker flask-web]# curl http://0.0.0.0:5000
 Hello from Docker! I have been seen 2 times.

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

cpp 复制代码
[root@docker flask-web]# 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

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

cs 复制代码
^CGracefully stopping... (press Ctrl+C again to force)
Stopping flask-web_web_1   ... done
Stopping flask-web_redis_1 ... done

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

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

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

1.6、使用Docker Compose重新构建并运行应用程序

再次启动应用程序:

cpp 复制代码
docker-compose up

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

cpp 复制代码
[root@docker flask-web]# curl http://0.0.0.0:5000
Hello from Docker! I have been seen 3 times.

1.7、升级应用程序

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

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

cpp 复制代码
[root@docker flask-web]# curl http://0.0.0.0:5000
Hello from Docker! I have been seen 4 times.

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

1.8、试用其他Docker Compose命令

(1)在后台运行服务:

cpp 复制代码
[root@docker flask-web]# docker-compose up -d
Starting flask-web_web_1   ... done
Starting flask-web_redis_1 ... done

(2)查看当前正在运行的服务:

cpp 复制代码
[root@docker 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)查看Web服务的环境变量:

cpp 复制代码
[root@docker flask-web]# docker-compose run web env
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
...
HOME=/rootdocker-compose run web env

(4)停止应用程序并删除容器以及卷:

cs 复制代码
[root@docker 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

二. 更改Compose文件应用程序以适应不同环境

2.1、针对开发环境的配置

docker-compose.override.yml文件示例:

cpp 复制代码
web:
  build: .
  volumes:
    - './:/code'
  ports:
    - 8883:80
  environment:
    DEBUG: 'true'
db:
  command: '-d'
  ports:
    - 5432:5432
cache:
  ports:
    - 6379:6379

向主机公开一些端口,将代码进行绑定挂载,并构建Web镜像。执行docker-compose up命令会自动读取override文件。

2.2、针对生产环境的配置

docker-compose.prod.yml文件示例:

cpp 复制代码
web:
  ports:
    - 80:80
  environment:
    PRODUCTION: 'true'
cache:
  environment:
    TTL: '5000'

2.3、部署生产环境

使用以下命令部署:

cpp 复制代码
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

这将使用docker-compose.yml和docker-compose.prod.yml中的配置部署所有3个服务

三. 针对Docker Compose 应用程序运行管理任务

运行数据库备份应用程序:

3.1、添加管理任务服务

从基础的docker-compose.yml开始:

cpp 复制代码
web:
  images: example/my_web_app:latest
  links:
    - db
db:
  image: postgres:latest

在docker-compose.admin.yml文件添加一个新的服务,运行数据库导出或备份服务示例:

cs 复制代码
dbadmin:
  build: database_admin/
  links:
    - db

3.2、运行数据库备份任务

(1)启动常规环境:

cs 复制代码
docker-compose up -d

(2)运行数据库备份:

cs 复制代码
docker-compose -f docker-compose.yml -f docker-compose.admin.yml run dbadmin db-backup

致谢

在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。

学习永无止境,让我们共同进步!!

相关推荐
是江迪呀9 分钟前
关于记笔记的批评和自我批评
笔记·aigc·ai编程
不会代码的小猴24 分钟前
电机学笔记
笔记
程序员老陆1 小时前
FFmpeg 硬解在 Linux 上:从“能跑”到“跑满 GPU”的实战笔记
linux·笔记·ffmpeg
星恒随风1 小时前
Linux 权限详解:从 rwx、chmod 到 umask、目录权限与粘滞位
linux·运维·服务器·笔记·学习
AI大佬的小弟1 小时前
私有化 Dify 应用开发(3):Docker 核心原理与零基础实战
运维·docker·容器技术·ai 应用开发·私有化 ai 部署·docker 教程·dify 运维
一米阳光866110 小时前
软考(中级)软件设计师核心笔记(3)数据库系统——概念、数据库设计
数据库·笔记·职场发展·软考·软件设计师
BullSmall11 小时前
Anolis OS 8.10 Docker 部署 PostgreSQL 15 完整实操
docker·postgresql·容器
漏刻有时11 小时前
PHP GeoJSON转PNG地图渲染程序开发笔记、源码解读、问题复盘与整改方案
android·笔记·php
暗影凋落12 小时前
CMake构建学习笔记-SQLite库的构建
笔记·学习·sqlite
zzm62813 小时前
精读KDD 2017最佳论文:通过类比挖掘加速创新 | 阅读笔记
笔记