【DevOps】使用Docker Compose 部署Web应用

一、Docker Compose介绍

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过一个 YAML 文件,您可以配置应用服务所需的所有服务,然后使用一个命令创建并启动所有服务。这种方式极大地简化了容器化应用的管理过程,尤其是在涉及多个相互依赖的容器时。

1、核心特点

  • 单一配置文件:使用一个 YAML 文件(默认为 docker-compose.yml)来配置应用的所有服务。这个文件定义了需要运行的服务、网络和卷。

  • 服务管理:Docker Compose 允许您以群组的形式管理整个应用的服务,可以同时启动、停止、重建所有服务。

  • 开发环境友好:特别适用于开发和测试环境,能够快速启动和重建改动过的应用服务。

  • 隔离:每个使用 Docker Compose 的项目可以在隔离环境中运行,保持与其他项目的独立。

  • 可移植性:通过在任何安装了 Docker 和 Docker Compose 的机器上运行相同的 docker-compose.yml 文件,可以确保环境一致性和可重复性。

2、基本命令

  • docker-compose up:启动配置文件中定义的所有容器。
  • docker-compose down:停止并移除所有由 docker-compose up 创建的容器和网络。
  • docker-compose build:构建服务中定义的镜像。
  • docker-compose logs:查看所有容器的日志输出。
  • docker-compose restart:重启服务。
  • docker-compose ps:列出所有正在运行的容器。

3、docker-compose.yml 文件结构

一个典型的 docker-compose.yml 文件包括以下几个部分:

version: '3.8'  # 指定 Docker Compose 文件格式版本
services:  # 定义应用的服务
  web:
    build: .  # 构建 Dockerfile 所在的目录
    ports:
      - "5000:5000"  # 映射端口
    volumes:
      - .:/code  # 挂载卷
    environment:
      FLASK_ENV: development  # 环境变量
  redis:
    image: "redis:alpine"  # 使用现成的镜像

volumes:  # 定义数据卷
  db-data:

networks:  # 定义网络
  app-network:

4、安装

  • 检查是否已经安装 Docker

首先,确保你已经安装了 Docker。可以使用以下命令来检查:

docker --version

如果你已经安装了 Docker,可以跳过下一步。

  • 安装 Docker Compose

可以使用以下命令来安装 Docker Compose:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

这将下载并安装最新版本的 Docker Compose。

  • 设置执行权限

将执行权限添加到 docker-compose 文件:

sudo chmod +x /usr/local/bin/docker-compose
  •  验证安装

可以使用以下命令来验证 Docker Compose 的安装:

docker-compose --version

这将显示 Docker Compose 的版本号。

5、使用场景

Docker Compose 在开发、测试、CI/CD 环境中尤为有用,可以用来:

  • 本地开发:开发者可以在本地机器上使用 Docker Compose 启动整个应用的所有服务,包括应用服务器、数据库、缓存服务等,所有服务都在隔离的环境中运行,但能够相互通信。

  • 自动化测试:在 CI/CD 管道中,可以使用 Docker Compose 启动应用和其依赖的服务,运行测试套件。

  • 多服务应用部署:在生产环境中,尽管 Docker Compose 主要用于开发和测试,但对于小规模部署或者较少的生产负载也可以使用。

Docker Compose 是一个强大的工具,能够简化多容器应用的配置和管理。使用 YAML 文件定义服务使得整个过程变得直观且易于控制,是开发和测试多容器应用的理想选择。

二、使用Docker Compose 部署一个Web应用

前面我们用Python3的Django开发了一个简单的Web应用HelloWorld,今天我们来一起学习怎么样用Docker Compose部署这个应用。一个典型的Web应用,一般有Nginx作为Web应用服务器,Django 应用和Mysql数据库三个部分组成,为了使用 Docker Compose 部署一个包含 Nginx、Django 应用和 MySQL 数据库的 Web 应用,我们需要创建一个 docker-compose.yml 文件来定义服务、网络和卷。下面是一个基本的配置示例,涵盖了一个 Django 应用,使用 Nginx 作为 Web 服务器和反向代理,以及 MySQL 作为数据库。

1. 创建目录结构

首先,建立一个项目目录,并在其中创建必要的文件:

/myproject/
|-- docker-compose.yml
|-- nginx/
|   |-- Dockerfile
|   |-- nginx.conf
|-- django_app/
|   |-- Dockerfile
|   |-- myapp/
|       |-- settings.py
|       |-- ...
|-- .env

2. 创建 .env 文件

创建一个 .env 文件来存储环境变量,例如数据库配置信息,以便在 docker-compose.yml 中引用:

MYSQL_DATABASE=mydatabase
MYSQL_USER=myuser
MYSQL_PASSWORD=mypassword
MYSQL_ROOT_PASSWORD=rootpassword
DJANGO_SECRET_KEY=mysecretkey

