前言
本文解决的问题:
- 入门 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
查看具体用法。
现在我们有了tag
是3.0
的redis
镜像,接下来以此来创建并运行容器。
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 命令行工具。详细用法在此过多解释。