使用Docker自動化部署項目的全過程
本篇主要是利用Docker為我的兩個項目進(jìn)行添加自動化部署
部署B(yǎng)oost搜索引擎
Dockerfile
對于部署來說,要先使用Dockerfile把鏡像完善好:
# 使用Ubuntu 22.04作為基礎(chǔ)鏡像,包含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
# 更新系統(tǒng)包并安裝構(gòu)建工具和必要的庫
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/*
# 設(shè)置工作目錄
WORKDIR /usr/src/app
# 將項目源碼復(fù)制到容器中
COPY . .
# 編譯項目
RUN make clean
RUN make
# 暴露端口
EXPOSE 8081
# 啟動命令,直接指定可執(zhí)行文件名
CMD ["./http_server"]
這是一個Dockerfile的內(nèi)容,用于構(gòu)建一個基于Ubuntu 22.04操作系統(tǒng)的Docker鏡像,主要目的是部署一個C++編寫的應(yīng)用程序,該程序似乎是一個HTTP服務(wù)器。
以下是逐行的解釋:
FROM ubuntu:22.04 AS builder:
- 使用官方Ubuntu 22.04 LTS(長期支持)版本作為基礎(chǔ)鏡像,并標(biāo)記這一階段為
builder。 - 這意味著此鏡像將用于構(gòu)建過程。
接下來的兩個RUN sed命令:
- 更改APT(Advanced Package Tool)的軟件源地址,由默認(rèn)的Ubuntu倉庫地址更改為騰訊云的鏡像源,這通常是為了加速在中國地區(qū)的軟件包下載速度。
RUN apt update && …:
- 更新軟件包列表并安裝一系列開發(fā)和運行時所需的軟件包,包括G++(C++編譯器)、make(用于編譯源代碼)、Boost庫、jsoncpp庫(用于處理JSON數(shù)據(jù))、Git(版本控制系統(tǒng))、Redis服務(wù)器及其開發(fā)庫、CMake(用于構(gòu)建C++項目)、MySQL服務(wù)器及其C++連接庫等。
克隆并構(gòu)建redis-plus-plus:
- 克隆
redis-plus-plus倉庫,這是一個高性能的C++ Redis客戶端。 - 切換到
redis-plus-plus的build目錄,執(zhí)行CMake配置、編譯以及安裝步驟,以便在系統(tǒng)中安裝此庫。
克隆nlohmann/json:
- 克隆nlohmann/json庫,這是一個流行的C++ JSON解析庫。
- 然后將該庫的頭文件復(fù)制到
/usr/local/include/目錄,使得這些頭文件對系統(tǒng)全局可見。
RUN rm -rf /var/lib/apt/lists/*:
- 刪除APT的緩存和列表文件,以減少最終鏡像的大小。
WORKDIR /usr/src/app:
- 設(shè)置工作目錄為
/usr/src/app,這通常是項目源代碼放置的地方。
COPY . .:
- 復(fù)制當(dāng)前目錄下的所有文件到容器中的工作目錄,即將應(yīng)用的源代碼復(fù)制進(jìn)容器。
RUN make clean && RUN make:
- 執(zhí)行
make clean清理之前可能存在的編譯產(chǎn)物,然后重新編譯項目。
EXPOSE 8081:
- 聲明容器將在8081端口上監(jiān)聽,為外界提供服務(wù)訪問入口。
CMD [“./http_server”]:
- 指定容器啟動時運行的命令,即直接執(zhí)行名為
http_server的可執(zhí)行文件,這應(yīng)該是應(yīng)用的主進(jìn)程,負(fù)責(zé)啟動HTTP服務(wù)器。
總結(jié)起來:
這個Dockerfile構(gòu)建了一個包含特定C++應(yīng)用程序的環(huán)境,該程序依賴于Redis、JSON處理能力,可能還涉及MySQL數(shù)據(jù)庫交互,并且在容器啟動后自動運行一個HTTP服務(wù)器監(jiān)聽8081端口。
docker-compose.yml
之后要使用Compose編排,對于這個項目所需要的三個部分:web服務(wù),Redis,MySQL進(jìn)行編排
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容器以及它們之間的依賴關(guān)系,從而簡化了多容器應(yīng)用的部署和服務(wù)管理。
下面是對該配置文件各部分的詳細(xì)解釋:
版本聲明
version: '3.8'
指定了Docker Compose文件的版本,這里是3.8。不同的版本可能支持不同的功能特性。
服務(wù)定義(services)
services:
db:
# ...
redis:
# ...
webapp:
# ...
這部分定義了三個服務(wù):db(數(shù)據(jù)庫服務(wù),使用MySQL)、redis(緩存服務(wù),使用Redis)和webapp(Web應(yīng)用程序服務(wù))。
db 服務(wù)
- image:
mysql:5.7指定使用MySQL 5.7鏡像。 - restart:
always表示容器總是會在退出后重啟。 - environment: 設(shè)置環(huán)境變量,包括數(shù)據(jù)庫的根密碼、數(shù)據(jù)庫名、用戶名和密碼。
- volumes: 映射本地
./init.sql文件到容器內(nèi)的/docker-entrypoint-initdb.d/init.sql,用于初始化數(shù)據(jù)庫。 - networks: 將服務(wù)加入自定義網(wǎng)絡(luò)
my_custom_network。
redis 服務(wù)
- image: 使用最新版Redis鏡像。
- restart: 同上,設(shè)置為始終重啟。
- networks: 加入
my_custom_network網(wǎng)絡(luò)。
webapp 服務(wù)
- build: 使用當(dāng)前目錄下的Dockerfile構(gòu)建鏡像。
- restart: 設(shè)置為始終重啟。
- ports: 映射宿主機的10000端口到容器的8081端口,用于訪問Web應(yīng)用。
- environment: 設(shè)置環(huán)境變量,包括數(shù)據(jù)庫連接信息和Redis連接信息。
- depends_on: 指定webapp服務(wù)依賴于
db和redis服務(wù),確保這兩個服務(wù)先啟動。 - networks: 加入
my_custom_network網(wǎng)絡(luò)。
數(shù)據(jù)卷定義(volumes)
volumes: db_data:
定義了一個名為db_data的數(shù)據(jù)卷,但在這個配置中未直接使用。通常用于持久化數(shù)據(jù)庫數(shù)據(jù),但這里可能是預(yù)留或注釋掉了實際掛載點。
網(wǎng)絡(luò)定義(networks)
networks:
my_custom_network:
driver: bridge
定義了一個自定義網(wǎng)絡(luò)my_custom_network,類型為bridge(橋接網(wǎng)絡(luò))。所有服務(wù)都連接到這個網(wǎng)絡(luò),允許它們之間通過服務(wù)名稱相互通信,而無需暴露不必要的端口到宿主機網(wǎng)絡(luò)。
總結(jié)起來,這個Docker Compose配置文件定義了一個包含MySQL數(shù)據(jù)庫、Redis緩存和一個Web應(yīng)用程序的多容器環(huán)境,各個服務(wù)通過自定義網(wǎng)絡(luò)互聯(lián),并且具備自動重啟、環(huán)境變量配置和端口映射等特性,適合快速搭建和部署一個具備數(shù)據(jù)庫和緩存支持的Web應(yīng)用開發(fā)或測試環(huán)境。
部署online judge
Dockerfile
# 使用Ubuntu 22.04作為基礎(chǔ)鏡像,包含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
# 更新系統(tǒng)包并安裝構(gòu)建工具和必要的庫
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/*
# 設(shè)置工作目錄
WORKDIR /usr/src/app
# 將項目源碼復(fù)制到容器中
COPY . .
# 設(shè)置 LD_LIBRARY_PATH 環(huán)境變量
ENV LD_LIBRARY_PATH=/usr/local/lib:/usr/lib64:/lib64:/usr/lib:/lib:/opt/lib:$LD_LIBRARY_PATH
# 編譯項目
RUN make
RUN make output
# 現(xiàn)在運行oj_server服務(wù)
WORKDIR /usr/src/app/output/oj_server
# 暴露端口
EXPOSE 8080
# 啟動命令,直接指定可執(zhí)行文件名
CMD ["./oj_server"]
這是一個Dockerfile的內(nèi)容,用于構(gòu)建一個包含特定C++應(yīng)用程序的Docker鏡像。
下面是對每一行指令的解釋:
FROM ubuntu:22.04 AS builder:
- 從Ubuntu 22.04鏡像開始構(gòu)建,并標(biāo)記此階段為“builder”。這將作為后續(xù)構(gòu)建步驟的基礎(chǔ)環(huán)境,包含了C++編譯器。
接下來的兩個RUN命令:
- 修改系統(tǒng)的軟件源列表,用騰訊云的鏡像源替換默認(rèn)的Ubuntu源,以提高在中國地區(qū)的下載速度和穩(wěn)定性。
RUN apt update && …:
- 更新軟件包列表,并安裝一系列構(gòu)建工具和庫,包括但不限于g++(C++編譯器)、make(構(gòu)建工具)、Boost庫、jsoncpp庫、git、Redis服務(wù)器及其開發(fā)庫、CMake、MySQL服務(wù)器及其C++開發(fā)庫等。
WORKDIR /:
- 設(shè)置工作目錄為根目錄。
接下來的幾個RUN命令:
- 克隆
redis-plus-plus倉庫,構(gòu)建并安裝它。這是一個基于C++的Redis客戶端庫。 - 克隆
ctemplate倉庫,這是Google的模板庫,用于快速生成文本輸出。執(zhí)行配置、編譯和安裝步驟。 - 克隆nlohmann/json倉庫,然后將其頭文件復(fù)制到系統(tǒng)默認(rèn)的包含路徑,以便于其他項目使用。
RUN rm -rf /var/lib/apt/lists/*:
- 清理下載的軟件包列表和緩存,減小最終鏡像的大小。
WORKDIR /usr/src/app:
- 切換工作目錄至應(yīng)用代碼的預(yù)期位置。
COPY . .:
- 將當(dāng)前目錄下的所有文件復(fù)制到容器內(nèi)的
/usr/src/app目錄下,即把項目源代碼復(fù)制進(jìn)容器。
ENV LD_LIBRARY_PATH=…:
- 設(shè)置環(huán)境變量
LD_LIBRARY_PATH,指向包含庫文件的目錄,確保動態(tài)鏈接時能找到這些庫。
RUN make && RUN make output:
- 編譯項目并執(zhí)行特定的構(gòu)建目標(biāo)(假設(shè)項目中有相應(yīng)的Makefile規(guī)則來處理這些命令)。
WORKDIR /usr/src/app/output/oj_server:
- 進(jìn)入到可執(zhí)行文件所在的目錄,這里假設(shè)
oj_server是編譯輸出的可執(zhí)行文件。
EXPOSE 8080:
- 聲明容器將在8080端口上監(jiān)聽,便于外部訪問服務(wù)。
CMD [“./oj_server”]:
- 容器啟動時執(zhí)行的命令,直接運行
oj_server可執(zhí)行文件。
綜上所述,這個Dockerfile用于創(chuàng)建一個自定義的Docker鏡像,其中集成了Redis客戶端、CTemplate庫、nlohmann/json庫,并編譯安裝了一個名為oj_server的應(yīng)用程序,對外提供HTTP服務(wù)(監(jiān)聽8080端口)。
通過使用特定的構(gòu)建步驟和庫,該鏡像確保了應(yīng)用運行所需的全部依賴都被正確安裝和配置。
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的配置文件,用于定義一組相互關(guān)聯(lián)的Docker服務(wù),協(xié)同工作以構(gòu)成一個完整的應(yīng)用環(huán)境。下面是該配置文件的詳細(xì)解釋:
版本聲明
version: '3.8'指定了使用Docker Compose的版本3.8,這個版本提供了服務(wù)編排和服務(wù)網(wǎng)絡(luò)的高級特性。
服務(wù)定義
db服務(wù)
- image: 使用
mysql:5.7鏡像作為數(shù)據(jù)庫服務(wù)。 - restart: 設(shè)置為
always,意味著當(dāng)容器停止或崩潰時,Docker會自動重啟該容器。 - environment: 配置MySQL的環(huán)境變量,包括root用戶的密碼、數(shù)據(jù)庫名、用戶名及密碼。
- volumes: 映射本地的
./init.sql文件到容器內(nèi)的/docker-entrypoint-initdb.d/init.sql,用于數(shù)據(jù)庫初始化。 - networks: 加入自定義網(wǎng)絡(luò)
my_custom_network,便于服務(wù)間通信。
redis服務(wù)
- 使用
redis:latest鏡像作為Redis緩存服務(wù),配置與db服務(wù)類似,具有自動重啟和網(wǎng)絡(luò)配置。
server服務(wù)
- build: 通過指定上下文目錄
.和Dockerfile文件Dockerfile.server來構(gòu)建鏡像。 - ports: 映射容器的8080端口到宿主機的9999端口,供外部訪問。
- environment: 設(shè)置環(huán)境變量,用于連接數(shù)據(jù)庫和Redis服務(wù),注意這里使用了
oj數(shù)據(jù)庫的相關(guān)配置。 - depends_on: 表明
server服務(wù)依賴于db、redis、以及三個compiler服務(wù),確保這些依賴服務(wù)先啟動。 - networks: 同樣加入
my_custom_network。
compiler1, compiler2, compiler3服務(wù)
- 分別通過不同的Dockerfile(
Dockerfile.compile1,Dockerfile.compile2,Dockerfile.compile3)構(gòu)建,用于編譯任務(wù),每個服務(wù)也加入到了相同的網(wǎng)絡(luò)中。
數(shù)據(jù)卷
- db_data: 雖然定義了數(shù)據(jù)卷,但在db服務(wù)中沒有直接使用,通常這樣的數(shù)據(jù)卷用于持久化數(shù)據(jù)庫數(shù)據(jù),避免數(shù)據(jù)丟失。
網(wǎng)絡(luò)定義
- my_custom_network: 定義了一個自定義網(wǎng)絡(luò),類型為
bridge(橋接網(wǎng)絡(luò)),用于服務(wù)間的通信隔離與連接。
總結(jié)
該Docker Compose配置設(shè)計了一個包含MySQL數(shù)據(jù)庫、Redis緩存、一個主服務(wù)器應(yīng)用以及三個獨立編譯器服務(wù)的環(huán)境。
這些服務(wù)共享一個自定義網(wǎng)絡(luò),可以相互通信,并且數(shù)據(jù)庫服務(wù)的數(shù)據(jù)可以通過數(shù)據(jù)卷持久化。服務(wù)器應(yīng)用能夠訪問數(shù)據(jù)庫和Redis,同時依賴于多個編譯器服務(wù)協(xié)同工作。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何解決對Docker容器內(nèi)存限制警告或未實際限制的問題
這篇文章主要介紹了如何解決對Docker容器內(nèi)存限制警告或未實際限制的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
docker離線安裝社區(qū)版(docker-18.06.3-ce)
在一些特定的環(huán)境下,由于網(wǎng)絡(luò)限制或者其他原因,我們可能需要在Linux系統(tǒng)上進(jìn)行離線安裝Docker,本文就來介紹一下docker離線安裝社區(qū)版,具有一定的參考價值,感興趣的可以了解一下2024-03-03