3. 编写 docker-compose.yml 文件

在项目根目录下创建 docker-compose.yml 文件:

version: '3.8'

services:
  db:
    image: mysql:8
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - db-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    networks:
      - app-network

  web:
    build: ./django_app
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - ./django_app:/usr/src/app
    environment:
      - DJANGO_SECRET_KEY=${DJANGO_SECRET_KEY}
    depends_on:
      - db
    networks:
      - app-network

  nginx:
    build: ./nginx
    ports:
      - "80:80"
    depends_on:
      - web
    networks:
      - app-network

volumes:
  db-data:

networks:
  app-network:

下面是对文件中各个部分的详细解释:

version: '3.8'
  • version 指定了使用的 Docker Compose文件的版本。
services:
  db:
    image: mysql:8
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - db-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    networks:
      - app-network
  • db 服务表示一个 MySQL 数据库容器。
    • image 指定了使用的 MySQL 镜像。
    • command 指定了容器启动时运行的命令。
    • volumes 指定了将本地的 db-data 卷挂载到容器的 /var/lib/mysql 目录。
    • environment 指定了容器的环境变量。
    • networks 指定了容器加入的网络。
  web:
    build: ./django_app
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - ./django_app:/usr/src/app
    environment:
      - DJANGO_SECRET_KEY=${DJANGO_SECRET_KEY}
    depends_on:
      - db
    networks:
      - app-network
  • web 服务表示一个 Django 应用程序容器。
    • build 指定了使用本地的 Django 项目目录构建镜像。
    • command 指定了容器启动时运行的命令。
    • volumes 指定了将本地的 django_app 目录挂载到容器的 /usr/src/app 目录。
    • environment 指定了容器的环境变量。
    • depends_on 指定了 web 服务依赖于 db 服务。
    • networks 指定了容器加入的网络。
  nginx:
    build: ./nginx
    ports:
      - "80:80"
    depends_on:
      - web
    networks:
      - app-network
  • nginx 服务表示一个 Nginx 配置容器。
    • build 指定了使用本地的 nginx 配置目录构建镜像。
    • ports 指定了将容器的 80 端口映射到主机的 80 端口。
    • depends_on 指定了 nginx 服务依赖于 web 服务。
    • networks 指定了容器加入的网络。
volumes:
  db-data:

networks:
  app-network:
  • volumes 部分定义了一个名为 db-data 的卷。
  • networks 部分定义了一个名为 app-network 的网络。

4. 创建 Django Dockerfile

在 django_app/Dockerfile 中,编写用于构建 Django 应用的 Dockerfile:

FROM python:3.8
ENV PYTHONUNBUFFERED 1
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY . .

确保 Django 项目的 requirements.txt 包含 Django 和任何其他依赖。

5. 创建 Nginx Dockerfile 和配置

在 nginx/Dockerfile 中,编写用于构建 Nginx 镜像的 Dockerfile:

FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf

创建 nginx/nginx.conf 配置文件:

worker_processes 1;

events {
    worker_connections 1024;
}

http {
    sendfile on;
    upstream app {
        server web:8000;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://app;
        }
    }
}

6. 运行 Docker Compose

在项目根目录,运行以下命令来启动所有服务:

docker-compose up -d

这将根据 docker-compose.yml 的配置启动 Django 应用、Nginx 和 MySQL 数据库的容器,并设置好它们之间的网络连接。

这个设置是一个简单的示例,适用于开发环境。在生产环境中,您需要对 Django 进行额外配置(如静态文件服务、数据库连接等),并确保安全性设置(如数据库的安全配置、Nginx 的 HTTPS 配置等)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/591509.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开了个新店!

大家好,我是麦鸽。 一言难尽,五一之前,把大A里的钱都提出来了,又整了一个新的小店。熟悉我的老读者应该都知道,我主业是做嵌入式的,后面慢慢转了技术管理的路线。平时也搞点副业,餐饮店就是其中…

关于链表带环问题为什么要用快慢指针

判断链表是否带环 题目描述 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连…

定制开发AI名片商城AI导购系统:引领营销自动化的新时代

在数字营销日新月异的今天,一个革命性的工具——定制开发AI名片商城AI导购系统,正逐渐崭露头角,成为企业私域运营中的得力助手。它不仅仅是一个营销工具,更是一个拥有强大营销自动化能力和先进算法技术的在线助理,为企…

Ubuntu 域名解析出现暂时性错误

Ubuntu 域名解析出现暂时性错误 问题描述解决方案 问题描述 由于在Ubuntu系统里面经常切换网络导致,系统一直处于有线网络连接但是没网状态,尝试ping网络也无法完成,尝试了很多方法均不能解决 解决方案 点击”虚拟机“ 按照要求设置好即可…

Java | Spring框架 | BeanFactory与ApplicationContext

