news 2026/9/28 5:37:45

用Docker安装Oracle 19c:一条命令创建干净数据库环境

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Docker安装Oracle 19c:一条命令创建干净数据库环境

如果你搜索过 Oracle 的安装教程,大概率见识过那种“从环境检查到图形界面、最后被某个 ORA- 错误磨到崩溃”的经典流程。我这次要讲的,是一个能把你从这套流程里彻底解放出来的方案:用 Docker 安装 Oracle 19c,一条命令创建出一个能随时清理、随时重建的数据库环境。作为一个被 Oracle 安装折腾过很多次的人,我可以很负责任地说,容器化之后,这套数据库的交付效率完全变了样。

这篇东西适合谁看?第一类是本地开发环境需要 Oracle 做兼容测试的开发者,第二类是写自动化脚本、搞 CI/CD 流水线的运维或测试工程师,第三类是单纯想学 Oracle 但被安装步骤劝退的新手。不需要你有多深的 Docker 基础,跟着把命令敲完,一个能跑能连的 19c 就在那里了。

我会把整个流程分成六个部分:先讲清楚为什么选 Docker 跑 Oracle、装之前的资源准备、镜像的构建、容器的启动与连接、生产级运维细节,最后是完整的踩坑实录。里面每一步的参数我都会解释为什么这么配,而不是只丢给你一串跑完就完事的命令。

1. 为什么非要在 Docker 里跑 Oracle 19c

1.1 Oracle 原生安装的“地狱级”流程

在说 Docker 方案之前,我想先聊聊大家最常遇到的痛点。Oracle 传统安装不像 MySQL 那样解压就能跑,它对操作系统有一套近乎苛刻的要求:内核参数要调kernel.sem、fs.file-max、net.ipv4.ip_local_port_range,还要单独建oracle用户、oinstall用户组,设置各种环境变量,装一堆依赖包。图形界面安装过程中,每一步都在考验耐心,稍有一步不对就得回滚重来。

我见过太多人在dbca建库阶段等了半小时,最后弹出一个“ORA-12547: TNS lost contact”,然后整个人就崩了。这不是夸张,官方文档的安装前检查清单就有一大页,你在生产环境里还要考虑磁盘划分、内存分配和字符集选择,每个环节都藏着雷。而 Docker 之所以能解决这个问题,核心逻辑就四个字:环境固化。

1.2 Docker 化部署的真实优势

把 Oracle 装进容器,最大的变化是环境从“一次性搭建”变成了“可版本化的交付物”。同一个镜像可以在你的笔记本上跑,也可以在测试服务器上跑,得到的结果完全一致,不会出现开发环境能连、测试环境报错“监听器不支持服务”这种玄学问题。你的差异化配置全部收敛到 docker run 命令和环境变量里,出了问题重来一遍的成本极低。

我自己的经验是,裸装一套 19c 至少要花两三个小时,中间每一步都要靠搜索引擎救命;而用 Docker 从构建镜像到数据库 ready,大概十分钟到一个小时就能搞定,其中大部分时间是等安装包解压和初始化。后期清理也爽快,一条docker rm就能把整套环境删得干干净净,不会在系统里残留一堆卸载不干净的服务和注册表项。这对频繁搭开发环境的人来说,节约的时间非常可观。

1.3 适用场景与边界

当然,容器不是万能的。以官方 Docker 镜像构建出的 19c 最适合的开发测试、自动化测试、学习练手和轻量级内部服务。如果你的业务是对外提供千万级并发,或者要求极高的 IO 性能,那还是老老实实走裸机或者虚机部署,再搭配 RAC 架构更稳妥。别指望容器帮你解决性能问题,它解决的是“交付”和“环境一致性”问题,不是“快”的问题。

另外要提一句,Oracle 有自己的许可体系。官方提供的 Docker 构建脚本做出来的镜像,主要用于开发测试场景,生产环境使用需要你自行评估和购买对应的 License。这不是什么灰色话题,是每个用 Oracle 的人都该有的基本意识。

1.4 Docker、虚拟机与裸机的选型对比

很多人纠结:既然虚拟机也能隔离环境,为什么用 Docker?这里我给你一个直观的对比表:

