Docker實(shí)戰(zhàn)指南之MySQL、Redis與C++環(huán)境的深度容器化部署
前言
在現(xiàn)代軟件工程體系中,Docker作為一種輕量級的虛擬化技術(shù),已經(jīng)成為快速構(gòu)建、交付和運(yùn)行應(yīng)用程序的標(biāo)準(zhǔn)工具。通過容器化技術(shù),開發(fā)人員能夠?qū)?yīng)用及其依賴環(huán)境打包成一個(gè)獨(dú)立的單元,從而實(shí)現(xiàn)“一次構(gòu)建,到處運(yùn)行”的目標(biāo)。本文將深入解析MySQL 5.7數(shù)據(jù)庫、Redis 7.0緩存中間件以及基于CentOS 7的C++編譯環(huán)境的容器化部署全流程。文中將涵蓋鏡像獲取、容器實(shí)例化、網(wǎng)絡(luò)端口映射、數(shù)據(jù)持久化操作、系統(tǒng)源配置以及編譯工具鏈構(gòu)建等核心知識(shí)點(diǎn)。
第一部分:MySQL 5.7 關(guān)系型數(shù)據(jù)庫的容器化部署
MySQL作為應(yīng)用最廣泛的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),其穩(wěn)定性和成熟的生態(tài)使其成為眾多項(xiàng)目的首選。Docker Hub提供了官方維護(hù)的MySQL鏡像,極大地簡化了安裝配置流程。
1.1 鏡像獲取與版本選擇
首先,需要從遠(yuǎn)程倉庫拉取MySQL 5.7版本的鏡像。選擇5.7版本而非最新的8.0版本,通常是因?yàn)榕f有系統(tǒng)的兼容性需求或?qū)μ囟ò姹痉€(wěn)定性的考量。
執(zhí)行拉取命令:
docker pull mysql:5.7
Docker不僅會(huì)下載鏡像的元數(shù)據(jù),還會(huì)分層下載文件系統(tǒng)。

在下載過程中,可以看到每一層(Layer)的下載狀態(tài)。這種分層存儲(chǔ)機(jī)制是Docker文件系統(tǒng)的核心優(yōu)勢,它允許不同鏡像共享相同的基礎(chǔ)層,從而節(jié)省存儲(chǔ)空間并加快下載速度。待所有層級下載完畢并校驗(yàn)通過后,終端將顯示下載完成的信息。

為了確認(rèn)鏡像已成功存儲(chǔ)在本地宿主機(jī)中,可以使用鏡像列表查詢命令。該命令將列出本地所有的鏡像倉庫名稱、標(biāo)簽、鏡像ID、創(chuàng)建時(shí)間及大小。

1.2 容器實(shí)例的創(chuàng)建與網(wǎng)絡(luò)映射
鏡像準(zhǔn)備就緒后,下一步是根據(jù)該鏡像啟動(dòng)一個(gè)容器實(shí)例。在啟動(dòng)過程中,需要配置幾個(gè)關(guān)鍵參數(shù):
--name: 指定容器的名稱,便于后續(xù)管理。-e: 設(shè)置環(huán)境變量。對于MySQL而言,MYSQL_ROOT_PASSWORD是必須設(shè)置的變量,用于初始化root用戶的密碼。-p: 配置端口映射。格式為宿主機(jī)端口:容器端口。此處將宿主機(jī)的8201端口映射到容器內(nèi)部的3306標(biāo)準(zhǔn)端口,這意味著外部訪問應(yīng)連接8201端口。-d: 指定容器在后臺(tái)(Detached mode)運(yùn)行。
執(zhí)行如下命令:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=qwe123 -p 8201:3306 -d mysql:5.7
命令執(zhí)行成功后,Docker守護(hù)進(jìn)程會(huì)返回一個(gè)長字符串,即該容器的唯一ID,這標(biāo)志著容器已成功啟動(dòng)并在后臺(tái)運(yùn)行。

