前置说明
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
总结
- 镜像管理核心 :
docker search(搜索)→docker pull(拉取)→docker save(打包)→docker rmi(删除)→docker load(加载),save/load保留镜像分层,适合镜像迁移; - Redis 容器运行关键:必须设置密码、开启持久化、限制资源、挂载数据卷,避免数据丢失和资源耗尽;
- 生产环境注意 :容器重启策略选
unless-stopped,端口映射需放行宿主机防火墙,定期备份数据卷。