部署方式启动时间资源开销环境一致性交付复杂度适合场景
裸机安装数小时极低(直接使用物理资源)依赖手工文档高生产、核心业务
虚拟机数十分钟较高(完整 OS 开销)依赖模板中复杂环境、多 OS 并存
Docker 容器秒级到分钟级低(只比进程多一点)镜像固化,天然一致低开发测试、CI/CD、学习

我实际用下来,Docker 最大的价值在于“重建”和“移动”。虚拟机模板确实也能复制环境,但那个镜像动不动几个 GB 甚至几十个 GB,迁移、分发都笨重。Docker 镜像虽然也不算小,但分层结构让分发和增量更新轻便得多。你要是搞自动化测试,每轮测试跑完直接删容器、起新容器,比虚拟机快一个量级。

2. 装之前先搞清楚这些前置条件

2.1 硬件与磁盘规划

我想先给一个比较基础的硬件预期,免得你在启动容器之后对着日志发呆。Oracle 19c 怎么说也是企业级数据库,官方 Docker 脚本构建出来的镜像解压后体积非常大,基础镜像加上 Oracle Home 再加上数据库文件,磁盘占用轻松超过 10GB,预留 20GB 以上才算安心。内存方面,容器内部 Oracle 的默认内存配置会根据宿主机可用内存自动调整,但如果你只有 2GB 可用内存,大概率会启动失败或频繁 OOM。建议至少留 4GB 内存给 Docker 和容器使用,8GB 会更舒服。

如果你在 Windows 或 Mac 上用 Docker Desktop,还要额外注意一个问题:Docker Desktop 本身跑在一个虚拟机里,默认分配的内存可能只有 2GB 到 4GB。你需要在 Docker Desktop 设置里把内存调到 6GB 以上,否则容器里 Oracle 会发现系统内存过小然后拒绝启动。这个问题被称为“virtualization support not detected”或者“failed to start”,但很多时候只是配置不对,不一定是虚拟化开关的问题。

2.2 Docker 运行环境检查

安装 Docker 这步我就不多说了,Linux 服务器上一条安装命令搞定,Windows 上装 Docker Desktop 即可,但注意需要开启 WSL2 和 BIOS 里的虚拟化支持。装完之后先跑一句docker version,确认客户端和服务端都能正常工作,再继续下一步。

有一个容易被忽略的点是 Docker 存储驱动和磁盘类型。如果你用的是默认的 overlay2,磁盘建议用 ext4 或 xfs,不要用某些网络文件系统或过旧的存储驱动,否则 Oracle 的数据文件写入会出各种奇怪的问题。如果是在生产服务器上,建议把 Docker 数据目录单独挂到一块高性能盘上,别跟系统盘挤在一起,这跟裸机装 Oracle 要把数据文件放单独磁盘是一个道理。

2.3 镜像获取方式的特殊之处

这是最需要强调的地方。Oracle 并没有像 MySQL 那样把官方镜像直接推到 Docker Hub 让你无脑docker pull,官方维护的获取方式是从 GitHub 的docker-images仓库拉取 Dockerfile 和构建脚本,然后你把从 Oracle 官网下载的安装包放进指定目录,本地执行脚本完成构建。请注意:网上流传的各种第三方打包镜像虽然省事,但我强烈不建议直接用,原因有三点。

第一,安全不可控。你不确定镜像里被塞了什么,数据库这种强权限应用,背后搞点小动作很危险。第二,版本和配置不透明,出了问题你很难溯源。第三,自己构建一点都不难,而且能顺便把构建过程理解透,后面调试排障都好说。社区里那些“一键 pull”的镜像大多是搬运工,一旦 Oracle 基础包有变化或者有安全补丁,他们根本不会及时更新,万一哪天有人利用已知漏洞攻击数据库,你哭都来不及。

3. 构建 Oracle 19c 镜像:完整实操

3.1 下载官方构建仓库并了解目录结构

首先把官方仓库拉下来,注意这个仓库内容比较大,建议直接克隆到本地一个干净目录:

git clone https://github.com/oracle/docker-images.git cd docker-images/OracleDatabase/SingleInstance/dockerfiles