Spring容器:BeanFactory与ApplicationContext Spring容器是Spring框架的核心,负责实例化、配置和组装Bean。 Spring容器有两种主要类型:BeanFactory和ApplicationContext。 一、BeanFactory 基本功能:BeanFactory是Spring框架…

【数据库原理及应用】期末复习汇总高校期末真题试卷02

试卷 一、填空题 数据库系统是指计算机系统中引入数据库后的系统,一般由数据库、________、应用系统、数据库管理员和用户构成。当数据库的存储结构发生了改变,由数据库管理员对________映象作相应改变,可以使________保持不变,…

牛客热题:两个链表的第一个公共节点

📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题:两个链表的第一个公共节点题目链…

目标检测算法YOLOv5简介

没有关于YOLOv5的直接论文,YOLOv5由Ultralytics维护,源码见:https://github.com/ultralytics/yolov5 ,于2020年6月发布v1.0版本,最新发布版本为v7.0,License为AGPL-3.0. 以下内容主要来自: 1. U…

STM32的TIM输入捕获和PWMI详解

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. IC输入捕获 2. 频率测量 3. 主模式、从模式、触发源选择 4. 输入捕获基本结构 5. PWMI模式 6. 代码示例 6.1 PWM.c 6.2 PWM.h 6.3 IC.c 6.4 IC.h 6.5 完整工程文件 输出比较可以看下面这篇…

ORAN C平面优化

使用section扩展6的C平面优化 在时域和频域中,都可以使用section扩展6进行非连续PRB分配。Section扩展6有两个位掩码:symbolMask和rbgMask。使用symbolMask可以选择一个slot内任意的symbol子集。使用rbgMask可以选择startPrbc和(startPrbc …

Android版本依赖Version catalog

曾经我们使用config.gradle文件进行版本依赖配置,然后在project的build.gradle.kts中使用如下方式引入: apply(from "./config.gradle") 缺点:在project的module中引用无任何提示,无法跳转到指定引用 一、创建versio…

Go-变量

可以理解为一个昵称 以后这个昵称就代指这些信息 var sg string "czy" 声明赋值 package mainimport "fmt"func main() {var sg string "陈政洋"fmt.Println(sg)var age int 73fmt.Println(age)var flag bool truefmt.Println(flag) } …

服务网关GateWay原理

文章目录 自动装配核心类GatewayAutoConfigurationDispatcherHandler请求处理阶段apply方法httpHandler#handle方法WebHandler#handle方法DispatchHanlder#handle方法第一步 getHandler获取请求映射第二步 invokeHandler 请求适配第三步 handleResult请求处理总结 上一篇博文我…

【刷题篇】回溯算法floodfill(七)

文章目录 1、太平洋大西洋水流问题2、扫雷游戏3、衣橱整理 1、太平洋大西洋水流问题 有一个 m n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形…

Python 全栈体系【四阶】(三十九)

第五章 深度学习 八、目标检测 3. 目标检测模型 3.2 YOLO 系列 3.2.4 YOLOv4(2020 年 4 月) YOLOv4 将最近几年 CV 界大量的研究成果集中在一套模型中,从检测速度、精度、定位准确率上有了明显改善(相对于 YOLOv3&#xff0c…

基于Springboot的家具网站

基于SpringbootVue的家具网站设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页 商家 家具信息 家居资讯 后台管理 后台首页 用户管理 商家管理 家具类型管理 家具…

ASV1000视频监控平台:通过SDK接入海康网络摄像机IPC

目录 一、为何要通过SDK接入海康网络摄像机 (一)海康网络摄像机的SDK的功能 1、视频采集和显示 2、视频存储 3、视频回放 4、报警事件处理 5、PTZ控制 6、自定义设置 7、扩展功能 (二)通过SDK接入的好处(相对…

JavaEE初阶-多线程易忘点总结

文章目录 1.PCBPID文件描述符表内存指针状态上下文优先级记账信息tgid 2.线程与进程的区别3.sleep和interrupt方法的关系变量终止线程interrupt方法终止线程 4.线程状态5.出现线程不安全的原因线程在系统中是随即调度,抢占式执行的。多个线程修改同一个变量线程针对…

Adobe 更新 Firefly Image 3 图像生成模型

一个工具或者模型,对于初次使用的人来说,易用性和超出预期的效果很能吸引使用者,suno和mj在这方面我感觉确实不错,第一次使用感觉很惊艳。 Adobe 更新 Firefly Image 3 图像生成模型,我用了mj的提示词,最后…

列转行(spark 与presto语法)

一、Presto 语法 原始数据: 期望数据: 代码: SELECT info, value FROM ( select 张三 as name,18 as age,男 as gender,清华 as schoolunion allselect 李四 as name,18 as age,男 as gender,清华 as school ) as a CROSS JOIN UNNEST(…
最新文章