使用Docker运行一个Redis容器,及其问题思考

457 阅读8分钟

要跑起来一个 Redis 容器,你可以使用 Docker 提供的官方 Redis 镜像。以下是详细的步骤:

1. 确保 Docker 已安装

首先,确保你的系统上已经安装了 Docker。如果没有安装,请参考 Docker 官方文档 进行安装。

2. 拉取 Redis 镜像

使用 Docker Hub 拉取 Redis 官方镜像。可以指定 Redis 的版本(例如 5.0 或最新版本)。

docker pull redis:5.0

3. 运行 Redis 容器

使用 docker run 命令启动 Redis 容器。以下是启动 Redis 容器的一些示例命令:

基本启动命令

docker run --name my_redis -d redis:5.0
  • --name my_redis:指定容器的名称为 my_redis
  • -d:以后台模式运行容器。
  • redis:5.0:使用 Redis 5.0 镜像。

端口映射

如果你希望将 Redis 容器的端口映射到宿主机的端口,可以使用 -p 选项。例如,将容器的 6379 端口映射到宿主机的 15003 端口:

docker run --name my_redis -d -p 15003:6379 redis:5.0

使用自定义配置文件

如果你有自定义的 Redis 配置文件,可以将其挂载到容器中。例如,假设配置文件在宿主机的 /path/on/host/redis.conf

docker run --name my_redis -d -v /path/on/host/redis.conf:/usr/local/etc/redis/redis.conf redis:5.0 redis-server /usr/local/etc/redis/redis.conf
  • -v /path/on/host/redis.conf:/usr/local/etc/redis/redis.conf:将宿主机上的配置文件挂载到容器中。
  • redis-server /usr/local/etc/redis/redis.conf:指定 Redis 启动时使用的配置文件路径。

4. 验证容器是否运行

使用 docker ps 命令查看正在运行的容器:

docker ps

你应该能看到名为 my_redis 的 Redis 容器在运行。

5. 连接到 Redis 容器

你可以使用 Redis CLI 工具连接到 Redis 容器。首先进入容器内:

docker exec -it my_redis redis-cli

这将启动 Redis CLI 并连接到 Redis 实例。你可以在 Redis CLI 中执行 Redis 命令,例如:

127.0.0.1:6379> PING
PONG

6. 停止和删除容器

如果你需要停止和删除 Redis 容器,可以使用以下命令:

  • 停止容器:
docker stop my_redis
  • 删除容器:
docker rm my_redis

总结

  1. 拉取 Redis 镜像docker pull redis:5.0
  2. 运行 Redis 容器
    • 基本启动:docker run --name my_redis -d redis:5.0
    • 端口映射:docker run --name my_redis -d -p 15003:6379 redis:5.0
    • 自定义配置文件:docker run --name my_redis -d -v /path/on/host/redis.conf:/usr/local/etc/redis/redis.conf redis:5.0 redis-server /usr/local/etc/redis/redis.conf
  1. 验证运行状态docker ps
  2. 连接 Redisdocker exec -it my_redis redis-cli
  3. 停止和删除容器docker stop my_redisdocker rm my_redis

这样,你就可以成功地启动和管理一个 Redis 容器。

---

使用docker的运行容器的时候,什么情况需要加-d参数?

  • 使用 -d 参数
    • 当你希望容器在后台运行,不占用当前终端。
    • 当你启动多个容器并希望它们都在后台运行。
    • 当容器需要长期运行的服务或任务。
    • 当容器的输出日志不重要,或不需要实时监控。
  • 不使用 -d 参数
    • 当你需要与容器交互,或监控容器的输出日志。
    • 当容器需要在前台模式运行,可能是调试或开发过程中。

选择是否使用 -d 参数取决于你的具体需求和容器的运行方式。

---

分别给一个实际可操作的例子,展示这个参数的作用和场景

当然!以下是两个实际的 Docker 容器运行示例,分别展示使用和不使用 -d 参数的场景和效果。

示例 1: 使用 -d 参数(后台模式)

场景:你希望启动一个 Redis 容器,并让它在后台运行,而不占用当前终端。这适合在生产环境中运行长期服务。

命令

docker run -d --name redis_server -p 6379:6379 redis:5.0

解释

  • -d:使容器在后台运行。
  • --name redis_server:指定容器名称为 redis_server
  • -p 6379:6379:将宿主机的 6379 端口映射到容器的 6379 端口。
  • redis:5.0:使用 Redis 5.0 镜像。

结果

  • 容器将在后台运行,你不会看到 Redis 容器的实时日志输出。
  • 使用 docker ps 命令可以查看正在运行的容器。
docker ps
  • 要查看容器日志,你可以使用 docker logs 命令:
docker logs redis_server

示例 2: 不使用 -d 参数(前台模式)

场景:你希望启动一个容器,并在容器内部运行一个交互式的 Bash shell。你需要与容器进行交互,监控容器的输出。

命令

docker run -it --name my_interactive_container ubuntu:latest /bin/bash