1.3 容器內(nèi)部交互與數(shù)據(jù)庫初始化
容器運(yùn)行后,是一個(gè)獨(dú)立的Linux環(huán)境。為了進(jìn)行數(shù)據(jù)庫操作,需要通過docker exec命令進(jìn)入容器內(nèi)部的交互式終端。
docker exec -it mysql bash
進(jìn)入容器后,使用標(biāo)準(zhǔn)MySQL客戶端命令登錄數(shù)據(jù)庫系統(tǒng)。
mysql -u root -p
此時(shí)系統(tǒng)會(huì)提示輸入密碼,需輸入在啟動(dòng)容器時(shí)通過環(huán)境變量設(shè)置的qwe123。

成功登錄MySQL控制臺(tái)后,可以執(zhí)行SQL語句來管理數(shù)據(jù)庫。首先,查看當(dāng)前系統(tǒng)默認(rèn)存在的數(shù)據(jù)庫列表,以驗(yàn)證系統(tǒng)初始化的完整性。
show databases;

為了再次確認(rèn)當(dāng)前運(yùn)行的數(shù)據(jù)庫版本,執(zhí)行版本查詢語句。
select version();
返回結(jié)果明確顯示版本為5.7.44,符合預(yù)期。

1.4 數(shù)據(jù)定義與操作實(shí)戰(zhàn)
接下來進(jìn)行實(shí)際的業(yè)務(wù)模擬操作。首先創(chuàng)建一個(gè)名為test_db的測試數(shù)據(jù)庫。
create database test_db;
執(zhí)行成功后,Query OK提示表明數(shù)據(jù)庫文件已在容器內(nèi)部的文件系統(tǒng)中建立。

使用use命令切換上下文至新建的數(shù)據(jù)庫。
use test_db;
系統(tǒng)提示Database changed,表示后續(xù)操作均將在該數(shù)據(jù)庫作用域內(nèi)執(zhí)行。

在當(dāng)前數(shù)據(jù)庫中創(chuàng)建一個(gè)用戶表test_user,包含姓名(varchar類型)和年齡(int類型)兩個(gè)字段。
create table test_user(name varchar(50),age int); show tables;
表創(chuàng)建成功后,show tables命令可以查看到該表的存在。

向表中插入一條測試數(shù)據(jù),并隨即進(jìn)行全表查詢以驗(yàn)證數(shù)據(jù)寫入的準(zhǔn)確性。
insert into test_user values('kaizi','99');
select * from test_user;
查詢結(jié)果清晰展示了剛才插入的記錄,證明數(shù)據(jù)庫的讀寫功能完全正常。

1.5 外部客戶端連接驗(yàn)證
容器化的核心價(jià)值之一在于對外提供服務(wù)。此時(shí),使用宿主機(jī)上的圖形化數(shù)據(jù)庫管理工具(如Navicat、DBeaver等)嘗試連接該MySQL容器。連接配置中,主機(jī)地址應(yīng)填寫宿主機(jī)IP(或localhost),端口則填寫映射的8201端口,而非容器內(nèi)部的3306端口。

連接成功建立后,展開數(shù)據(jù)庫列表,可以立刻看到剛才在容器命令行中創(chuàng)建的test_db數(shù)據(jù)庫。

在圖形化工具中打開test_user表,可以看到之前插入的kaizi, 99這條數(shù)據(jù)。這驗(yàn)證了容器內(nèi)外網(wǎng)絡(luò)的連通性以及數(shù)據(jù)的一致性。

第二部分:Redis 7.0 高性能鍵值存儲(chǔ)的部署
Redis作為高性能的Key-Value數(shù)據(jù)庫,常用于緩存、消息隊(duì)列等場景。Docker容器化部署Redis能夠極大地降低環(huán)境依賴配置的復(fù)雜度。
2.1 鏡像拉取與檢查
執(zhí)行命令拉取Redis 7.0版本的鏡像。
docker pull redis:7.0
Docker將自動(dòng)從Registry中下載相關(guān)層文件。

下載完成后,通過鏡像列表命令確認(rèn)Redis鏡像已存在于本地倉庫中,準(zhǔn)備隨時(shí)調(diào)用。
docker images

