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

ops/2024/10/18 8:35:06/

文章目录

  • 部署Boost搜索引擎
    • Dockerfile
    • docker-compose.yml
      • 版本声明
      • 服务定义(services)
        • db 服务
        • redis 服务
        • webapp 服务
      • 数据卷定义(volumes)
      • 网络定义(networks)
  • 部署online judge
    • Dockerfile
    • docker-compose.yml
      • 版本声明
      • 服务定义
        • db服务
        • redis服务
        • server服务
        • compiler1, compiler2, compiler3服务
      • 数据卷
      • 网络定义
      • 总结

本篇主要是利用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++-devRUN git clone https://gitcode.com/sewenew/redis-plus-plus.git
WORKDIR /redis-plus-plus/build
RUN cmake ..
RUN make
RUN make installWORKDIR /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端口。

dockercomposeyml_100">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.sqlnetworks:- my_custom_networkredis:  image: redis:latestrestart: alwaysnetworks:- my_custom_networkwebapp:  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: redisREDIS_PORT: 6379depends_on:  - db  - redisnetworks:- my_custom_networkvolumes:  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++-devWORKDIR /RUN git clone https://gitcode.com/sewenew/redis-plus-plus.git
WORKDIR /redis-plus-plus/build
RUN cmake ..
RUN make
RUN make installWORKDIR /RUN git clone https://gitee.com/mirrors_OlafvdSpek/ctemplate.git
WORKDIR /ctemplate
RUN ./autogen.sh
RUN ./configure
RUN make
RUN make installWORKDIR /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端口)。通过使用特定的构建步骤和库,该镜像确保了应用运行所需的全部依赖都被正确安装和配置。

dockercomposeyml_331">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.sqlnetworks:- 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_networkredis:  image: redis:latestrestart: alwaysnetworks:- my_custom_networkserver:build:context: .dockerfile: Dockerfile.serverports:- "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: redisREDIS_PORT: 6379REDIS_NAME: redisdepends_on:  - db  - redis- compiler1- compiler2- compiler3networks:- my_custom_networkcompiler1:build:context: .dockerfile: Dockerfile.compile1networks:- my_custom_networkcompiler2:build:context: .dockerfile: Dockerfile.compile2networks:- my_custom_networkcompiler3:build:context: .dockerfile: Dockerfile.compile3networks:- my_custom_networkvolumes:  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,同时依赖于多个编译器服务协同工作。


http://www.ppmy.cn/ops/50054.html

相关文章

Qt进程间通信QLocalSocket客户端无法接收消息

问题背景及排查: 使用QLocalSocket和QLocalServer实现进程间通信,客户端和服务端连接建立成功,服务端消息发送也正常,但客户端无法接收服务端发送过来的消息。 客户端连接建立成功示例代码: //接收; m_Recevier_Soc…

最佳Google Chrome扩展和Mozilla Firefox扩展自动解决验证码

在这个信息爆炸的时代,我们每天都要处理大量的在线内容,验证码已成为不可避免的挑战。尽管它们旨在保护网站安全,但也常常成为我们获取信息的障碍。那么,有没有更简单的方法绕过这些验证码呢?答案是肯定的。通过使用一…

Java:113-Spring Data JPA详解

Spring Data JPA详解 Spring Data Jpa 是应用于Dao层的⼀个框架,简化数据库开发的,作用和Mybatis框架⼀样,但是在使用方式和底层机制是有所不同的,最明显的⼀个特点,Spring Data Jpa 开发Dao的时候,很多场景…

C++ 实现HTTP的客户端、服务端demo和HTTP三方库介绍

本文使用C模拟实现http的客户端请求和http的服务端响应功能,并介绍几种封装HTTP协议的三方库。 1、实现简单HTTP的服务端功能 本程序使用C tcp服务端代码模拟HTTP的服务端,服务端返回给客户端的消息内容按照HTTP协议的消息响应格式进行了组装。 demo如…

鸿蒙轻内核A核源码分析系列四(3) 虚拟内存

4.2 函数LOS_RegionAlloc 函数LOS_RegionAlloc用于从地址空间中申请空闲的虚拟地址区间。参数较多,LosVmSpace *vmSpace指定虚拟地址空间,VADDR_T vaddr指定虚拟地址,当为空时,从映射区申请虚拟地址;当不为空时&#…

JDBC使用与操作

项目创建 新建maven项目,导入MySQL的驱动包.pom文件如下 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLo…

Pytorch深度解析:Transformer嵌入层源码逐行解读

前言 本部分博客需要先阅读博客&#xff1a; 《Transformer实现以及Pytorch源码解读&#xff08;一&#xff09;-数据输入篇》 作为知识储备。 Embedding使用方式 如下面的代码中所示&#xff0c;embedding一般是先实例化nn.Embedding(vocab_size, embedding_dim)。实例化的…

2024全新仿麻豆视频苹果cms源码v10影视模板

下载地址&#xff1a;2024全新仿麻豆视频苹果cms源码v10影视模板 高端大气的设计&#xff0c;适合做电影、连续剧、综艺、动漫、微电影、纪录片、海外剧等视频网站