全屋定制设计师 發表於 2025-12-12 10:57:31

Docker实战指南之MySQL、Redis与C++环境的深度容器化部署

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">前言</a></li><li><a href="#_label1">第一部分:MySQL 5.7 关系型数据库的容器化部署</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">1.1 镜像获取与版本选择</a></li><li><a href="#_lab2_1_1">1.2 容器实例的创建与网络映射</a></li><li><a href="#_lab2_1_2">1.3 容器内部交互与数据库初始化</a></li><li><a href="#_lab2_1_3">1.4 数据定义与操作实战</a></li><li><a href="#_lab2_1_4">1.5 外部客户端连接验证</a></li></ul><li><a href="#_label2">第二部分:Redis 7.0 高性能键值存储的部署</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_5">2.1 镜像拉取与检查</a></li><li><a href="#_lab2_2_6">2.2 容器启动与端口映射</a></li><li><a href="#_lab2_2_7">2.3 命令行读写测试</a></li><li><a href="#_lab2_2_8">2.4 外部GUI工具连接验证</a></li></ul><li><a href="#_label3">第三部分:构建基于CentOS 7的C++编译开发环境</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_9">3.1 基础操作系统镜像准备</a></li><li><a href="#_lab2_3_10">3.2 解决YUM源失效问题(关键步骤)</a></li><li><a href="#_lab2_3_11">3.3 GCC编译工具链安装</a></li><li><a href="#_lab2_3_12">3.4 C语言代码编写与编译运行</a></li></ul><li><a href="#_label4">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>前言</h2>
<p>在现代软件工程体系中,Docker作为一种轻量级的虚拟化技术,已经成为快速构建、交付和运行应用程序的标准工具。通过容器化技术,开发人员能够将应用及其依赖环境打包成一个独立的单元,从而实现&ldquo;一次构建,到处运行&rdquo;的目标。本文将深入解析MySQL 5.7数据库、Redis 7.0缓存中间件以及基于CentOS 7的C++编译环境的容器化部署全流程。文中将涵盖镜像获取、容器实例化、网络端口映射、数据持久化操作、系统源配置以及编译工具链构建等核心知识点。</p>
<p class="maodian"><a name="_label1"></a></p><h2>第一部分:MySQL 5.7 关系型数据库的容器化部署</h2>
<p>MySQL作为应用最广泛的开源关系型数据库管理系统,其稳定性和成熟的生态使其成为众多项目的首选。Docker Hub提供了官方维护的MySQL镜像,极大地简化了安装配置流程。</p>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>1.1 镜像获取与版本选择</h3>
<p>首先,需要从远程仓库拉取MySQL 5.7版本的镜像。选择5.7版本而非最新的8.0版本,通常是因为旧有系统的兼容性需求或对特定版本稳定性的考量。</p>
<p>执行拉取命令:</p>
<div class="jb51code"><pre class="brush:ps;">docker pull mysql:5.7
</pre></div>
<p>Docker不仅会下载镜像的元数据,还会分层下载文件系统。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481888.png" /></p>
<p>在下载过程中,可以看到每一层(Layer)的下载状态。这种分层存储机制是Docker文件系统的核心优势,它允许不同镜像共享相同的基础层,从而节省存储空间并加快下载速度。待所有层级下载完毕并校验通过后,终端将显示下载完成的信息。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481848.png" /></p>
<p>为了确认镜像已成功存储在本地宿主机中,可以使用镜像列表查询命令。该命令将列出本地所有的镜像仓库名称、标签、镜像ID、创建时间及大小。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481835.png" /></p>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>1.2 容器实例的创建与网络映射</h3>
<p>镜像准备就绪后,下一步是根据该镜像启动一个容器实例。在启动过程中,需要配置几个关键参数:</p>
<ul><li><code>--name</code>: 指定容器的名称,便于后续管理。</li><li><code>-e</code>: 设置环境变量。对于MySQL而言,<code>MYSQL_ROOT_PASSWORD</code>是必须设置的变量,用于初始化root用户的密码。</li><li><code>-p</code>: 配置端口映射。格式为<code>宿主机端口:容器端口</code>。此处将宿主机的8201端口映射到容器内部的3306标准端口,这意味着外部访问应连接8201端口。</li><li><code>-d</code>: 指定容器在后台(Detached mode)运行。</li></ul>
<p>执行如下命令:</p>
<div class="jb51code"><pre class="brush:ps;">docker run --name mysql -e MYSQL_ROOT_PASSWORD=qwe123 -p 8201:3306 -d mysql:5.7
</pre></div>
<p>命令执行成功后,Docker守护进程会返回一个长字符串,即该容器的唯一ID,这标志着容器已成功启动并在后台运行。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481865.png" /></p>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>1.3 容器内部交互与数据库初始化</h3>
<p>容器运行后,是一个独立的Linux环境。为了进行数据库操作,需要通过<code>docker exec</code>命令进入容器内部的交互式终端。</p>
<div class="jb51code"><pre class="brush:ps;">docker exec -it mysql bash
</pre></div>
<p>进入容器后,使用标准MySQL客户端命令登录数据库系统。</p>
<div class="jb51code"><pre class="brush:ps;">mysql -u root -p
</pre></div>
<p>此时系统会提示输入密码,需输入在启动容器时通过环境变量设置的<code>qwe123</code>。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481854.png" /></p>
<p>成功登录MySQL控制台后,可以执行SQL语句来管理数据库。首先,查看当前系统默认存在的数据库列表,以验证系统初始化的完整性。</p>
<div class="jb51code"><pre class="brush:ps;">show databases;
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481852.png" /></p>
<p>为了再次确认当前运行的数据库版本,执行版本查询语句。</p>
<div class="jb51code"><pre class="brush:ps;">select version();
</pre></div>
<p>返回结果明确显示版本为5.7.44,符合预期。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481820.png" /></p>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>1.4 数据定义与操作实战</h3>
<p>接下来进行实际的业务模拟操作。首先创建一个名为<code>test_db</code>的测试数据库。</p>
<div class="jb51code"><pre class="brush:sql;">create database test_db;
</pre></div>
<p>执行成功后,Query OK提示表明数据库文件已在容器内部的文件系统中建立。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481836.png" /></p>
<p>使用<code>use</code>命令切换上下文至新建的数据库。</p>
<div class="jb51code"><pre class="brush:ps;">use test_db;
</pre></div>
<p>系统提示Database changed,表示后续操作均将在该数据库作用域内执行。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481867.png" /></p>
<p>在当前数据库中创建一个用户表<code>test_user</code>,包含姓名(varchar类型)和年龄(int类型)两个字段。</p>
<div class="jb51code"><pre class="brush:sql;">create table test_user(name varchar(50),age int);
show tables;
</pre></div>
<p>表创建成功后,<code>show tables</code>命令可以查看到该表的存在。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481822.png" /></p>
<p>向表中插入一条测试数据,并随即进行全表查询以验证数据写入的准确性。</p>
<div class="jb51code"><pre class="brush:sql;">insert into test_user values('kaizi','99');
select * from test_user;
</pre></div>
<p>查询结果清晰展示了刚才插入的记录,证明数据库的读写功能完全正常。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481887.png" /></p>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>1.5 外部客户端连接验证</h3>
<p>容器化的核心价值之一在于对外提供服务。此时,使用宿主机上的图形化数据库管理工具(如Navicat、DBeaver等)尝试连接该MySQL容器。连接配置中,主机地址应填写宿主机IP(或localhost),端口则填写映射的8201端口,而非容器内部的3306端口。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481989.png" /></p>
<p>连接成功建立后,展开数据库列表,可以立刻看到刚才在容器命令行中创建的<code>test_db</code>数据库。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481833.png" /></p>
<p>在图形化工具中打开<code>test_user</code>表,可以看到之前插入的<code>kaizi, 99</code>这条数据。这验证了容器内外网络的连通性以及数据的一致性。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481995.png" /></p>
<p class="maodian"><a name="_label2"></a></p><h2>第二部分:Redis 7.0 高性能键值存储的部署</h2>
<p>Redis作为高性能的Key-Value数据库,常用于缓存、消息队列等场景。Docker容器化部署Redis能够极大地降低环境依赖配置的复杂度。</p>
<p class="maodian"><a name="_lab2_2_5"></a></p><h3>2.1 镜像拉取与检查</h3>
<p>执行命令拉取Redis 7.0版本的镜像。</p>
<div class="jb51code"><pre class="brush:ps;">docker pull redis:7.0
</pre></div>
<p>Docker将自动从Registry中下载相关层文件。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481880.png" /></p>
<p>下载完成后,通过镜像列表命令确认Redis镜像已存在于本地仓库中,准备随时调用。</p>
<div class="jb51code"><pre class="brush:ps;">docker images
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481813.png" /></p>
<p class="maodian"><a name="_lab2_2_6"></a></p><h3>2.2 容器启动与端口映射</h3>
<p>启动Redis容器时,同样需要关注端口映射。Redis默认端口为6379,此处将其映射至宿主机的8090端口。</p>
<div class="jb51code"><pre class="brush:ps;">docker run --name redis -d -p 8090:6379 redis:7.0
docker ps
</pre></div>
<p><code>docker ps</code>命令用于列出当前正在运行的容器。输出结果显示,Redis容器状态为Up,且端口映射规则<code>0.0.0.0:8090-&gt;6379/tcp</code>已生效。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481888.png" /></p>
<p class="maodian"><a name="_lab2_2_7"></a></p><h3>2.3 命令行读写测试</h3>
<p>为了验证Redis服务是否可用,进入容器内部并启动<code>redis-cli</code>客户端工具。</p>
<div class="jb51code"><pre class="brush:ps;">docker exec -it redis bash
redis-cli
</pre></div>
<p>在CLI中进行基础的键值对设置与获取操作。</p>
<div class="jb51code"><pre class="brush:ps;">set sellcount 1
get sellcount
</pre></div>
<p>操作结果显示,键<code>sellcount</code>被成功设置为1,并能被正确读取。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481875.png" /></p>
<p class="maodian"><a name="_lab2_2_8"></a></p><h3>2.4 外部GUI工具连接验证</h3>
<p>使用Redis Desktop Manager或类似的图形化工具进行连接测试。连接参数中主机地址为宿主机IP,端口为8090。连接测试通过提示&ldquo;Connection successful&rdquo;。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481867.png" /></p>
<p>进入GUI界面后,浏览数据库键值空间,可以直观地发现之前通过命令行设置的<code>sellcount</code>键及其对应的值<code>1</code>。至此,Redis容器化部署及外部访问配置全部完成。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481967.png" /></p>
<p class="maodian"><a name="_label3"></a></p><h2>第三部分:构建基于CentOS 7的C++编译开发环境</h2>
<p>除了部署现成的应用服务(如MySQL、Redis),Docker常被用于构建标准化的开发或编译环境。本节将演示如何在CentOS 7的基础镜像上,解决官方源失效问题,并安装GCC编译器,最终编译运行C代码。</p>
<p class="maodian"><a name="_lab2_3_9"></a></p><h3>3.1 基础操作系统镜像准备</h3>
<p>拉取CentOS 7的基础镜像。CentOS 7因其在服务器领域的广泛应用,常被选作基础运行环境。</p>
<div class="jb51code"><pre class="brush:ps;">docker pull centos:7
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481993.png" /></p>
<p>启动容器并直接进入交互模式(Interactive Mode)。参数<code>-it</code>是<code>-i</code>(交互式)和<code>-t</code>(分配伪终端)的组合,这使得用户可以直接在容器内获得一个Bash Shell。</p>
<div class="jb51code"><pre class="brush:ps;">docker run -it --name mycpp centos:7 bash
</pre></div>
<p>命令执行后,命令提示符从宿主机切换到了容器内部(例如 <code>#</code>),表明当前已处于容器的文件系统中。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481985.png" /></p>
<p>此时,若在宿主机开启另一个终端窗口执行<code>docker ps</code>,可以看到名为<code>mycpp</code>的容器正在运行,执行的命令为<code>bash</code>。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481955.png" /></p>
<p class="maodian"><a name="_lab2_3_10"></a></p><h3>3.2 解决YUM源失效问题(关键步骤)</h3>
<p>由于CentOS 7已停止维护(EOL),官方的yum源地址大多已失效或归档,直接使用<code>yum install</code>往往会报错。因此,配置可用的第三方镜像源是构建环境的第一步。</p>
<p>首先,备份原有的repo配置文件,以防后续操作失误需要恢复。</p>
<div class="jb51code"><pre class="brush:ps;">mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
</pre></div>
<p>接着,下载国内(如阿里云)提供的CentOS 7镜像源配置文件。由于部分精简版容器可能未预装<code>wget</code>,优先尝试使用<code>curl</code>命令。</p>
<div class="jb51code"><pre class="brush:ps;">curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
</pre></div>
<p>若环境中已包含<code>wget</code>,也可使用:</p>
<div class="jb51code"><pre class="brush:ps;">wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
</pre></div>
<p>这一步将替换yum主要配置文件,指向依然提供服务的镜像站点。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210482056.png" /></p>
<p>配置更改后,必须清理旧的yum缓存,防止元数据冲突。</p>
<div class="jb51code"><pre class="brush:ps;">yum clean all
</pre></div>
<p>系统将提示正在清理仓库缓存。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481955.png" /></p>
<p>随后,重建yum缓存,这一步会从新的镜像源下载软件包的元数据,建立本地索引,确保后续安装软件时能正确索引到包文件。</p>
<div class="jb51code"><pre class="brush:ps;">yum makecache
</pre></div>
<p>当看到<code>Metadata Cache Created</code>提示时,说明源配置成功。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481969.png" /></p>
<p class="maodian"><a name="_lab2_3_11"></a></p><h3>3.3 GCC编译工具链安装</h3>
<p>在源配置无误后,开始安装GNU编译器集合(GCC)。</p>
<div class="jb51code"><pre class="brush:ps;">yum install gcc
</pre></div>
<p>Yum会自动解析依赖关系,下载并安装GCC及其所需的库文件(如glibc-devel, kernel-headers等)。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481967.png" /></p>
<p>安装过程中需确认安装提示(输入y或使用<code>-y</code>参数)。待出现Complete!字样,表明编译环境已就绪。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481916.png" /></p>
<p class="maodian"><a name="_lab2_3_12"></a></p><h3>3.4 C语言代码编写与编译运行</h3>
<p>为了验证环境,编写一段简单的C代码。可以使用容器内自带的编辑器(如vi)创建一个名为<code>code.c</code>的文件。文件中包含标准的输入输出逻辑。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481940.png" /></p>
<p>保存文件后,调用GCC进行编译。<code>-o</code>参数用于指定输出的可执行文件名。</p>
<div class="jb51code"><pre class="brush:ps;">gcc code.c -o code
</pre></div>
<p>若代码无语法错误,编译器将静默完成编译,生成名为<code>code</code>的可执行文件。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481961.png" /></p>
<p>最后,在当前目录下运行该程序。</p>
<div class="jb51code"><pre class="brush:ps;">./code
</pre></div>
<p>程序成功输出预期的结果,证明该基于Docker的CentOS 7 C++编译环境已构建完整且功能正常。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121210481920.png" /></p>
<p class="maodian"><a name="_label4"></a></p><h2>总结</h2>
<p>本文详细记录了在Docker环境下部署数据库服务(MySQL)、缓存服务(Redis)以及构建自定义开发环境(CentOS+GCC)的全过程。从镜像的获取、容器的参数化启动、网络端口的映射机制,到容器内部的系统配置与源切换,每一个步骤都紧密结合实际操作场景。这种容器化的部署方式,不仅隔离了应用环境,避免了宿主机环境的污染,更极大地提升了环境搭建的效率与可移植性,是现代DevOps流程中的基石。</p>
<p>到此这篇关于Docker实战指南之MySQL、Redis与C++环境的深度容器化部署的文章就介绍到这了,更多相关Docker部署MySQL、Redis与C++环境内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
頁: [1]
查看完整版本: Docker实战指南之MySQL、Redis与C++环境的深度容器化部署