目录结构很直观:每个版本对应一个文件夹,里面有 Dockerfile 和构建脚本。我们要用的 19c 在19.3.0目录下。构建脚本buildContainerImage.sh是整个过程的入口,它负责拉取基础镜像、把数据库安装包拷进构建上下文、执行静默安装,最后打成一个带完整 Oracle Home 的镜像,核心逻辑全在这里。

3.2 下载 Oracle 19c 安装包并放置到指定位置

进入19.3.0目录,你会看到一个LINUX.X64_193000_db_home.zip的占位说明文件。实际使用时,你需要从 Oracle 官网的下载页面登录账号,选择 Oracle Database 19c 的 Linux x86-64 版本,下载那个约 2.8GB 的LINUX.X64_193000_db_home.zip文件。下载完成后,把它放进19.3.0目录里,文件名不能乱改,构建脚本会按固定文件名去查找。

这里有一点必须吐槽:Oracle 官网下载需要注册账号,下载速度也可能不太理想。但不要因此去别处找第三方网盘资源,数据库安装包这种东西,从不可靠渠道获取意味着种子文件可能被篡改,风险完全不值得冒。构建脚本默认会做 checksum 校验,如果文件不对会直接报错,这也是给你最后一道把关。

3.3 执行构建脚本并理解参数含义

回到dockerfiles目录,执行构建命令:

./buildContainerImage.sh -v 19.3.0 -e -i

各参数含义如下表:

参数说明
-v指定版本号,这里必须写 19.3.0
-e构建企业版(Enterprise Edition)
-s构建标准版(Standard Edition),与 -e 二选一
-x构建 SE2(Standard Edition 2),与 -e 二选一
-i忽略安装包的 checksum 校验,网络下载完整时可以不加
-o指定构建用的基础镜像,一般用不到

构建过程中,脚本会自动拉取oraclelinux:7-slim基础镜像,然后把安装包进行解压和静默安装。这个过程会消耗不少时间,通常十到二十分钟,具体取决于机器性能。如果你的机器内存小于 2GB,构建过程很可能因为 OOM 直接退出;如果你在用 Docker Desktop,请确保分配给虚拟机的内存在 6GB 以上再执行构建。

构建成功后执行docker images,你会看到这样的镜像:

oracle/database 19.3.0-ee <镜像ID> ...

镜像体积大约 6GB 左右,这是正常现象,Oracle Home 本身就是个庞然大物。镜像我们打个比方:它就像一个预先装好的“数据库软件环境”,里面已经完成了 Oracle 软件的安装和基础配置,但还没有“建库”。建库的步骤是容器启动时自动完成的。

3.4 构建可能遇到的几个翻车点

构建最常见的失败原因就是网络问题:基础镜像拉不下来、yum 仓库连接超时。解决思路也简单,配好国内镜像加速器,或检查公司网络是否有外网限制。第二个常见问题是磁盘空间不够,构建过程中临时文件和解压文件会占用大量空间,建议用df -h提前确认。第三个是内存不足,构建脚本在跑 Oracle 静默安装时非常吃内存,4GB 是比较稳妥的下限。

我个人还遇到过一种情况:Node 或 npm 这类跟 Oracle 完全不相关的东西在构建日志里出现错误。别慌,那是因为构建脚本内部可能会跑一些操作系统依赖更新,国内机器上偶尔会有奇怪的源问题。只要最终镜像生成成功,这些中间错误一般不影响使用。

4. 创建并运行容器:关键参数逐个解析

4.1 启动命令与参数详解

镜像构建好了,接下来就是真正的重头戏。运行 Oracle 19c 容器,我用的是这样一条命令:

docker run -d \ --name oracle19c \ -p 15215:1521 \ -p 55015:5500 \ -e ORACLE_SID=ORCLCDB \ -e ORACLE_PDB=ORCLPDB1 \ -e ORACLE_PWD=YourStrongPass1 \ -e INIT_SGA_SIZE=1G \ -e INIT_PGA_SIZE=256M \ --shm-size=4g \ --restart=unless-stopped \ -v /data/oracle19c:/opt/oracle/oradata \ oracle/database:19.3.0-ee

