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