docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > 使用Docker自动化部署项目

使用Docker自动化部署项目的全过程

作者:海绵宝宝de派小星

文章介绍了两个项目的Docker部署方案:一是通过Dockerfile构建Boost搜索引擎镜像并配置依赖库,二是使用docker-compose编排Web应用、MySQL、Redis及编译器服务,实现多容器协同部署与环境隔离

本篇主要是利用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服务器。

以下是逐行的解释:

FROM ubuntu:22.04 AS builder

接下来的两个RUN sed命令

RUN apt update && …

克隆并构建redis-plus-plus

克隆nlohmann/json

RUN rm -rf /var/lib/apt/lists/*:

WORKDIR /usr/src/app

COPY . .

RUN make clean && RUN make

EXPOSE 8081

CMD [“./http_server”]

总结起来:

这个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 服务

redis 服务

webapp 服务

数据卷定义(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镜像。

下面是对每一行指令的解释:

FROM ubuntu:22.04 AS builder

接下来的两个RUN命令

RUN apt update && …

WORKDIR /

接下来的几个RUN命令

RUN rm -rf /var/lib/apt/lists/*:

WORKDIR /usr/src/app

COPY . .

ENV LD_LIBRARY_PATH=…

RUN make && RUN make output

WORKDIR /usr/src/app/output/oj_server

EXPOSE 8080

CMD [“./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服务

redis服务

server服务

compiler1, compiler2, compiler3服务

数据卷

网络定义

总结

该Docker Compose配置设计了一个包含MySQL数据库、Redis缓存、一个主服务器应用以及三个独立编译器服务的环境。

这些服务共享一个自定义网络,可以相互通信,并且数据库服务的数据可以通过数据卷持久化。服务器应用能够访问数据库和Redis,同时依赖于多个编译器服务协同工作。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文