逐个解释这些参数的时候到了,因为每个参数背后都有一个我踩过的坑:

-p 15215:1521是把宿主机的 15215 端口映射到容器内的 1521 端口。为什么不用默认的 1521?因为我机器上可能同时跑着别的数据库,端口冲突是家常便饭。对外暴露的端口最好改一下,后面连接时用192.168.x.x:15215就行。-p 55015:5500对应 Enterprise Manager 管理页面,没有这个也能用,但有总比没有强。

-e ORACLE_SID=ORCLCDB设置容器启动时要创建的 CDB 名称,也就是整个数据库实例的 ID。ORACLE_PDB=ORCLPDB1是可插拔数据库的名称,Oracle 12c 之后的架构里 CDB 是“总容器”,PDB 才是业务真正打交道的地方。这两项用官方默认值就行,除非你有明确的命名规范。注意 ORACLE_SID 不能超过 12 个字符,否则会报错,这也是 Oracle 的老规矩了。

ORACLE_PWD是超级管理员 sys / system 的密码,这个必须满足 Oracle 的密码复杂度要求,大小写字母加数字缺一不可。如果你设了一个弱密码,容器启动日志会明确告诉你密码复杂度不达标然后直接退出。

INIT_SGA_SIZE和INIT_PGA_SIZE是可选的内存调优参数。Oracle 的内存结构分两部分:SGA 是共享池、缓冲区等组件的集合,PGA 是每个会话私有的内存区。给 1G SGA 和 256M PGA 是开发环境的稳妥配置,注意两个值加起来别超过容器能拿到的总内存,不然 Oracle 内部计算会出问题。

--shm-size=4g是我强烈建议加上的一条。容器的 /dev/shm 默认只有 64MB,而 Oracle 的自动内存管理机制要在这个内存文件系统上工作,空间不够就会报 ORA-00845。这个错误很著名,后面我会在排查章节里再讲一次。

--restart=unless-stopped让 Docker 在守护进程重启或容器异常退出时自动拉起容器。对于数据库这种“最好一直别挂”的服务,这个策略比默认的no强太多。-v /data/oracle19c:/opt/oracle/oradata是数据持久化的关键,Oracle 的数据文件、控制文件、联机日志全在容器内的/opt/oracle/oradata目录下,挂载到宿主机后,容器删了数据都还在。

4.2 初始化流程与日志观察

启动容器之后,用docker logs -f oracle19c看日志,前几分钟你会看到一大堆数据库模板复制、建库、监听器启动的输出。当日志出现这句时,数据库就算准备好了:

DATABASE IS READY TO USE!

我实测过,从容器启动到 ready,通常需要一两分钟,取决于机器性能。这个过程中千万不要手贱去docker exec进去乱操作数据文件,让初始化脚本跑完。初始化脚本会在容器内创建一个叫/opt/oracle/checkDBStatus.sh的健康检查脚本,你可以用它来判断 Oracle 是否真的能接受连接。

如果你发现日志一直卡在某处不动,比如长期停留在Database creation finished但没出现 ready,多半是内存不够导致内部进程被 kill,或者磁盘空间不够。这时候把容器删掉,调整参数重新创建,比在容器里做各种急救要快得多。

4.3 进入容器验证数据库状态

初始化完成后,我们可以进容器内部做一轮验证。这一步能让你对容器里的 Oracle 状态心里有数:

docker exec -it oracle19c bash

进去后先切换用户,然后跑 sqlplus:

su - oracle sqlplus / as sysdba

数据库里执行这段 SQL,确认版本和实例状态:

select banner from v$version; select instance_name, status from v$instance;

19c 容器默认有一个 CDB 叫 ORCLCDB,一个 PDB 叫 ORCLPDB1。查看 PDB 状态可以用:

show pdbs; show con_name;

如果 PDB 没有打开,执行alter pluggable database ORCLPDB1 open;即可,大多数情况下它已经自动打开了。这一步很多人会忽略,结果外部连接时报“ORA-01033: ORACLE initialization or shutdown in progress”,其实不是密码错了,而是 PDB 没 open。

4.4 从宿主机外部连接验证

