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,同时依赖于多个编译器服务协同工作。

相关推荐

  1. Docker使用Docker自动化部署项目

    2024-06-14 11:12:03       25 阅读
  2. 使用Docker 部署jenkins 实现自动化部署

    2024-06-14 11:12:03       37 阅读
  3. docker自动化部署示例

    2024-06-14 11:12:03       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-14 11:12:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-14 11:12:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-14 11:12:03       87 阅读
  4. Python语言-面向对象

    2024-06-14 11:12:03       96 阅读

热门阅读

  1. Tomcat

    Tomcat

    2024-06-14 11:12:03      29 阅读
  2. 云计算时代的等保测评挑战和应对策略

    2024-06-14 11:12:03       31 阅读
  3. vue设置点击自身以外其他区域关闭列表

    2024-06-14 11:12:03       27 阅读
  4. 查询ubuntu的ip方法

    2024-06-14 11:12:03       30 阅读
  5. 后端开发面试题5(附答案)

    2024-06-14 11:12:03       32 阅读
  6. 在Spring中如何手动开启事务(使用编程式事务)

    2024-06-14 11:12:03       28 阅读
  7. 【Go】十三、TOKEN机制与跨域处理方式

    2024-06-14 11:12:03       23 阅读