Docker搜索 Redis 镜像、拉取镜像、打包镜像、删除本地镜像、重新加载镜像,最后运行 Redis 容器的完整流程

前置说明

1.去 DockerHub 搜索 Redis 镜像

2.查看 Redis 镜像的名称和版本

3.利用 docker pull 命令拉取镜像

4.利用 docker save命令将 redis:latest 打包为一个 redis.tar.gz 包

5.利用 docker rmi 删除本地的 redis:latest

6.利用 docker load 重新加载 redis.tar.gz文件 7.用该镜像运行一个容器

所有命令均基于 Linux 环境(如 CentOS/Ubuntu),确保已安装 Docker 并启动(systemctl start docker),且具有 root/sudo 权限。

步骤 1:搜索 DockerHub 上的 Redis 镜像

命令

复制代码
# 搜索官方Redis镜像,过滤星级≥1000的结果,不截断描述,限制返回10条
docker search --filter is-official=true --filter stars=1000 --no-trunc --limit 10 redis

注意:命令走的是DockerHub 的 v1 搜索接口,国内网络下该接口本身就无法访问,大概率连接不上,要科学上网,但是这一步无伤大雅,不影响操作,也可以找镜像源就行

参数详细解释

参数 全称 作用
--filter is-official=true filter 仅显示 DockerHub 官方发布的镜像(避免非官方镜像的安全风险)
--filter stars=1000 filter 仅显示星级≥1000 的镜像(筛选高认可度的镜像)
--no-trunc no-trunc 不截断镜像描述(默认会截断长描述,方便查看完整信息)
--limit 10 limit 限制返回结果数量(默认 25 条,减少冗余)
redis - 搜索关键词(指定要找的镜像名称)

执行结果示例

复制代码
NAME      DESCRIPTION                                                                               STARS     OFFICIAL   AUTOMATED
redis     Redis is an open source key-value store that functions as a data structure server.        12000+    [OK]       

从结果中可看到:

  • 镜像名称:redis(官方镜像)
  • 无具体版本显示(需拉取后或查看 DockerHub 页面确认版本,latest为默认标签)

步骤 2:查看 Redis 镜像的名称和版本(拉取前 / 后)

2.1 拉取前