2.2 容器啟動(dòng)與端口映射
啟動(dòng)Redis容器時(shí),同樣需要關(guān)注端口映射。Redis默認(rèn)端口為6379,此處將其映射至宿主機(jī)的8090端口。
docker run --name redis -d -p 8090:6379 redis:7.0 docker ps
docker ps命令用于列出當(dāng)前正在運(yùn)行的容器。輸出結(jié)果顯示,Redis容器狀態(tài)為Up,且端口映射規(guī)則0.0.0.0:8090->6379/tcp已生效。

2.3 命令行讀寫測試
為了驗(yàn)證Redis服務(wù)是否可用,進(jìn)入容器內(nèi)部并啟動(dòng)redis-cli客戶端工具。
docker exec -it redis bash redis-cli
在CLI中進(jìn)行基礎(chǔ)的鍵值對設(shè)置與獲取操作。
set sellcount 1 get sellcount
操作結(jié)果顯示,鍵sellcount被成功設(shè)置為1,并能被正確讀取。

2.4 外部GUI工具連接驗(yàn)證
使用Redis Desktop Manager或類似的圖形化工具進(jìn)行連接測試。連接參數(shù)中主機(jī)地址為宿主機(jī)IP,端口為8090。連接測試通過提示“Connection successful”。

進(jìn)入GUI界面后,瀏覽數(shù)據(jù)庫鍵值空間,可以直觀地發(fā)現(xiàn)之前通過命令行設(shè)置的sellcount鍵及其對應(yīng)的值1。至此,Redis容器化部署及外部訪問配置全部完成。

第三部分:構(gòu)建基于CentOS 7的C++編譯開發(fā)環(huán)境
除了部署現(xiàn)成的應(yīng)用服務(wù)(如MySQL、Redis),Docker常被用于構(gòu)建標(biāo)準(zhǔn)化的開發(fā)或編譯環(huán)境。本節(jié)將演示如何在CentOS 7的基礎(chǔ)鏡像上,解決官方源失效問題,并安裝GCC編譯器,最終編譯運(yùn)行C代碼。
3.1 基礎(chǔ)操作系統(tǒng)鏡像準(zhǔn)備
拉取CentOS 7的基礎(chǔ)鏡像。CentOS 7因其在服務(wù)器領(lǐng)域的廣泛應(yīng)用,常被選作基礎(chǔ)運(yùn)行環(huán)境。
docker pull centos:7

啟動(dòng)容器并直接進(jìn)入交互模式(Interactive Mode)。參數(shù)-it是-i(交互式)和-t(分配偽終端)的組合,這使得用戶可以直接在容器內(nèi)獲得一個(gè)Bash Shell。
docker run -it --name mycpp centos:7 bash
命令執(zhí)行后,命令提示符從宿主機(jī)切換到了容器內(nèi)部(例如 [root@容器ID /]#),表明當(dāng)前已處于容器的文件系統(tǒng)中。

此時(shí),若在宿主機(jī)開啟另一個(gè)終端窗口執(zhí)行docker ps,可以看到名為mycpp的容器正在運(yùn)行,執(zhí)行的命令為bash。

3.2 解決YUM源失效問題(關(guān)鍵步驟)
由于CentOS 7已停止維護(hù)(EOL),官方的yum源地址大多已失效或歸檔,直接使用yum install往往會(huì)報(bào)錯(cuò)。因此,配置可用的第三方鏡像源是構(gòu)建環(huán)境的第一步。
首先,備份原有的repo配置文件,以防后續(xù)操作失誤需要恢復(fù)。
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
接著,下載國內(nèi)(如阿里云)提供的CentOS 7鏡像源配置文件。由于部分精簡版容器可能未預(yù)裝wget,優(yōu)先嘗試使用curl命令。
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
若環(huán)境中已包含wget,也可使用:
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
這一步將替換yum主要配置文件,指向依然提供服務(wù)的鏡像站點(diǎn)。

配置更改后,必須清理舊的yum緩存,防止元數(shù)據(jù)沖突。
yum clean all
系統(tǒng)將提示正在清理倉庫緩存。

隨后,重建yum緩存,這一步會(huì)從新的鏡像源下載軟件包的元數(shù)據(jù),建立本地索引,確保后續(xù)安裝軟件時(shí)能正確索引到包文件。
yum makecache
當(dāng)看到Metadata Cache Created提示時(shí),說明源配置成功。

3.3 GCC編譯工具鏈安裝
在源配置無誤后,開始安裝GNU編譯器集合(GCC)。
yum install gcc
Yum會(huì)自動(dòng)解析依賴關(guān)系,下載并安裝GCC及其所需的庫文件(如glibc-devel, kernel-headers等)。

安裝過程中需確認(rèn)安裝提示(輸入y或使用-y參數(shù))。待出現(xiàn)Complete!字樣,表明編譯環(huán)境已就緒。

3.4 C語言代碼編寫與編譯運(yùn)行
為了驗(yàn)證環(huán)境,編寫一段簡單的C代碼??梢允褂萌萜鲀?nèi)自帶的編輯器(如vi)創(chuàng)建一個(gè)名為code.c的文件。文件中包含標(biāo)準(zhǔn)的輸入輸出邏輯。

