Docker 简介

镜像与容器

理解镜像和容器的关系,掌握查看、启动、停止、删除等常用 Docker 命令。

🎯 引言

学完这篇文章,你能说清楚镜像(Image)和容器(Container)分别是什么、两者是什么关系,并熟练掌握 Docker 日常使用中高频的命令:查看、启动、停止、进入、删除。这些命令在后续所有课程里都会反复用到。


🧱 什么是镜像

镜像(Image)是一个软件的打包模板,里面包含了软件本身和它运行所需的全部环境。

可以拿前端熟悉的 npm 包类比:你 npm install 一个包,得到的是别人打包好的代码。镜像也类似,只不过它打包的尺度更大:不只是代码,还包括运行环境。比如 nginx 镜像里就有 Nginx 程序和它的依赖,mysql:8 镜像里就有完整的 MySQL 8。

镜像的名称后面可以跟标签(Tag),用冒号分隔,通常表示版本:

  • nginx:不指定标签,默认用 latest(最新版)。
  • mysql:8:指定使用 MySQL 8 版本的镜像。

🧱 什么是容器

容器(Container)是根据镜像运行起来的实例。镜像本身是静态的模板,躺在磁盘上什么也不能做;docker run 一下,它就变成一个正在运行的容器。

镜像和容器的关系,可以用类(Class)和对象(Instance)来类比:

  • 镜像像类:一份定义,可以被使用多次。
  • 容器像对象:由类 new 出来的实例,可以 new 出很多个,互不影响。

所以一个 nginx 镜像可以同时运行出 web1web2 两个容器,分别映射到不同端口,各自独立工作。


🛠 容器的常用命令

我们用一个 Nginx 容器把常用命令串起来。先启动一个:

docker run -d --name web -p 8080:80 nginx

查看正在运行的容器

docker ps

能看到 web 容器的信息,包括容器 ID、使用的镜像、端口映射和运行状态。加上 -a 参数可以看到所有容器(包括已停止的):

docker ps -a

停止和启动

docker stop web
docker start web

容器停止后不会消失,docker start 就能让它再次运行,里面的文件和状态都还在。

查看容器日志

docker logs web

容器里程序打印的日志都能在这里看到,排查问题时非常常用。加上 -f 可以实时跟踪日志输出。

进入容器执行命令

docker exec -it web bash

执行后你就进入了容器内部的命令行,可以像操作一台独立的 Linux 机器一样查看文件、执行命令,输入 exit 退出。后续 MySQL、MongoDB 课程连接数据库,用的就是 docker exec 这种方式。

删除容器

docker stop web
docker rm web
删除容器后,容器里的数据和文件会一起消失,且无法恢复。删除前确认里面的数据不再需要。需要长期保存数据时,应该使用数据卷,后面的文章会专门讲解。

🛠 镜像的常用命令

查看本地已有镜像

docker images

提前下载镜像(不运行):

docker pull nginx

docker run 时发现本地没有镜像会自动下载,效果一样。pull 适合提前把镜像准备好。

删除本地镜像

docker rmi nginx
删除镜像前,要先把由它运行的容器全部删除,否则 Docker 会提示镜像正在被使用。

🧾 小节总结

  • 镜像是软件的打包模板,包含程序和运行环境,标签用于区分版本(如 mysql:8)。
  • 容器是根据镜像运行的实例,一个镜像可以运行出多个互不影响的容器。
  • 容器命令:docker ps 查看、docker stop/start 停止和启动、docker logs 看日志、docker exec -it 进入容器、docker rm 删除。
  • 镜像命令:docker images 查看、docker pull 下载、docker rmi 删除。
  • 删除容器会丢失容器内的数据,删除镜像前要先删掉它的容器。

❓ 知识问答

Q1:docker stopdocker rm 有什么区别?

stop 只是让容器停止运行,容器还在,里面的数据也在,start 可以随时恢复。rm 是把容器彻底删除,数据一并消失。类比:stop 像电脑关机,rm 像把电脑扔掉。

Q2:镜像标签不写会怎样?

默认使用 latest 标签。学习阶段可以这样用,但实际项目中建议写明确版本(如 mysql:8),避免某天 latest 升级后行为发生变化。

Q3:docker ps 里那一串容器 ID 是什么?

是 Docker 自动给每个容器分配的唯一编号。操作容器时用容器名或容器 ID 都可以,比如 docker stop webdocker stop 容器ID 等效。

Q4:端口被占用导致 docker run 失败怎么办?

说明本机这个端口已有程序在用。把映射的本机端口换一个,比如 -p 8081:80,然后访问 localhost:8081 即可。

Q5:docker exec -it 里的 -it 是什么意思?

-i 表示保持输入通道打开,-t 表示分配一个终端。两个一起用,才能在容器里进行交互式操作,这是固定搭配,记住即可。


🧪 小练习

  1. nginx 镜像同时运行两个容器 web1(映射 8081 端口)和 web2(映射 8082 端口),用 docker ps 确认两个容器都在运行,浏览器分别访问验证,体会「一个镜像运行多个容器」:
# 请在这里编写命令
  1. 进入 web1 容器内部,找到 Nginx 的欢迎页面文件并查看内容:
# 提示:先 docker exec -it web1 bash 进入容器
# 页面文件在 /usr/share/nginx/html/index.html,用 cat 查看
# 请在这里编写命令

🎉 恭喜你已经掌握了镜像与容器的核心概念和常用命令!下一篇我们解决一个重要问题:容器删了数据就没了,怎样用数据卷把数据保存下来。