数据库内部没问题了,接着从宿主机外部验证连接。我用 DBeaver 或 Navicat 都测过,连接信息如下:

  • 主机:宿主机 IP 地址(Windows 上就是本机 IP,Linux 服务器就是公网或内网 IP)
  • 端口:15215(你映射到宿主机的端口)
  • 服务名:ORCLPDB1(或者 ORCLCDB,看你想连哪个库)
  • 用户名:system
  • 密码:创建容器时设置的 ORACLE_PWD

如果你连不上,先别急着怀疑 Oracle。用telnet 宿主机IP 15215测一下端口通不通,不通的话检查防火墙和安全组规则。这一步能帮你把问题切分清楚:到底是网络不通,还是 Oracle 监听没起来,还是连接串写错了。我在处理这类报错时,最怕的是用户一上来就说“数据库挂了”,结果是个防火墙问题。

5. 运维与持久化细节

5.1 数据持久化:容器删了怎么办

前面提到了挂载目录/opt/oracle/oradata,这是 Oracle 19c 容器里数据文件的默认存放位置。要验证持久化是否生效,方法很简单:往库里建一张测试表插入几条数据,然后执行docker stop oracle19c,再docker start oracle19c,等数据库 ready 后查数据,应该都还在。

再狠一点,执行docker rm -f oracle19c,然后用相同的挂载卷和参数重新docker run一个容器。因为数据文件已经在宿主机/data/oracle19c里了,新容器会把已有的数据文件直接加载起来,相当于“换了个进程,数据还在”。这条逻辑一定要记牢:Docker 容器本身是无状态的,有状态的是挂载卷。

除了/opt/oracle/oradata,容器里还有几个目录值得知道,比如/opt/oracle/scripts是自定义初始化脚本目录,你可以在里面放.sql或.sh脚本,容器启动时自动执行,非常适合做初始化测试数据。我自己做自动化测试时,就把建表脚本挂到这个目录下,每次起新容器时自动执行,省去手工导入的步骤。

5.2 自动重启与服务化管理

单机场景下,--restart=unless-stopped已经够用,Docker 守护进程在系统重启后会按照策略自动拉起容器。但生产环境再用 systemd 管理 Docker 服务时,还有一个细节要留意:确保 Docker 服务本身开机自启。用systemctl enable docker开启。

如果你需要更精细的启动顺序控制,比如 Nginx 必须在数据库起来之后才启动,可以给容器配上 healthcheck。用 Dockerfile 里的HEALTHCHECK指令,或者直接运行容器时加--health-cmd,把<容器内>/opt/oracle/healthcheck.sh作为检查命令。Docker 会根据检查结果把容器状态标成 healthy,编排工具就有了决策依据。

5.3 备份与恢复

数据库备份,方法其实不少,取决于你期望恢复到什么粒度。容器层面最简单的方案是用docker cp把挂载目录里的内容拷贝出来:

mkdir -p /backup/oracle19c docker cp oracle19c:/opt/oracle/oradata /backup/oracle19c

但这种方式在生产环境不推荐,因为数据库文件在拷贝过程中可能处于非一致性状态。数据库层面的标准做法是用 Oracle 的expdp逻辑导出,比如这样:

docker exec -it oracle19c bash -c "su - oracle -c 'expdp system/password@//localhost:1521/ORCLPDB1 schemas=SCOTT directory=DATA_PUMP_DIR dumpfile=scott.dmp logfile=scott.log'"

恢复时再用impdp导入。这种方式虽然慢一些,但导出的逻辑数据是跨平台通用的,拿到任何 Oracle 环境都能恢复,最稳。物理备份结合 rman 也可以做,但容器环境里我更倾向于逻辑导出,简单直接,不依赖 Oracle 版本补丁。

5.4 资源限制与调优

容器默认可以吞掉宿主机所有剩余内存,这在多服务共存的环境里很危险。我建议无论是生产还是开发,都给容器加资源上限:

docker update oracle19c --memory 4g --cpus 2

限制之后,容器内的 Oracle 会自动检测到内存变化,并把 SGA/PGA 按比例调整。如果你想更精细地控制 Oracle 内存,在创建容器时别忘了INIT_SGA_SIZE和INIT_PGA_SIZE两个参数。值得注意的是,这些参数只影响容器创建时执行建库脚本的过程,并非运行时动态调整,所以如果后期改参数,最好重新建容器或者直接进容器改 Oracle 内存参数。

