tips:(docker和虚拟机的区别)
1、虚拟机是对**硬件**的虚拟化,而 Docker 是对**操作系统**的虚拟化。Docker 因为其轻量、快速和高可移植性,已经成为了现代应用开发和运维的基础设施。
最重要的几个功能区:
- Containers:管理所有的容器,包括运行中和已停止的
- Images:查看和管理本地镜像
- Volumes:管理数据卷
- Dev Environments:用于创建开发环境(较新版本功能)
containers:
image(镜像):里面包含了你要部署的应用程序以及它所关联的所有库
https://yeasy.gitbook.io/docker_practice/ docker 中文文档
📖 概念详解
镜像(Image) vs 容器(Container)
| 镜像 (Image) | 容器 (Container) | |
|---|---|---|
| 本质 | 一个只读的模板 | 镜像的运行实例 |
| 类比 | 类(Class) | 对象(Object) |
| 能否修改 | 不可直接修改,需重新构建 | 可读写,但重启后变更丢失 |
| 生命周期 | 长期保存 | 可创建、启动、停止、删除 |
Docker 的核心优势
- 环境一致性:你在本地能跑的,服务器上一定能跑("我电脑上明明可以啊" 从此消失)
- 快速部署:启动容器只需秒级,而虚拟机需要分钟级
- 资源隔离:每个容器独立运行,互不干扰
- 生态丰富:Docker Hub 上有大量官方镜像(Nginx、MySQL、Python、Redis……)
日常开发工作流
写代码 → 编写 Dockerfile → 构建镜像 (docker build)
↓
推送到镜像仓库 (docker push)
↓
服务器拉取并运行 (docker pull + docker run)
🐘 常用 Docker 命令速查
镜像操作
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:latest
# 查看本地镜像
docker images
# 删除镜像
docker rmi <image_id>
# 构建镜像(从 Dockerfile)
docker build -t my-app:1.0 .
容器操作
# 创建并运行容器
docker run -d --name my-nginx -p 8080:80 nginx
# 列出运行中的容器
docker ps
# 列出所有容器(含已停止的)
docker ps -a
# 停止容器
docker stop <container_id>
# 启动已停止的容器
docker start <container_id>
# 重启容器
docker restart <container_id>
# 删除容器
docker rm <container_id>
# 强制删除运行中的容器
docker rm -f <container_id>
查看资源占用
# 查看容器资源使用情况(CPU、内存、网络)
docker stats
# 查看容器进程
docker top <container_id>
# 查看容器详细信息(IP、挂载卷、环境变量等)
docker inspect <container_id>
🔍 Docker Desktop 功能区域详解
仪表盘(Dashboard) 的各个功能区:
-
Containers:所有容器的管理中心
- 可查看日志、进入终端、启停操作
- 点击容器名可查看详情
-
Images:本地镜像管理
- 可以在此拉取、删除镜像
- 查看镜像分层信息
-
Volumes:数据卷管理
- 数据卷是持久化数据的最佳方式
- 即使删除容器,数据卷中的数据也不会丢失
-
Dev Environments:用于创建独立的开发环境(较新版本功能)
👨💻 实操过程:第一次用 Docker 部署一个 Nginx 网站
如果你跟我一样是新手,直接上来就跑命令可能会有点懵。下面是我第一次用 Docker 部署一个静态网站的完整过程,你可以照着做一遍。
第 1 步:确认 Docker 装好了
docker --version
能看到版本号,说明装好了。如果没有,先去 Docker 官网 下载 Desktop 版本。
第 2 步:拉取一个 Nginx 镜像
docker pull nginx:alpine
alpine 是精简版,只有几十 MB,下载很快。下载完后,我特意跑了一次 docker images 确认它出现在列表里了。
第 3 步:跑起来看看
docker run -d --name my-first-site -p 8080:80 nginx:alpine
命令拆解一下:
-d:后台运行(不会霸占你的终端)--name my-first-site:给它起个名字,方便以后管理-p 8080:80:把容器的 80 端口映射到本机的 8080 端口nginx:alpine:用哪个镜像
跑完之后,打开浏览器访问 http://localhost:8080,看到了 Welcome to nginx! 的页面。那一刻还挺有成就感的 😄
第 4 步:把自己的网页放进去
那页默认的欢迎页是 Nginx 自带的,我想换成自己的 HTML。先看了一下容器里默认的网页路径:
docker exec my-first-site ls /usr/share/nginx/html
看到了 index.html。然后我在本地写了一个简单的 index.html,用 docker cp 复制进去:
# 在本地新建一个 index.html,内容随便写点什么
echo "<h1>我的第一个网站</h1>" > ./index.html
# 复制进容器,覆盖默认页面
docker cp ./index.html my-first-site:/usr/share/nginx/html/
刷新浏览器,内容已经变了。第一次体验到 Docker 的快——从拉镜像到上线自己的页面,前后不到 5 分钟。
第 5 步:停止和清理
# 停止容器
docker stop my-first-site
# 删除容器(只是删容器,镜像还在)
docker rm my-first-site
# 查看镜像还在不在
docker images
看到镜像还在,以后随时可以再 docker run 一个一样的容器,这就是 Docker 镜像的妙处。
⚠️ 常见问题
Q: 容器退出后数据会丢吗?
取决于数据存在哪。
- 存在容器内部 → 会丢(容器删除后数据就没了)
- 存在 Volume 或 Bind Mount → 不会丢
Q: docker run 和 docker start 有什么区别?
docker run= 创建新容器 + 启动它(相当于docker create+docker start)docker start= 启动一个已存在但已停止的容器
Q: 端口映射怎么理解?
docker run -p 主机端口:容器端口 nginx
# 例:-p 8080:80 → 访问宿主机 8080 端口相当于访问容器内 80 端口