Docker容器和镜像含义与操作命令
Docker容器和镜像含义与操作命令

一、Docker 核心概念:镜像与容器的奇妙世界
(一)镜像:Docker 的 “万能模板”
如果把 Docker 比作是一个神奇的魔法世界,那么镜像就是这个世界里的 “万能模板”,更形象点说,它就像是应用的 “种子”。你可以想象,这个种子里蕴含着长出一棵参天大树(应用)所需的所有基因(代码、依赖库、运行时环境等)。不管你把这颗种子种在肥沃的黑土地(高性能服务器)上,还是贫瘠的沙土地(低配测试机)里,只要有合适的阳光雨露(Docker 引擎),它都能按照种子里预设的基因密码,长出一模一样的大树。
镜像采用的是一种非常巧妙的分层结构,就像一个多层的大蛋糕。每一层都代表着对镜像的一次修改步骤,比如安装一个软件包、复制一段代码。这些层从下往上层层叠加,最终形成了我们完整的镜像。以一个基于 Ubuntu 系统的 Python 应用镜像为例,最底层是 Ubuntu 操作系统的基础镜像,就像是蛋糕的底层,为整个镜像提供了最基本的运行环境;往上一层可能是安装 Python 解释器和相关依赖库,这一层就像是在蛋糕底层上添加了丰富的奶油和水果,让应用具备了运行的能力;再往上一层就是复制我们的 Python 应用代码,这就像是在蛋糕上放上了最诱人的巧克力装饰,完成了整个应用的搭建。
这种分层结构可不仅仅是看起来有趣,它还有着巨大的优势。首先,它大大节省了存储空间。因为多个镜像可以共享相同的基础层,就好比很多蛋糕都可以使用同样的底层蛋糕胚,而不需要每个蛋糕都单独制作一个完整的底层。比如说,你有多个基于 Ubuntu 系统的镜像,它们都共享 Ubuntu 基础镜像这一层,只需要存储一次,而不是每个镜像都重复存储。这样一来,在你的磁盘上就能存放更多的镜像,节省了宝贵的磁盘空间。
其次,分层结构还能加速镜像的构建过程。当你对镜像进行修改时,Docker 只会重建被修改的层,而不是重建所有层。就像你要修改蛋糕上的巧克力装饰,只需要重新制作巧克力这一层,而不需要把整个蛋糕都重新做一遍。这大大缩短了镜像构建的时间,提高了开发和部署的效率。假设你只是修改了 Python 应用的某一个功能,那么只需要重建包含这个功能代码的那一层,其他层可以直接复用之前的缓存,快速完成镜像的更新。
那么,我们如何获取这些神奇的 “种子”(镜像)呢?最常见的方式就是从 Docker Hub 这样的镜像仓库里获取。Docker Hub 就像是一个巨大的种子库,里面存放着各种各样的镜像,有官方的,也有来自全球开发者贡献的。你可以通过简单的docker pull命令,从这个种子库里把你需要的种子(镜像)下载到本地。比如说,你想要一个 Nginx web 服务器的镜像,只需要在命令行中输入docker pull nginx ,Docker 就会像一个勤劳的小蜜蜂,从 Docker Hub 上把 Nginx 镜像下载到你的电脑上,速度飞快,就像魔法一样。除了 Docker Hub,还有一些其他的公共镜像仓库,如阿里云镜像仓库、腾讯云镜像仓库等,它们也提供了丰富的镜像资源,并且在国内的网络环境下,下载速度可能会更快,就像是在你家附近开了一个小种子库,让你能更方便地获取种子。
镜像在 Docker 的世界里扮演着至关重要的角色,它是容器化应用的基础,就像种子是植物生长的基础一样。通过理解镜像的概念、分层结构以及获取方式,我们就像是掌握了打开 Docker 魔法世界大门的钥匙,为后续创建和管理容器做好了充分的准备。
(二)容器:镜像的 “变身之旅”
我们了解了镜像就像是应用的 “种子”,那么容器就是这颗种子发芽、生长后结出的 “果实”,是镜像的 “变身之旅”。当我们从镜像创建容器时,就像是把种子种在了肥沃的土壤里,它会迅速生长,变成一个可以实际运行的应用实例。
容器是如何从镜像创建而来的呢?其实过程非常简单,就像你按照菜谱(镜像)来制作一道美食(容器)一样。当你执行docker run命令时,Docker 会首先检查本地是否存在指定的镜像,如果没有,它会自动从镜像仓库(如 Docker Hub)中拉取该镜像,就像你发现菜谱上的食材家里没有,就会去超市购买一样。拉取完成后,Docker 会基于这个镜像创建一个容器,这个容器就像是按照菜谱制作出来的美食,拥有自己独立的 “小厨房”(文件系统、进程空间、网络空间等),但它们都共享主机的内核,就像多个小厨房共享同一个大房子的水电设施。
容器的生命周期管理是我们在使用 Docker 过程中需要重点关注的内容,它包括创建、启动、停止、删除等一系列操作,就像我们照顾一个生命,从它诞生、成长、休息到最后结束它的使命。下面我们来详细了解一下这些操作:
- 创建容器:使用docker create命令可以创建一个新的容器,但此时容器处于停止状态。例如,docker create --name my_nginx nginx ,这条命令会创建一个名为my_nginx的容器,基于nginx镜像,但容器此时还没有运行起来。
- 启动容器:通过docker start命令可以启动一个已经创建好的容器,让它开始工作。比如docker start my_nginx ,执行这条命令后,my_nginx容器就会启动,Nginx 服务器开始运行,等待接收客户端的请求。
- 停止容器:当我们需要让容器暂时休息一下时,可以使用docker stop命令。它会向容器内的主进程发送一个停止信号,让容器内的应用程序进行一些清理工作,如保存数据、关闭连接等,然后优雅地停止运行。例如docker stop my_nginx ,执行后my_nginx容器就会停止运行。
- 删除容器:当一个容器不再被需要时,我们可以使用docker rm命令将其删除,就像我们把不再使用的物品扔掉一样。不过要注意,在删除容器之前,需要先停止容器,否则会报错。比如docker rm my_nginx ,这条命令会删除名为my_nginx的容器。如果想要强制删除正在运行的容器,可以使用docker rm -f my_nginx ,但这种方式可能会导致数据丢失,所以在生产环境中要谨慎使用。
为了更直观地理解容器状态的变化,下面是一个容器状态变化的示意图:
+-----------------+
| Created | <--- docker create
+-----------------+
|
v
+-----------------+
| Running | <--- docker start
+-----------------+
| ^
| |
v | docker restart
+-----------------+ |
| Stopped | <--- docker stop |
+-----------------+ |
| |
| v
+-----------------+
| Deleted | <--- docker rm
+-----------------+
在这个示意图中,我们可以清晰地看到容器从创建到删除的整个生命周期过程,以及每个状态之间的转换是由哪些命令触发的。通过对容器生命周期的有效管理,我们可以灵活地控制应用程序的运行,根据实际需求启动、停止或删除容器。
二、Docker 常用命令:开启高效操作之门
现在我们已经了解了 Docker 的基本概念和安装配置方法,接下来就该学习如何使用 Docker 的常用命令来操控这个神奇的容器世界啦!这些命令就像是魔法师的咒语,能让我们轻松地创建、管理和运行容器。别担心,我会用最通俗易懂的方式,结合实际案例,带你一步步掌握这些命令。
(一)镜像操作命令
- 搜索镜像(docker search):当我们需要一个镜像,但又不知道具体的镜像名称或者想看看有哪些相关的镜像可供选择时,docker search命令就派上用场啦!它就像是一个神奇的搜索引擎,能在 Docker Hub 这个巨大的镜像仓库里帮我们找到想要的镜像。比如,我们想找一个用来搭建 Web 服务器的镜像,就可以在命令行中输入docker search nginx ,Docker 就会像一个勤劳的小蜜蜂,在 Docker Hub 上搜索所有包含 “nginx” 关键词的镜像,并把搜索结果展示给我们。搜索结果通常会包含镜像的名称、描述、星级(表示受欢迎程度)、是否官方镜像以及是否是自动构建的等信息,就像下面这样:
$ docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 16848 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker. 1787 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of... 848 [OK]
从上面的结果中,我们可以看到官方的nginx镜像,它的星级很高,说明很受欢迎,而且是官方发布的,质量有保障;还有一些其他开发者基于nginx制作的定制镜像,比如jwilder/nginx-proxy是一个自动化的 Nginx 反向代理镜像,richarvey/nginx-php-fpm则是包含了 Nginx 和 PHP - FPM 的镜像,适用于运行 PHP 应用。如果我们想更精确地筛选镜像,还可以使用一些选项,比如-s选项可以指定只列出收藏数不小于指定值的镜像,–automated选项只列出 automated build 类型的镜像,–no-trunc选项显示完整的镜像描述 。例如,docker search -s 100 nginx ,这条命令会只列出收藏数大于等于 100 的与 “nginx” 相关的镜像,帮助我们更快地找到热门且可靠的镜像。
-
拉取镜像(docker pull):找到了心仪的镜像,下一步就是把它拉取到本地,就像把宝藏从远方的仓库搬运到自己家里一样。docker pull命令就是负责这项搬运工作的 “搬运工”。比如,我们决定使用官方的nginx镜像,就可以在命令行中输入docker pull nginx ,Docker 会自动从 Docker Hub 上把nginx镜像下载到本地。如果我们想拉取特定版本的镜像,可以在镜像名称后面加上冒号和版本号,例如docker pull nginx:1.23.1 ,这样就能拉取到指定版本为 1.23.1 的nginx镜像啦。拉取过程中,我们可以看到 Docker 会逐步下载镜像的各个层,就像把一个大箱子里的东西一件一件地搬到我们的电脑上,并且会显示下载的进度和状态 。当下载完成后,我们就可以在本地使用这个镜像来创建容器了。
-
查看本地镜像(docker images):拉取了一堆镜像后,我们可能想看看本地都有哪些镜像,它们的详细信息是什么,这时候docker images命令就闪亮登场了。它就像是一个镜像仓库管理员,能帮我们列出本地所有的镜像。在命令行中输入docker images ,Docker 会展示一个表格,包含镜像的仓库源名称(REPOSITORY)、标签(TAG)、镜像 ID(IMAGE ID)、创建时间(CREATED)以及镜像大小(SIZE)等信息 。例如:
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 7e4d58f0e5f3 2 weeks ago 142MB ubuntu 22.04 85886019768d 3 weeks ago 77.8MB从这个结果中,我们可以清楚地看到本地有一个nginx镜像,标签是latest,表示最新版本,镜像 ID 是7e4d58f0e5f3 ,创建时间是 2 周前,大小为 142MB;还有一个ubuntu镜像,版本是22.04 ,镜像 ID 是85886019768d ,创建时间是 3 周前,大小为 77.8MB。如果我们只想查看镜像 ID,可以使用-q选项,即docker images -q ,这样就只会输出镜像 ID,方便我们在需要批量操作镜像 ID 时使用 。
-
删除镜像(docker rmi):当我们不再需要某个镜像,或者镜像占用了太多磁盘空间,想要清理一下时,docker rmi命令就可以帮我们把镜像删除掉,就像把仓库里不再需要的物品扔掉一样。比如,我们想删除本地的nginx:latest镜像,可以在命令行中输入docker rmi nginx:latest ,Docker 会询问我们是否确定要删除,确认后就会把这个镜像删除掉。如果镜像正在被容器使用,直接删除会报错,这时候我们需要先停止并删除使用该镜像的容器,或者使用-f选项强制删除 。例如,docker rmi -f nginx:latest ,这条命令会强制删除nginx:latest镜像,即使它正在被容器使用,但要注意,这种强制删除可能会导致正在运行的容器出现问题,所以在生产环境中要谨慎使用 。
(二)容器操作命令
- 创建并运行容器(docker run):有了镜像,接下来就要用它来创建并运行容器啦,这就像是用种子种出植物一样。docker run命令是创建并运行容器的关键命令,它的功能非常强大,有很多选项可以让我们灵活地定制容器的运行方式。比如,我们要创建并运行一个nginx容器,让它在后台运行,并且把容器的 80 端口映射到主机的 8080 端口,还为容器指定一个名字叫my_nginx ,可以使用以下命令:
docker run -d -p 8080:80 --name my_nginx nginx
这里的-d选项表示让容器在后台运行,就像把植物放在一个看不见的温室里生长;-p 8080:80表示将主机的 8080 端口映射到容器的 80 端口,这样我们就可以通过访问主机的 8080 端口来访问容器内运行的nginx服务,就像给温室开了一扇通往外界的门;–name my_nginx是给容器取一个名字,方便我们后续管理和操作,就像给植物取一个独特的名字;最后的nginx表示基于nginx镜像来创建容器 。执行这条命令后,Docker 会快速创建并启动容器,我们可以通过访问http://localhost:8080来查看nginx的默认页面,就像打开温室的门,看到里面茁壮成长的植物一样。
- 查看正在运行的容器(docker ps):容器运行起来后,我们可能想看看有哪些容器正在运行,它们的状态如何,docker ps命令就可以满足我们的这个需求。它就像是一个容器状态探测器,能列出当前正在运行的容器信息。在命令行中输入docker ps ,Docker 会展示一个表格,包含容器 ID(CONTAINER ID)、镜像名称(IMAGE)、容器创建时间(CREATED)、容器状态(STATUS)、端口映射信息(PORTS)以及容器名称(NAMES)等 。例如:
$ docker ps
CONTAINER ID IMAGE CREATED STATUS PORTS NAMES
56c6c89f0c86 nginx 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp my_nginx
从这个结果中,我们可以看到有一个容器正在运行,容器 ID 是56c6c89f0c86 ,基于nginx镜像创建,2 分钟前创建,目前已经运行了 2 分钟,端口映射是将主机的 8080 端口映射到容器的 80 端口,容器名称是my_nginx 。如果我们想查看所有容器,包括已经停止的容器,可以使用-a选项,即docker ps -a ,这样就能看到所有容器的信息了 。
-
停止容器(docker stop):当我们不需要某个容器继续运行时,就可以使用docker stop命令来停止它,就像让生长的植物暂时休息一下。比如,我们要停止刚才运行的my_nginx容器,可以在命令行中输入docker stop my_nginx ,Docker 会向容器发送停止信号,容器会进行一些清理工作,然后优雅地停止运行 。执行这条命令后,再使用docker ps命令查看,就会发现my_nginx容器已经不在正在运行的容器列表中了 。
-
启动已停止的容器(docker start):如果我们想让已经停止的容器重新运行起来,就可以使用docker start命令,就像让休息的植物重新开始生长。比如,我们之前停止了my_nginx容器,现在想重新启动它,可以在命令行中输入docker start my_nginx ,Docker 会快速启动容器,使其恢复运行状态 。启动后,我们又可以通过访问http://localhost:8080来访问nginx服务了 。
-
重启容器(docker restart):有时候我们需要对正在运行的容器进行重启操作,以应用一些配置更改或者解决一些临时问题,这时候docker restart命令就派上用场了。它就像是给正在生长的植物来一次 “重新唤醒”,让它以新的状态继续生长。比如,我们要重启my_nginx容器,可以在命令行中输入docker restart my_nginx ,Docker 会先停止容器,然后再重新启动它,整个过程非常快速 。重启后,容器内的应用会重新初始化,就像植物重新焕发活力一样 。
-
进入正在运行的容器(docker exec):有时候我们需要进入正在运行的容器内部,查看一些文件、执行一些命令或者调试应用,docker exec命令就可以帮助我们实现这个操作,就像打开温室的门,走进里面去检查植物的生长情况。比如,我们要进入my_nginx容器,在容器内执行bash命令,进入容器的命令行环境,可以使用以下命令:
docker exec -it my_nginx bash
这里的-it选项表示以交互模式(-i)和终端模式(-t)进入容器,这样我们就可以在容器内的命令行中进行操作,就像在本地终端一样方便 。执行这条命令后,我们会进入容器的命令行环境,提示符会变成容器内的提示符,这时候我们就可以执行各种命令了,比如查看容器内的文件系统、安装软件等 。当我们完成操作后,输入exit命令就可以退出容器 。
更多推荐
所有评论(0)