还有一个小细节:Oracle 的 processes 参数默认可能只有几百,如果你的应用并发连接数较大,需要进容器修改processes和sessions参数并重启数据库实例。这属于常规 Oracle 调优,与容器关系不大。

5.5 管理操作速查

日常管理里,你大概率需要这几条命令:

  • 查看容器日志:docker logs -f oracle19c
  • 进入容器:docker exec -it oracle19c bash
  • 重启容器:docker restart oracle19c
  • 停止容器:docker stop oracle19c
  • 修改数据库密码:进入容器后执行alter user system identified by 新密码;
  • 执行 SQL:echo 'select 1 from dual;' | docker exec -i oracle19c sqlplus -s system/password@ORCLPDB1

把这些命令混熟,你对这套环境的管理能力基本就够用了。

6. 常见问题与排查实录

6.1 容器启动报 ORA-00845:MEMORY_TARGET not supported on this system

这个错误真的是所有新手都会撞上的第一堵墙。报错原因就是容器内的 /dev/shm 空间太小时,Oracle 的自动内存管理没法正常工作,它需要在这个内存文件系统里映射共享内存段。解决办法就是前面强调过的--shm-size参数。

如果你已经用docker run创建了容器但没加这个参数,补救方式是把容器删了重新创建。docker update无法修改已有容器的 shm-size,这是 Docker 的限制,所以这个参数必须在创建时指定。我调试这类问题时的习惯是:把日志里的 ORA 错误码拿去官方文档对照一下,而不是傻乎乎地反复重启容器。

6.2 端口映射对了,但外部一直连接超时

这类问题有个经典的排查路径。先在宿主机上执行telnet 127.0.0.1 15215,通不通?不通说明端口映射或监听有问题,通的话再用docker logs看容器内监听器状态。进入容器执行lsnrctl status,如果发现监听器没有监听容器内的 1521 端口,那很可能是宿主机的防火墙挡住了,也可能是你映射端口时把容器内端口写错了。

还有一种隐蔽情况是容器网络问题。如果你用的是自建的 docker 自定义网络,容器可能拿不到正确的 DNS 或者路由,导致 Oracle 内部某些跨容器连接失败。开发环境老老实实用默认桥接网络,最多加个--network参数指定到已有网络即可,不用自己去搞太复杂的网络拓扑。

6.3 宿主机磁盘不足导致启动或写入失败

Docker 容器启动或数据库运行过程中突然报磁盘满,这个问题的排查不复杂,但很容易被忽略。先看宿主机整体磁盘和 Docker 数据目录的区别:数据库数据文件在挂载目录,容器日志和镜像层在 Docker 数据目录,默认是/var/lib/docker。我的建议是把 Docker 数据目录也挪到空间够大的分区,尤其是那些构建了 6GB 超大镜像的机器,只靠系统盘 50GB 往往不够。

你还要关注容器内数据库文件增长,Oracle 的 redo log、undo 表空间会自动膨胀,开发环境经常被忽略,直到磁盘占满才报警。最好在宿主机层面给挂载目录做一个容量监控,磁盘使用率超过 80% 时提前处理。

6.4 中文乱码或字符集不匹配

连接上数据库之后,如果你发现中文数据全是??,大概率是字符集不匹配。容器内部环境的默认字符集一般是 AL32UTF8,而你的客户端可能用了别的字符集。解决办法是让连接工具和数据库环境保持一致,常用的连接工具里直接设置客户端编码为 UTF-8。

如果你在建库时对字符集有不同的要求,最省事的路径是在启动容器前修改或增加环境变量,或者在容器初始化阶段用自定义启动脚本执行alter database相关内容。不要试图在建库完成后再去改字符集,那会非常痛苦。

6.5 常见问题速查表

