Docker的通俗理解和通过宿主机端口访问Redis容器的实例

简介: 本文目标:引导初学者入门Docker,理解镜像、容器和宿主机概念,学习常用Docker命令,特别是如何创建并从Redis容器通过宿主机端口访问。关键点:- Docker核心:镜像(类)、容器(实例)、宿主机(运行环境)。- `docker pull` 拉取镜像,如 `redis:3.0`。- `docker run -d --name` 后台运行容器,如 `my-redis`。- `-p` 参数做端口映射,如 `6379:6379`。- `docker exec -it` 交互式进入容器,如 `bash` 或执行命令。

本文解决的问题:

  • 入门 docker
  • 理解镜像与容器、宿主机的概念
  • 理解 Docker 的常用指令
  • 创建 redis 容器,并通过宿主机端口访问

默认读者的知识背景:

  • 使用过 git
  • 初次使用 Docker

本文不会对 Docker 的定义作出解释,不会涉及 Docker 的实现原理,旨在帮助读者快速入门 docker,理解一些常用命令,能够创建并使用容器。

关键概念

如果想要更好地使用 Docker,就需要理解 “镜像“、”容器”和“宿主机”的概念,以及它们之间的关系。

镜像与容器|image & container

镜像与容器的关系,就像类与实例的关系。类是用来创建对象的蓝图,镜像说明如何创建一个容器。

如果使用过云服务器,你可能还记得在创建云服务器时,需要选择系统镜像。与之类似,Docker 在创建容器时也需要选择镜像。

宿主机|Host Machine

宿主机 ,指运行 Docker 的物理机器或虚拟服务器。例如,我在mac上使用docker,mac就是宿主机;在另一台云服务器上运行docker,云服务器就是宿主机。

容器与宿主机

容器是宿主机上的隔离环境。

每个容器看起来都像是一个独立的系统[1]。可以将 Docker 类比为一个本地的“腾讯云”,我们可以通过它在本地创建多台“云服务器”的实例——也就是一个个容器。

如果在不讨论实现原理情况下,单从表现上来看,容器和宿主机可以看作是相互独立的系统。

通过宿主机端口访问 redis 容器的操作实例

接下来,在每一步开始前,会先介绍需要的主要 Docker 命令。通过引用官方解释,帮着读者更好地理解 Docker 命令。

1. 从Docker Hub上拉取镜像

Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Download an image from a registry

使用 docker pull --help查看具体用法。

我们创建容器需要镜像[2],通常直接拉取镜像(默认从Docker Hub上拉取)。

拉取 redis 3.0 版本的镜像:docker pull redis:3.0

如果不加:tag,则默认 pull 最新版本。

如果要检查是否下载成功,使用docker images,会列出本地的镜像列表。

2. 创建并运行容器

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Create and run a new container from an image

使用 docker run --help查看具体用法。

现在我们有了tag3.0redis镜像,接下来以此来创建并运行容器。

docker run --name my-redis redis:3.0 : 创建并运行一个名字是my-redis,源自redis:3.0镜像的容器。

但是这个命令会让进程保持在终端运行,我们通常还有其他的任务,所以需要让容器在后台运行。

这时就需要加一个-d参数,即docker run --name my-redis -d redis:3.0

官方解释

-d, --detach     Run container in background and print container ID

前文提到了宿主机与容器的关系,从表面上看,是相互独立的。

因此,如果不配置端口映射,便无法通过宿主机的端口直接访问容器的端口。

这也导致新手常遇到的问题,例如,在docker上创建好的mysql数据库,运行项目时却连接不上。不过,在理解原理之后,这些问题也迎刃而解。

“容器端口映射”指的是,将宿主机的某个端口(例如80)映射到容器的某个端口上(例如8080),

docker run -d -p 80:8080 my_web_app

-p : 配置端口映射,宿主机端口->容器端口

现在,放上最终的创建并运行 redis 的命令,

docker run -d --name my-redis -p 6379:6379 redis

3. 连接容器内终端

我们的最终目的是操作容器中的目标程序。本质上是让容器执行相关命令。

Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Execute a command in a running container

使用 docker exec --help查看具体用法。

这个命令可以理解为“向容器发送一个指令”。例如,下面的代码让容器列出当前工作目录

% docker exec my-redis pwd
/data

通常,我们需要交互式地执行命令,

% docker exec -it my-redis bash
Options:
  -i, --interactive          Keep STDIN open even if not attached
  -t, --tty                  Allocate a pseudo-TTY

两个参数可以写在一起,即-it。表示进行交互式会话,并分配一个终端。

这条指令可以实现访问容器内的终端。

4. 访问 redis 命令行工具

在容器的终端内,输入 redis-cli 即可访问 redis 命令行工具。详细用法在此过多解释。


  1. 容器是一个轻量级的进程隔离环境,依赖主机操作系统的内核来运行。容器更像是被隔离的进程,包含应用程序及其所有依赖项,但没有完整的操作系统实例。每个容器看起来像是一个独立的系统,但实际上它只是主机操作系统上的一个隔离环境。这里不做过多解释,有兴趣可自行了解。 ↩︎
  2. 从Docker Hub或其他镜像仓库拉取镜像,也可以自己创建。
相关文章
|
10月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
934 6
|
应用服务中间件 nginx Docker
外部访问容器
外部访问容器
255 1
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
1670 3
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
应用服务中间件 nginx Docker
Docker同一台宿主机容器通信-通过容器名称互联
本文详细介绍了如何通过容器名称实现同一宿主机上容器间的互联,并提供了实战案例。首先,文章解释了容器间通过自定义名称访问的原理,随后演示了创建并连接Tomcat与Nginx容器的具体步骤。此外,还讨论了配置中可能出现的问题及解决方案,包括避免硬编码IP地址和使用自定义容器别名来增强系统的灵活性与可维护性。通过这些实践,展示了如何高效地配置容器间通信,确保服务稳定可靠。
1083 1
Docker同一台宿主机容器通信-通过容器名称互联
|
网络协议 Ubuntu 前端开发
好好的容器突然起不来,经定位是容器内无法访问外网了?测试又说没改网络配置,该如何定位网络问题
本文记录了一次解决前端应用集成到主应用后出现502错误的问题。通过与测试人员的沟通,最终发现是DNS配置问题导致的。文章详细描述了问题的背景、沟通过程、解决方案,并总结了相关知识点和经验教训,帮助读者学习如何分析和定位网络问题。
971 1
|
运维 JavaScript Linux
容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑
本文介绍了如何在Docker容器内的Node.js应用中获取宿主机的基础信息,包括系统信息、内存使用情况、磁盘空间和启动时间等。核心思路是将宿主机的根目录挂载到容器,但需注意权限和安全问题。文章还提到了使用`df -P`替代`df -h`以获得一致性输出,避免解析错误。
912 1
|
消息中间件 NoSQL Kafka
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
638 4
|
Docker 容器
一个docker容器暴露多个端口
一个docker容器暴露多个端口
405 3
|
消息中间件 Kubernetes 容器
在K8S中,同⼀个Pod的不同容器互相可以访问是怎么做到的?
在K8S中,同⼀个Pod的不同容器互相可以访问是怎么做到的?