可访问 Redis 镜像的 DockerHub 页面(https://hub.docker.com/_/redis)查看所有可用版本(如 7.2、7.0、6.2、latest 等)。

2.2 拉取后(查看本地镜像的名称和版本)

先执行拉取命令(步骤 3),再执行以下命令:

复制代码
docker images redis

执行结果示例

复制代码
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
redis        latest    7614ae9453d1   2 hours ago    130MB

字段解释:

  • REPOSITORY:镜像名称(redis)
  • TAG:镜像版本(latest,默认最新稳定版)
  • IMAGE ID:镜像唯一标识(可简写用于命令操作)
  • SIZE:镜像大小

步骤 3:拉取 Redis 镜像(docker pull)

命令(核心)

复制代码
# 拉取官方redis:latest镜像(默认拉取amd64架构,如需其他架构加--platform)
docker pull redis:latest
# 如需指定架构(如arm64),执行:
# docker pull --platform linux/arm64 redis:latest

参数详细解释

参数 全称 作用
--platform linux/arm64 platform 指定镜像的 CPU 架构(可选,默认匹配宿主机架构,如 x86_64=amd64)
redis:latest - 要拉取的镜像名称 + 版本标签(latest为默认标签,代表最新稳定版)

执行结果示例

复制代码
[root@localhost ~]# docker pull redis:latest
latest: Pulling from library/redis
9c6dc2f051d0: Pull complete 
87cb049a6d7d: Pull complete 
c02d17997ce3: Pull complete 
4e5d87291b59: Pull complete 
e5a35462b9a7: Pull complete 
b308a2348d28: Pull complete 
4f4fb700ef54: Pull complete 
222c7cf21fcb: Download complete 
92752f2200e8: Download complete 
Digest: sha256:73dad4271642c5966db88db7a7585fae7cf10b685d1e48006f31e0294c29fdd7
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest

步骤 4:打包 redis:latest 为 redis.tar.gz(docker save + 压缩)

docker save默认输出 tar 格式,需结合gzip压缩为 tar.gz,核心命令分两种方式:

方式 1:直接生成压缩包(推荐)

复制代码
# 将redis:latest打包并压缩为redis.tar.gz,输出到当前目录
docker save redis:latest | gzip > redis.tar.gz

方式 2:先生成 tar 包,再压缩(便于理解)

复制代码
# 第一步:生成未压缩的tar包
docker save -o redis.tar redis:latest
# 第二步:压缩为tar.gz
gzip redis.tar
# 最终生成redis.tar.gz

参数详细解释

参数 全称 作用
docker save - 导出镜像为 tar 文件(保留镜像分层、元数据,区别于 docker export)
-o redis.tar output 指定导出的 tar 文件路径和名称(必选,否则输出到控制台)
redis:latest - 要导出的镜像名称 + 标签
gzip - Linux 压缩命令,将 tar 包压缩为 gz 格式(减少文件体积)

验证打包结果

复制代码
# 查看文件是否生成
ls -lh redis.tar.gz
# 输出示例:-rw-r--r-- 1 root root 58M Jan 27 10:00 redis.tar.gz

步骤 5:删除本地的 redis:latest 镜像(docker rmi)

命令(核心)

复制代码
# 先检查是否有基于该镜像运行的容器(有则先停止/删除)
docker ps -a | grep redis
# 若有运行中的容器,先强制删除容器:docker rm -f 容器ID/名称
# 再删除镜像
docker rmi redis:latest
# 若镜像被占用,强制删除:docker rmi -f redis:latest

参数详细解释

参数 全称 作用
docker rmi remove image 删除本地镜像
-f force 强制删除(即使有容器引用该镜像,需谨慎使用)
redis:latest - 要删除的镜像名称 + 标签

验证删除结果

复制代码
docker images redis
# 输出示例:REPOSITORY   TAG       IMAGE ID       CREATED        SIZE(无结果,说明删除成功)

步骤 6:重新加载 redis.tar.gz 镜像(docker load)

命令(核心)

复制代码
# 从压缩包加载镜像
gunzip -c redis.tar.gz | docker load
# 若先解压为tar包,执行:docker load -i redis.tar

参数详细解释

参数 全称 作用
gunzip -c - 解压压缩包并输出到控制台(不删除原压缩包)
docker load - 导入 docker save 生成的 tar 文件(恢复镜像分层和元数据)
-i redis.tar input 指定要导入的 tar 文件路径(必选,否则从控制台读取)

执行结果示例

复制代码
Loaded image: redis:latest

验证加载结果

复制代码
[root@localhost ~]# gunzip -c redis.tar.gz | docker load 
Loaded image: redis:latest
[root@localhost ~]# docker images
                                                                                                                                i Info →   U  In Use
IMAGE          ID             DISK USAGE   CONTENT SIZE   EXTRA
mysql:9.6      6b18d01fb632       1.26GB          283MB        
nginx:1.28.1   0a1f2fb3231e        237MB         65.7MB        
redis:latest   73dad4271642        203MB         55.4MB  

步骤 7:用加载后的镜像运行 Redis 容器(完整生产级流程)

7.1 核心命令(带所有关键参数)

复制代码
# 1. 创建Redis数据卷(持久化数据,避免容器删除丢失数据)
docker volume create redis-data

# 2. 运行Redis容器
docker run \
--name redis-server \          # 自定义容器名称(便于管理,避免随机名称)
-d \                           # 后台运行容器(守护进程模式,不占用终端)
-p 6379:6379 \                 # 端口映射:宿主机6379 → 容器6379
-e REDIS_PASSWORD=123456 \     # 设置Redis密码(生产环境必加,避免无密码访问)
--restart unless-stopped \     # 重启策略:除非手动停止,否则Docker重启/宿主机重启后自动启动
--cpus 1 \                     # 限制CPU核心数:最多使用1核
-m 512M \                      # 限制内存:最多使用512MB
-v redis-data:/data \          # 挂载数据卷:redis-data → 容器/data(Redis默认数据目录)
-v /etc/localtime:/etc/localtime:ro \  # 同步宿主机时间(避免容器时间与宿主机不一致)
redis:latest \                 # 要运行的镜像名称+标签
redis-server \                 # 容器启动命令(指定Redis启动参数)
--requirepass 123456 \         # Redis启动参数:设置密码(与-e参数重复,双重保障)
--appendonly yes \             # 开启AOF持久化(保证数据不丢失)
--maxmemory 400mb \            # Redis最大内存限制(小于容器内存限制)
--maxmemory-policy allkeys-lru # 内存满时的淘汰策略:删除最少使用的键

7.2 参数详细解释(按顺序)

参数 作用 生产环境必要性
--name redis-server 自定义容器名称,替代随机名称(如angry_morse),便于后续操作(如docker stop redis-server 必选
-d 后台运行,容器在后台持续运行,关闭终端不影响 必选
-p 6379:6379 端口映射,外部可通过宿主机 IP:6379 访问 Redis;若宿主机 6379 被占用,可改为-p 6380:6379 必选(需对外访问时)
-e REDIS_PASSWORD=123456 设置环境变量,部分镜像支持通过环境变量配置 Redis(需配合启动参数) 必选(生产环境必须设密码)
--restart unless-stopped 重启策略:Docker 服务重启 / 宿主机重启后,容器自动启动(除非手动docker stop);替代值:always(始终重启)、on-failure:3(异常退出最多重启 3 次) 必选
--cpus 1 限制容器 CPU 使用,避免 Redis 占用全部 CPU 资源 必选
-m 512M 限制容器内存使用,避免 Redis 耗尽宿主机内存触发 OOM 必选
-v redis-data:/data 挂载命名卷到 Redis 数据目录,容器删除后数据仍保留;/data是 Redis 默认数据存储目录 必选
-v /etc/localtime:/etc/localtime:ro 同步宿主机时间,ro表示只读(避免容器修改宿主机时间) 推荐
redis:latest 指定要运行的镜像(加载后的 Redis 镜像) 必选
redis-server Redis 容器的启动命令(默认也是此命令,可省略) 可选
--requirepass 123456 Redis 核心配置:设置访问密码(生产环境必须) 必选
--appendonly yes 开启 AOF 持久化(Redis 默认仅开启 RDB,AOF 更可靠) 必选
--maxmemory 400mb Redis 进程的最大内存(需小于容器内存限制-m 512M 必选
--maxmemory-policy allkeys-lru 内存满时的淘汰策略,allkeys-lru是最常用的策略 必选

7.3 验证容器运行状态

复制代码
# 1. 查看容器是否运行
docker ps | grep redis-server
# 输出示例:7f9e8d7c6b5a   redis:latest   "docker-entrypoint.s..."   10 seconds ago   Up 9 seconds   0.0.0.0:6379->6379/tcp   redis-server

# 2. 测试Redis连接(验证密码和服务)
docker exec -it redis-server redis-cli
# 进入Redis客户端后执行:
127.0.0.1:6379> AUTH 123456  # 输入密码
OK                            # 验证成功
127.0.0.1:6379> SET test key  # 测试写入
OK
127.0.0.1:6379> GET test      # 测试读取
"key"


redis-cli:Redis 自带的命令行客户端工具
这个工具是 Redis 官方镜像内置的(不用你手动安装),执行后会启动 Redis 的客户端;
启动后会自动连接容器本地的 Redis 服务(默认127.0.0.1:6379),因为容器内的 Redis 默认监听本地,所以不用额外指定 IP 和端口。

redis-cli是进入 Redis 专属客户端,而bash/sh是进入容器的系统交互式 Shell,能像操作普通 Linux 服务器一样,在容器内部执行各种系统命令。

注意:

遇到以下问题是关闭了防火墙导致的

复制代码
[root@localhost ~]# docker run --rm -d -e REDIS_PASSWARD=123456 -p 6379:6379 redis:latest 
fae2908925f614eaeadb8aa7700aff2599bb496fbb1452ec19912a24febdb754
docker: Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint great_liskov (c77e72aa218bdf53544925236bc75155e1a5e44d0b9ea20b0e669abcefe7c486): Unable to enable DNAT rule:  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 6379 -j DNAT --to-destination 172.17.0.2:6379 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1))

关闭 firewalld 不是直接导致 Docker 运行失败,而是 Linux系统中 firewalld 作为 iptables 的「上层管理工具」,关闭它时会默认清空所有 iptables 规则(包括 Docker 专属的 DOCKER 链),而 Docker 的端口映射(-p参数)完全依赖 iptables 的 DOCKER 专属链实现,链被删了,Docker 就加不上端口映射的网络规则,自然报No chain/target/match by that name错误。

是不是必须开启 firewalld才能用 Docker?

复制代码
不是!只是对新手来说,开启 firewalld 是最省事的方式(不用手动维护 iptables 规则)。如果想关闭 firewalld 又能正常用 Docker,需要阻止 firewalld 关闭时清理 iptables 规则,执行以下命令即可(适合有一定基础的场景):
bash
运行
# 关闭firewalld的规则清理功能(永久生效)
sed -i 's/^CleanupOnExit=yes/CleanupOnExit=no/' /etc/firewalld/firewalld.conf
# 重启firewalld让配置生效
systemctl restart firewalld
# 之后再关闭firewalld,就不会清理iptables规则/链了
systemctl stop firewalld

7.4 容器常用管理命令

复制代码
# 停止容器
docker stop redis-server

# 启动容器
docker start redis-server

# 查看容器日志(排查问题)
docker logs -ft redis-server

# 进入容器
docker exec -it redis-server /bin/bash

# 删除容器(需先停止)
docker rm -f redis-server

总结

  1. 镜像管理核心docker search(搜索)→ docker pull(拉取)→ docker save(打包)→ docker rmi(删除)→ docker load(加载),save/load保留镜像分层,适合镜像迁移;
  2. Redis 容器运行关键:必须设置密码、开启持久化、限制资源、挂载数据卷,避免数据丢失和资源耗尽;
  3. 生产环境注意 :容器重启策略选unless-stopped,端口映射需放行宿主机防火墙,定期备份数据卷。
相关推荐
醒过来摸鱼3 小时前
redis源码deps目录
数据库·redis·缓存
CheungChunChiu3 小时前
视频编解码与 GOP 结构详解
linux·视频编解码
小舞O_o3 小时前
CondaError: Run ‘conda init‘ before ‘conda activate‘
linux·python·conda
RisunJan3 小时前
Linux命令-lha(压缩或解压缩lzh格式文件)
linux·运维·服务器
Huanlis3 小时前
Redis Stream 核心原理与实战指南
数据库·redis·缓存
范纹杉想快点毕业3 小时前
嵌入式通信协议深度解析:从SPI/I2C到CAN总线的完整实现指南嵌入式工程师的炼成之路:从校园到实战的跨越
linux·运维·服务器·数据库·算法
0思必得03 小时前
[Web自动化] 数据抓取、解析与存储
运维·前端·爬虫·selenium·自动化·web自动化
zmjjdank1ng3 小时前
理解bash和shell
linux·运维·开发语言·bash
守城小轩3 小时前
基于Chrome140的Bing自动化(关键词浏览)——脚本撰写(二)
运维·自动化·chrome devtools·浏览器自动化·指纹浏览器·浏览器开发
小王要努力上岸4 小时前
Linux 系统启动流程
linux·运维