当前位置:   article > 正文

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

【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 文件包括以下几个部分:

  1. version: '3.8' # 指定 Docker Compose 文件格式版本
  2. services: # 定义应用的服务
  3. web:
  4. build: . # 构建 Dockerfile 所在的目录
  5. ports:
  6. - "5000:5000" # 映射端口
  7. volumes:
  8. - .:/code # 挂载卷
  9. environment:
  10. FLASK_ENV: development # 环境变量
  11. redis:
  12. image: "redis:alpine" # 使用现成的镜像
  13. volumes: # 定义数据卷
  14. db-data:
  15. networks: # 定义网络
  16. 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. 创建目录结构

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

  1. /myproject/
  2. |-- docker-compose.yml
  3. |-- nginx/
  4. | |-- Dockerfile
  5. | |-- nginx.conf
  6. |-- django_app/
  7. | |-- Dockerfile
  8. | |-- myapp/
  9. | |-- settings.py
  10. | |-- ...
  11. |-- .env

2. 创建 .env 文件

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

  1. MYSQL_DATABASE=mydatabase
  2. MYSQL_USER=myuser
  3. MYSQL_PASSWORD=mypassword
  4. MYSQL_ROOT_PASSWORD=rootpassword
  5. DJANGO_SECRET_KEY=mysecretkey

3. 编写 docker-compose.yml 文件

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

  1. version: '3.8'
  2. services:
  3. db:
  4. image: mysql:8
  5. command: --default-authentication-plugin=mysql_native_password
  6. volumes:
  7. - db-data:/var/lib/mysql
  8. environment:
  9. MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
  10. MYSQL_DATABASE: ${MYSQL_DATABASE}
  11. MYSQL_USER: ${MYSQL_USER}
  12. MYSQL_PASSWORD: ${MYSQL_PASSWORD}
  13. networks:
  14. - app-network
  15. web:
  16. build: ./django_app
  17. command: python manage.py runserver 0.0.0.0:8000
  18. volumes:
  19. - ./django_app:/usr/src/app
  20. environment:
  21. - DJANGO_SECRET_KEY=${DJANGO_SECRET_KEY}
  22. depends_on:
  23. - db
  24. networks:
  25. - app-network
  26. nginx:
  27. build: ./nginx
  28. ports:
  29. - "80:80"
  30. depends_on:
  31. - web
  32. networks:
  33. - app-network
  34. volumes:
  35. db-data:
  36. networks:
  37. app-network:

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

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

4. 创建 Django Dockerfile

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

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

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

5. 创建 Nginx Dockerfile 和配置

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

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

创建 nginx/nginx.conf 配置文件

  1. worker_processes 1;
  2. events {
  3. worker_connections 1024;
  4. }
  5. http {
  6. sendfile on;
  7. upstream app {
  8. server web:8000;
  9. }
  10. server {
  11. listen 80;
  12. location / {
  13. proxy_pass http://app;
  14. }
  15. }
  16. }

6. 运行 Docker Compose

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

docker-compose up -d

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/578267
推荐阅读
相关标签
  

闽ICP备14008679号