镜像与容器
🎯 引言
学完这篇文章,你能说清楚镜像(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 镜像可以同时运行出 web1、web2 两个容器,分别映射到不同端口,各自独立工作。
🛠 容器的常用命令
我们用一个 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
🧾 小节总结
- 镜像是软件的打包模板,包含程序和运行环境,标签用于区分版本(如
mysql:8)。 - 容器是根据镜像运行的实例,一个镜像可以运行出多个互不影响的容器。
- 容器命令:
docker ps查看、docker stop/start停止和启动、docker logs看日志、docker exec -it进入容器、docker rm删除。 - 镜像命令:
docker images查看、docker pull下载、docker rmi删除。 - 删除容器会丢失容器内的数据,删除镜像前要先删掉它的容器。
❓ 知识问答
Q1:docker stop 和 docker rm 有什么区别?
stop 只是让容器停止运行,容器还在,里面的数据也在,start 可以随时恢复。rm 是把容器彻底删除,数据一并消失。类比:stop 像电脑关机,rm 像把电脑扔掉。
Q2:镜像标签不写会怎样?
默认使用 latest 标签。学习阶段可以这样用,但实际项目中建议写明确版本(如 mysql:8),避免某天 latest 升级后行为发生变化。
Q3:docker ps 里那一串容器 ID 是什么?
是 Docker 自动给每个容器分配的唯一编号。操作容器时用容器名或容器 ID 都可以,比如 docker stop web 和 docker stop 容器ID 等效。
Q4:端口被占用导致 docker run 失败怎么办?
说明本机这个端口已有程序在用。把映射的本机端口换一个,比如 -p 8081:80,然后访问 localhost:8081 即可。
Q5:docker exec -it 里的 -it 是什么意思?
-i 表示保持输入通道打开,-t 表示分配一个终端。两个一起用,才能在容器里进行交互式操作,这是固定搭配,记住即可。
🧪 小练习
- 用
nginx镜像同时运行两个容器web1(映射 8081 端口)和web2(映射 8082 端口),用docker ps确认两个容器都在运行,浏览器分别访问验证,体会「一个镜像运行多个容器」:
# 请在这里编写命令
- 进入
web1容器内部,找到 Nginx 的欢迎页面文件并查看内容:
# 提示:先 docker exec -it web1 bash 进入容器
# 页面文件在 /usr/share/nginx/html/index.html,用 cat 查看
# 请在这里编写命令
🎉 恭喜你已经掌握了镜像与容器的核心概念和常用命令!下一篇我们解决一个重要问题:容器删了数据就没了,怎样用数据卷把数据保存下来。