现象原因处理办法
容器一直自动重启内存不足或 ORA-00845调大内存、加--shm-size
ORA-12514 监听器找不到服务PDB 没 open 或连接串写错检查服务名,确认 PDB 处于 open 状态
ORA-01017 用户名密码错误密码被改过或输错重置 system 密码
外部 telnet 不通防火墙或安全组未放行放行宿主机映射端口
数据文件占满磁盘表空间持续增长清理旧数据或扩容挂载目录
容器删除后数据没了未挂载 oradata 卷确认启动命令包含-v参数

我自己用这套 Docker + Oracle 19c 环境跑业务已经超过一年,最大的体会就是:容器给了数据库“试错”的底气。以前装了一套环境,不敢乱动、不敢乱删,因为下一次安装成本太高;现在跑完测试直接docker rm,再拉起来一个新的干净环境,几十秒的事。所以如果你还在纠结要不要用 Docker 来跑 Oracle,我的建议非常简单:先在本地起一个测试容器,把这条命令练熟,体验一次“从零到 ready”的完整流程,你的后续决策都会变得轻松很多。

最后再分享一个小技巧:在你把整套环境跑得稳定之后,可以把docker run命令封装成一个 shell 脚本,脚本里写上所有你习惯的参数和挂载路径。以后不管是换机器还是交付给同事,一条脚本就解决全部问题,这门技术也算是真正吃到肚子里了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 5:37:15

网络拓扑图怎么画?从VLAN规划到eNSP仿真配置全解析

我经常在技术群里看到这样的求助帖&#xff1a;“各位大佬帮我画一个拓扑图。”后面往往跟着一张拍得歪歪扭扭的手写草图&#xff0c;或者只有一句“设备我都买好了”。刚开始我还会耐心回复&#xff0c;后来我发现&#xff0c;这类求助里有一个共同的误区&#xff1a;大家把“…

作者头像 李华
网站建设 2026/9/28 5:35:27

SecureCRT脚本自动化:实现网络设备批量巡检与配置备份

先说说我为什么写这篇东西。前一阵帮客户做一批路由器的配置巡检&#xff0c;三十多台设备&#xff0c;每台都要登录、看版本、查接口、记录状态。刚开始我老老实实一台一台敲&#xff0c;敲到第十台手指头就开始罢工了&#xff0c;复制粘贴还担心漏行。后来我花了一个下午&…

作者头像 李华
网站建设 2026/9/28 5:35:24

Golang后端性能优化实战:从P99飙升到pprof定位与调优

“你们服务的 P99 去哪儿了&#xff1f;”这是上周四凌晨两点&#xff0c;值班同事甩在群里的一句话。我接手的是一个订单查询服务&#xff0c;Golang 写的&#xff0c;Gin 框架&#xff0c;底层接 MySQL 和 Redis。平时请求量平稳&#xff0c;P99 大概在 200ms 上下&#xff0…

作者头像 李华
网站建设 2026/9/28 5:34:21

Git多人协作分支管理实战:合并、冲突与并行开发

做后端和前端一起联调的时候&#xff0c;最怕的不是代码冲突&#xff0c;而是“明明是一个项目&#xff0c;大家却在各自的分支里改出了平行宇宙”。尤其是团队一多、分支一乱&#xff0c;今天你合并了别人的功能&#xff0c;明天别人又把你刚刚修好的 bug 覆盖了&#xff0c;G…

作者头像 李华
网站建设 2026/9/28 5:33:48

PSO-CNN回归预测:用粒子群算法自动优化CNN超参数

简介&#xff1a;基于粒子群算法优化卷积神经网络&#xff08;PSO-CNN&#xff09;的Matlab完整源码&#xff0c;面向多变量输入的回归预测任务&#xff0c;支持多输入单输出结构&#xff0c;适合需要自动确定CNN超参数的科研与工程人员&#xff0c;也可用于能源、经济、环境等…

作者头像 李华
网站建设 2026/9/28 5:33:47

Jupyter Notebook机器学习案例实战:从数据预处理到模型评估

简介&#xff1a;基于Jupyter Notebook的机器学习基本模型算法教程&#xff0c;系统讲解从数据预处理到模型调优的完整流程&#xff0c;适合希望通过Python快速上手数据分析与建模的初学者及开发者。内容围绕NumPy、Pandas、Scikit-learn展开&#xff0c;覆盖线性回归、逻辑回归…

作者头像 李华