• Docker:使用Docker自动化部署项目


    本篇主要是利用Docker为我的两个项目进行添加自动化部署

    部署Boost搜索引擎

    Dockerfile

    对于部署来说,要先使用Dockerfile把镜像完善好:

    # 使用Ubuntu 22.04作为基础镜像,包含C++编译器
    FROM ubuntu:22.04 AS builder
    
    # 更换软件源
    RUN sed -i 's/archive.ubuntu.com/mirrors.tencentyun.com/g' /etc/apt/sources.list
    RUN sed -i 's/security.ubuntu.com/mirrors.tencentyun.com/g' /etc/apt/sources.list
    
    # 更新系统包并安装构建工具和必要的库
    RUN apt update
    RUN apt install -y \
        g++ \
        make \
        libboost-all-dev \
        libjsoncpp-dev \
        git \
        redis-server \
        libhiredis-dev \
        cmake \
        mysql-server \
        libmysql++-dev
    
    RUN git clone https://gitcode.com/sewenew/redis-plus-plus.git
    WORKDIR /redis-plus-plus/build
    RUN cmake ..
    RUN make
    RUN make install
    
    WORKDIR /
    
    RUN git clone https://gitcode.com/nlohmann/json.git
    RUN cp -r json/include/* /usr/local/include/
    
    RUN rm -rf /var/lib/apt/lists/*
    
    # 设置工作目录
    WORKDIR /usr/src/app
    
    # 将项目源码复制到容器中
    COPY . .
    
    # 编译项目
    RUN make clean
    RUN make
    
    # 暴露端口
    EXPOSE 8081
    
    # 启动命令,直接指定可执行文件名
    CMD ["./http_server"]
    

    这是一个Dockerfile的内容,用于构建一个基于Ubuntu 22.04操作系统的Docker镜像,主要目的是部署一个C++编写的应用程序,该程序似乎是一个HTTP服务器。以下是逐行的解释:

    1. FROM ubuntu:22.04 AS builder
      使用官方Ubuntu 22.04 LTS(长期支持)版本作为基础镜像,并标记这一阶段为builder。这意味着此镜像将用于构建过程。

    2. 接下来的两个RUN sed命令
      更改APT(Advanced Package Tool)的软件源地址,由默认的Ubuntu仓库地址更改为腾讯云的镜像源,这通常是为了加速在中国地区的软件包下载速度。

    3. RUN apt update && …
      更新软件包列表并安装一系列开发和运行时所需的软件包,包括G++(C++编译器)、make(用于编译源代码)、Boost库、jsoncpp库(用于处理JSON数据)、Git(版本控制系统)、Redis服务器及其开发库、CMake(用于构建C++项目)、MySQL服务器及其C++连接库等。

    4. 克隆并构建redis-plus-plus

      • 克隆redis-plus-plus仓库,这是一个高性能的C++ Redis客户端。
      • 切换到redis-plus-plusbuild目录,执行CMake配置、编译以及安装步骤,以便在系统中安装此库。
    5. 克隆nlohmann/json
      克隆nlohmann/json库,这是一个流行的C++ JSON解析库。然后将该库的头文件复制到/usr/local/include/目录,使得这些头文件对系统全局可见。

    6. RUN rm -rf /var/lib/apt/lists/*:
      删除APT的缓存和列表文件,以减少最终镜像的大小。

    7. WORKDIR /usr/src/app
      设置工作目录为/usr/src/app,这通常是项目源代码放置的地方。

    8. COPY . .
      复制当前目录下的所有文件到容器中的工作目录,即将应用的源代码复制进容器。

    9. RUN make clean && RUN make
      执行make clean清理之前可能存在的编译产物,然后重新编译项目。

    10. EXPOSE 8081
      声明容器将在8081端口上监听,为外界提供服务访问入口。

    11. CMD [“./http_server”]
      指定容器启动时运行的命令,即直接执行名为http_server的可执行文件,这应该是应用的主进程,负责启动HTTP服务器。

    总结起来,这个Dockerfile构建了一个包含特定C++应用程序的环境,该程序依赖于Redis、JSON处理能力,可能还涉及MySQL数据库交互,并且在容器启动后自动运行一个HTTP服务器监听8081端口。

    docker-compose.yml

    之后要使用Compose编排,对于这个项目所需要的三个部分:web服务,Redis,MySQL进行编排

    version: '3.8'  
    
    services:  
      db:  
        image: mysql:5.7  
        restart: always  
        environment:  
          MYSQL_ROOT_PASSWORD: ZBH123456  
          MYSQL_DATABASE: boost_search  
          MYSQL_USER: zbh123  
          MYSQL_PASSWORD: ZBH12345678  
        volumes:  
          - ./init.sql:/docker-entrypoint-initdb.d/init.sql
        networks:
          - my_custom_network
    
      redis:  
        image: redis:latest
        restart: always
        networks:
          - my_custom_network
    
      webapp:  
        build: .
        restart: always  
        ports:  
          - "10000:8081"  
        environment:  
          DB_HOST: db  
          DB_PORT: 3306  
          DB_NAME: boost_search  
          DB_USER: zbh123  
          DB_PASSWORD: ZBH12345678  
          REDIS_NAME: redis
          REDIS_PORT: 6379
        depends_on:  
          - db  
          - redis
        networks:
          - my_custom_network
      
    volumes:  
      db_data:  
      
    networks:
      my_custom_network:
        driver: bridge
    

    下面是对于这个docker-compose文件的解释:

    这是一个用于Docker Compose的YAML配置文件,版本为3.8。Docker Compose是一个工具,允许用户在一个YAML文件中定义和配置多个Docker容器以及它们之间的依赖关系,从而简化了多容器应用的部署和服务管理。下面是对该配置文件各部分的详细解释:

    版本声明

    version: '3.8'
    

    指定了Docker Compose文件的版本,这里是3.8。不同的版本可能支持不同的功能特性。

    服务定义(services)

    services:
      db:
        # ...
      redis:
        # ...
      webapp:
        # ...
    

    这部分定义了三个服务:db(数据库服务,使用MySQL)、redis(缓存服务,使用Redis)和webapp(Web应用程序服务)。

    db 服务
    • image: mysql:5.7 指定使用MySQL 5.7镜像。
    • restart: always 表示容器总是会在退出后重启。
    • environment: 设置环境变量,包括数据库的根密码、数据库名、用户名和密码。
    • volumes: 映射本地./init.sql文件到容器内的/docker-entrypoint-initdb.d/init.sql,用于初始化数据库。
    • networks: 将服务加入自定义网络my_custom_network
    redis 服务
    • image: 使用最新版Redis镜像。
    • restart: 同上,设置为始终重启。
    • networks: 加入my_custom_network网络。
    webapp 服务
    • build: 使用当前目录下的Dockerfile构建镜像。
    • restart: 设置为始终重启。
    • ports: 映射宿主机的10000端口到容器的8081端口,用于访问Web应用。
    • environment: 设置环境变量,包括数据库连接信息和Redis连接信息。
    • depends_on: 指定webapp服务依赖于dbredis服务,确保这两个服务先启动。
    • networks: 加入my_custom_network网络。

    数据卷定义(volumes)

    volumes:
      db_data:
    

    定义了一个名为db_data的数据卷,但在这个配置中未直接使用。通常用于持久化数据库数据,但这里可能是预留或注释掉了实际挂载点。

    网络定义(networks)

    networks:
      my_custom_network:
        driver: bridge
    

    定义了一个自定义网络my_custom_network,类型为bridge(桥接网络)。所有服务都连接到这个网络,允许它们之间通过服务名称相互通信,而无需暴露不必要的端口到宿主机网络。

    总结起来,这个Docker Compose配置文件定义了一个包含MySQL数据库、Redis缓存和一个Web应用程序的多容器环境,各个服务通过自定义网络互联,并且具备自动重启、环境变量配置和端口映射等特性,适合快速搭建和部署一个具备数据库和缓存支持的Web应用开发或测试环境。

    部署online judge

    Dockerfile

    # 使用Ubuntu 22.04作为基础镜像,包含C++编译器
    FROM ubuntu:22.04 AS builder
    
    # 更换软件源
    RUN sed -i 's/archive.ubuntu.com/mirrors.tencentyun.com/g' /etc/apt/sources.list
    RUN sed -i 's/security.ubuntu.com/mirrors.tencentyun.com/g' /etc/apt/sources.list
    
    # 更新系统包并安装构建工具和必要的库
    RUN apt update
    RUN apt install -y \
        g++ \
        make \
        libboost-all-dev \
        libjsoncpp-dev \
        git \
        redis-server \
        libhiredis-dev \
        cmake \
        mysql-server \
        libmysql++-dev
    
    WORKDIR /
    
    RUN git clone https://gitcode.com/sewenew/redis-plus-plus.git
    WORKDIR /redis-plus-plus/build
    RUN cmake ..
    RUN make
    RUN make install
        
    WORKDIR /
    
    RUN git clone https://gitee.com/mirrors_OlafvdSpek/ctemplate.git
    WORKDIR /ctemplate
    RUN ./autogen.sh
    RUN ./configure
    RUN make
    RUN make install
    
    WORKDIR /
    
    RUN git clone https://gitcode.com/nlohmann/json.git
    RUN cp -r json/include/* /usr/local/include/
    
    RUN rm -rf /var/lib/apt/lists/*
    
    # 设置工作目录
    WORKDIR /usr/src/app
    
    # 将项目源码复制到容器中
    COPY . .
    
    # 设置 LD_LIBRARY_PATH 环境变量  
    ENV LD_LIBRARY_PATH=/usr/local/lib:/usr/lib64:/lib64:/usr/lib:/lib:/opt/lib:$LD_LIBRARY_PATH 
    
    # 编译项目
    RUN make
    RUN make output
    
    # 现在运行oj_server服务
    WORKDIR /usr/src/app/output/oj_server
    
    # 暴露端口
    EXPOSE 8080
    
    # 启动命令,直接指定可执行文件名
    CMD ["./oj_server"]
    

    这是一个Dockerfile的内容,用于构建一个包含特定C++应用程序的Docker镜像。下面是对每一行指令的解释:

    1. FROM ubuntu:22.04 AS builder
      从Ubuntu 22.04镜像开始构建,并标记此阶段为“builder”。这将作为后续构建步骤的基础环境,包含了C++编译器。

    2. 接下来的两个RUN命令
      修改系统的软件源列表,用腾讯云的镜像源替换默认的Ubuntu源,以提高在中国地区的下载速度和稳定性。

    3. RUN apt update && …
      更新软件包列表,并安装一系列构建工具和库,包括但不限于g++(C++编译器)、make(构建工具)、Boost库、jsoncpp库、git、Redis服务器及其开发库、CMake、MySQL服务器及其C++开发库等。

    4. WORKDIR /
      设置工作目录为根目录。

    5. 接下来的几个RUN命令

      • 克隆redis-plus-plus仓库,构建并安装它。这是一个基于C++的Redis客户端库。
      • 克隆ctemplate仓库,这是Google的模板库,用于快速生成文本输出。执行配置、编译和安装步骤。
      • 克隆nlohmann/json仓库,然后将其头文件复制到系统默认的包含路径,以便于其他项目使用。
    6. RUN rm -rf /var/lib/apt/lists/*:
      清理下载的软件包列表和缓存,减小最终镜像的大小。

    7. WORKDIR /usr/src/app
      切换工作目录至应用代码的预期位置。

    8. COPY . .
      将当前目录下的所有文件复制到容器内的/usr/src/app目录下,即把项目源代码复制进容器。

    9. ENV LD_LIBRARY_PATH=…
      设置环境变量LD_LIBRARY_PATH,指向包含库文件的目录,确保动态链接时能找到这些库。

    10. RUN make && RUN make output
      编译项目并执行特定的构建目标(假设项目中有相应的Makefile规则来处理这些命令)。

    11. WORKDIR /usr/src/app/output/oj_server
      进入到可执行文件所在的目录,这里假设oj_server是编译输出的可执行文件。

    12. EXPOSE 8080
      声明容器将在8080端口上监听,便于外部访问服务。

    13. CMD [“./oj_server”]
      容器启动时执行的命令,直接运行oj_server可执行文件。

    综上所述,这个Dockerfile用于创建一个自定义的Docker镜像,其中集成了Redis客户端、CTemplate库、nlohmann/json库,并编译安装了一个名为oj_server的应用程序,对外提供HTTP服务(监听8080端口)。通过使用特定的构建步骤和库,该镜像确保了应用运行所需的全部依赖都被正确安装和配置。

    docker-compose.yml

    version: '3.8'  
    
    services:
      db:  
        image: mysql:5.7  
        restart: always  
        environment:  
          MYSQL_ROOT_PASSWORD: ZBH123456  
          MYSQL_DATABASE: oj  
          MYSQL_USER: zbh  
          MYSQL_PASSWORD: 123456  
        volumes:  
          - ./init.sql:/docker-entrypoint-initdb.d/init.sql
        networks:
          - my_custom_network
    
      # db:  
      #   image: mysql:5.7  
      #   restart: always  
      #   environment:  
      #     MYSQL_ROOT_PASSWORD: ZBH123456  
      #     MYSQL_DATABASE: boost_search  
      #     MYSQL_USER: zbh123  
      #     MYSQL_PASSWORD: ZBH12345678  
      #   volumes:  
      #     - ./init.sql:/docker-entrypoint-initdb.d/init.sql
      #   networks:
      #     - my_custom_network
    
      redis:  
        image: redis:latest
        restart: always
        networks:
          - my_custom_network
    
      server:
        build:
          context: .
          dockerfile: Dockerfile.server
        ports:
          - "9999:8080"
        environment:  
          DB_HOST: db  
          DB_PORT: 3306  
          DB_NAME: oj  
          DB_USER: zbh  
          DB_PASSWORD: 123456  
          # DB_HOST: db  
          # DB_PORT: 3306  
          # DB_NAME: boost_search  
          # DB_USER: zbh123  
          # DB_PASSWORD: ZBH12345678  
          REDIS_HOST: redis
          REDIS_PORT: 6379
          REDIS_NAME: redis
        depends_on:  
          - db  
          - redis
          - compiler1
          - compiler2
          - compiler3
        networks:
          - my_custom_network
    
      compiler1:
        build:
          context: .
          dockerfile: Dockerfile.compile1
        networks:
          - my_custom_network
    
      compiler2:
        build:
          context: .
          dockerfile: Dockerfile.compile2
        networks:
          - my_custom_network
    
      compiler3:
        build:
          context: .
          dockerfile: Dockerfile.compile3
        networks:
          - my_custom_network
      
    volumes:  
      db_data:  
      
    networks:
      my_custom_network:
        driver: bridge
    

    这是一个Docker Compose的配置文件,用于定义一组相互关联的Docker服务,协同工作以构成一个完整的应用环境。下面是该配置文件的详细解释:

    版本声明

    version: '3.8'指定了使用Docker Compose的版本3.8,这个版本提供了服务编排和服务网络的高级特性。

    服务定义

    db服务
    • image: 使用mysql:5.7镜像作为数据库服务。
    • restart: 设置为always,意味着当容器停止或崩溃时,Docker会自动重启该容器。
    • environment: 配置MySQL的环境变量,包括root用户的密码、数据库名、用户名及密码。
    • volumes: 映射本地的./init.sql文件到容器内的/docker-entrypoint-initdb.d/init.sql,用于数据库初始化。
    • networks: 加入自定义网络my_custom_network,便于服务间通信。
    redis服务
    • 使用redis:latest镜像作为Redis缓存服务,配置与db服务类似,具有自动重启和网络配置。
    server服务
    • build: 通过指定上下文目录.和Dockerfile文件Dockerfile.server来构建镜像。
    • ports: 映射容器的8080端口到宿主机的9999端口,供外部访问。
    • environment: 设置环境变量,用于连接数据库和Redis服务,注意这里使用了oj数据库的相关配置。
    • depends_on: 表明server服务依赖于dbredis、以及三个compiler服务,确保这些依赖服务先启动。
    • networks: 同样加入my_custom_network
    compiler1, compiler2, compiler3服务
    • 分别通过不同的Dockerfile(Dockerfile.compile1, Dockerfile.compile2, Dockerfile.compile3)构建,用于编译任务,每个服务也加入到了相同的网络中。

    数据卷

    • db_data: 虽然定义了数据卷,但在db服务中没有直接使用,通常这样的数据卷用于持久化数据库数据,避免数据丢失。

    网络定义

    • my_custom_network: 定义了一个自定义网络,类型为bridge(桥接网络),用于服务间的通信隔离与连接。

    总结

    该Docker Compose配置设计了一个包含MySQL数据库、Redis缓存、一个主服务器应用以及三个独立编译器服务的环境。这些服务共享一个自定义网络,可以相互通信,并且数据库服务的数据可以通过数据卷持久化。服务器应用能够访问数据库和Redis,同时依赖于多个编译器服务协同工作。

  • 相关阅读:
    弹窗、抽屉、页面跳转区别 | web交互入门
    【Web】CSS学习笔记之浮动*
    CesiumJS PrimitiveAPI 高级着色入门 - 从参数化几何与 Fabric 材质到着色器 - 下篇
    springboot动态切换数据源
    机器学习【KNN案例、API、总结】
    WebRTC音视频通话-WebRTC视频自定义RTCVideoCapturer相机
    【 构建maven工程时,配置了阿里云的前提下,依旧使用中央仓库下载依赖导致失败的问题!】
    深度解读《深度探索C++对象模型》之C++对象的内存布局
    MySQL入门第六天——函数与条件查询
    使用github copilot
  • 原文地址:https://blog.csdn.net/qq_73899585/article/details/139662610