保存文件后,調(diào)用GCC進(jìn)行編譯。-o參數(shù)用于指定輸出的可執(zhí)行文件名。
gcc code.c -o code
若代碼無語法錯(cuò)誤,編譯器將靜默完成編譯,生成名為code的可執(zhí)行文件。

最后,在當(dāng)前目錄下運(yùn)行該程序。
./code
程序成功輸出預(yù)期的結(jié)果,證明該基于Docker的CentOS 7 C++編譯環(huán)境已構(gòu)建完整且功能正常。

總結(jié)
本文詳細(xì)記錄了在Docker環(huán)境下部署數(shù)據(jù)庫服務(wù)(MySQL)、緩存服務(wù)(Redis)以及構(gòu)建自定義開發(fā)環(huán)境(CentOS+GCC)的全過程。從鏡像的獲取、容器的參數(shù)化啟動(dòng)、網(wǎng)絡(luò)端口的映射機(jī)制,到容器內(nèi)部的系統(tǒng)配置與源切換,每一個(gè)步驟都緊密結(jié)合實(shí)際操作場景。這種容器化的部署方式,不僅隔離了應(yīng)用環(huán)境,避免了宿主機(jī)環(huán)境的污染,更極大地提升了環(huán)境搭建的效率與可移植性,是現(xiàn)代DevOps流程中的基石。
到此這篇關(guān)于Docker實(shí)戰(zhàn)指南之MySQL、Redis與C++環(huán)境的深度容器化部署的文章就介紹到這了,更多相關(guān)Docker部署MySQL、Redis與C++環(huán)境內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker更換存儲(chǔ)位置的實(shí)現(xiàn)
本文主要介紹了Docker更換存儲(chǔ)位置的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05
docker啟動(dòng)時(shí)環(huán)境變量不生效的解決方法
因項(xiàng)目需要多處部署,所以打包成docker鏡像以便于部署,本文主要介紹了docker啟動(dòng)時(shí)環(huán)境變量不生效的解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
解決docker加載新的鏡像后repository和tag名稱都為none的問題
這篇文章主要介紹了解決docker加載新的鏡像后repository和tag名稱都為none的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
docker安裝并運(yùn)行rabbitmq的實(shí)例代碼
在本篇文章里小編給大家整理了關(guān)于docker安裝并運(yùn)行rabbitmq的實(shí)例代碼以及相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。2019-10-10
docker之load鏡像重命名實(shí)現(xiàn)方式
文章主要說明在Docker鏡像傳輸中,使用save/load時(shí)若未指定名稱和標(biāo)簽,會(huì)導(dǎo)致鏡像REPOSITORY顯示為<none>,解決方法為:load后通過docker tag重命名,或打包時(shí)使用鏡像名:標(biāo)簽格式,確保傳輸后鏡像信息完整2025-09-09