解释

  • -it:使容器运行在交互模式下,并将终端附加到容器的标准输入输出。
  • --name my_interactive_container:指定容器名称为 my_interactive_container
  • ubuntu:latest:使用最新的 Ubuntu 镜像。
  • /bin/bash:在容器中启动 Bash shell。

结果

  • 容器将在前台运行,并且你会进入容器内部的 Bash shell。
  • 你可以在容器中执行命令并实时看到输出。
  • 要退出容器,输入 exit 命令,这将停止并删除容器(如果你没有指定 --rm 选项,容器将会保留在停止状态)。
exit

总结

  • 使用 -d 参数
    • 场景:后台运行长期服务或应用。
    • 效果:容器在后台运行,不占用终端,可以继续执行其他命令。
  • 不使用 -d 参数
    • 场景:需要与容器进行交互,或监控容器的实时输出。
    • 效果:容器在前台运行,终端被容器的输出占用,适合调试或开发。

这两个示例展示了 -d 参数的作用和不使用该参数的效果,帮助你在不同场景下选择合适的容器运行方式。

---

如果执行的是 docker run -itd --name my_interactive_container ubuntu:latest /bin/bash 这样会怎么样

命令解释

docker run -itd --name my_interactive_container ubuntu:latest /bin/bash
  • -i:交互模式(Interactive)。保持标准输入流(stdin)打开,这样你可以与容器进行交互。
  • -t:伪终端(TTY)。为容器分配一个伪终端,通常与 -i 一起使用,方便容器的输出能够在终端中正确显示。
  • -d:后台模式(Detached)。让容器在后台运行,不阻塞当前终端。

实际效果

  1. 容器运行模式:由于 -d 参数的使用,容器将在后台运行,不会占用当前终端。即使你使用了 -i-t 参数,容器的终端会被分配,但是不会立即附加到你的当前终端。
  2. 容器的终端:尽管容器是在后台运行,-i-t 参数仍然为容器分配了一个伪终端。这意味着如果你之后需要进入这个容器的终端,你可以使用 docker attachdocker exec 命令连接到它。
  3. 进入容器终端:由于容器在后台运行,你可以使用以下命令附加到容器的终端:
docker attach my_interactive_container

或者你可以使用 docker exec 启动新的 Bash shell 进入容器:

docker exec -it my_interactive_container /bin/bash

注意:

如果使用 docker attach my_interactive_container 将会进入 docker run 中开辟的终端,此时在终端中敲入 exit,将会退出终端,导致容器没了这个唯一的进程而被销毁。

但是如果使用 docker exec 将会开辟新的终端(第二个终端), 哪怕是这个终端 exit 了,容器也有第一个终端进程在运行,而不会被销毁。

---

某些镜像是不是没有前台进程就会立刻被kill掉?对于这种情况,应该怎么解决?

是的,对于某些镜像,如果没有前台进程运行,容器会立即退出。这通常是因为 Docker 容器的生命周期与其主进程的生命周期绑定。当主进程结束时,容器也会退出。如果你希望容器持续运行,可以采取以下方法:

解决方法

  1. 使用长时间运行的进程
    选择一个长时间运行的进程作为容器的主进程。常见的做法是运行一个持续运行的服务或应用程序。
  2. 使用 tail -f /dev/null
    在某些情况下,你可能希望容器保持运行但不执行任何实际任务。这时可以使用 tail -f /dev/null 命令,使容器保持运行状态。
  3. 编写自定义的启动脚本
    编写一个启动脚本,该脚本在后台运行你需要的进程,并保持前台运行以防止容器退出。

示例

方法 1: 使用持续运行的服务

例如,使用一个简单的 Nginx 镜像,它本身就会持续运行:

docker run -d --name my_nginx nginx

方法 2: 使用 tail -f /dev/null

在没有其他前台进程的情况下,可以使用以下命令:

docker run -d --name my_container ubuntu:latest tail -f /dev/null

这个命令启动一个 Ubuntu 容器,并使用 tail -f /dev/null 保持容器运行。

方法 3: 自定义启动脚本

自定义 Dockerfile
如果你有特定的应用程序或服务需要在容器内运行,可以创建一个自定义的 Dockerfile,并指定一个长期运行的进程作为容器的主进程。

FROM ubuntu:latest
CMD ["tail", "-f", "/dev/null"]

构建并运行自定义镜像:

docker build -t my_ubuntu .
docker run -d --name ubuntu1 my_ubuntu

总结

选择适当的方法确保容器持续运行取决于你的需求。如果只是为了保持容器运行而不做实际任务,可以使用 tail -f /dev/null;如果需要执行某些后台任务,可以编写自定义启动脚本或使用长时间运行的服务。

  • 前台进程:长期运行的进程,与容器生命周期相关。当前台进程退出时,容器也会停止。
  • 后台进程:一次性或短暂运行的进程,不会保持容器的持续运行。

通过指定一个前台进程,可以确保容器保持运行状态。这样,可以在需要时进入容器并执行其他操作。