Docker 就是个“打包神器”,专门用来把你的代码、环境配置、依赖库一股脑儿装进一个轻量级的“集装箱”里,扔到任何地方都能直接跑起来,完全不用操心“水土不服”的问题!
举个栗子🌰:
假设你写了个 Python 网站,本地用 Python 3.10 + MySQL 8.0 跑得好好的,但同事电脑上装的是 Python 2.7 + MySQL 5.7,结果代码一拷贝就报错。这时候 Docker 就能救场——你把整个环境打包成一个镜像(Image),同事直接启动这个镜像里的容器(Container),瞬间拥有和你一模一样的运行环境,连版本号都对齐,爽不爽?
简单说它的特点:
- 隔离性强:每个容器都是独立的小世界,互相不干扰。
- 轻量省资源:不像虚拟机要模拟整个操作系统,Docker 只共享底层系统内核,占内存少得多。
- 秒级启动:容器启动比虚拟机快多了,分分钟部署。
- 版本管理:镜像可以存到仓库(比如 Docker Hub),需要的时候一键拉取,跟 GitHub 下代码一样方便。
适合场景:
开发测试环境统一、微服务架构、快速迁移项目到云服务器…反正现在搞 IT 的,没听说过 Docker 都不好意思打招呼。
1. 核心三件套:镜像、容器、仓库
-
镜像(Image):
就像手机的系统安装包(比如 iOS 的 .ipa 文件),里面打包了代码、运行环境、依赖库,但不能直接运行。
举个栗子:你造了个 Python 环境的镜像,里面装好了 Python 3.10 + Django 4.0 + 配置文件,别人可以拿这个镜像直接启动项目。 -
容器(Container):
镜像的运行实例,好比你手机安装好的 App。一个镜像可以启动无数个容器,彼此完全隔离(比如两个容器里都跑着 Python,但互相不影响)。 -
仓库(Registry):
镜像的“应用商店”(比如 Docker Hub),用来存储和分发镜像。你可以上传自己的镜像,也可以下载别人的镜像。
2. Docker 架构:C/S 模式
- Docker 客户端:你敲的命令(比如
docker run
)都是发给客户端。 - Docker 守护进程(Daemon):客户端背后的“打工人”,负责真正干活(拉镜像、启容器)。
- REST API:客户端和守护进程通过 API 通信,支持远程操作(比如用 IDE 插件控制 Docker)。
3. 为啥 Docker 比虚拟机香?
对比项 | Docker(容器) | 虚拟机(VM) |
---|---|---|
资源占用 | 共享宿主机内核,几MB内存就能跑 | 需要完整虚拟操作系统,GB 级内存 |
启动速度 | 秒级启动 | 分钟级(得先启动系统) |
隔离性 | 进程级隔离(轻量) | 硬件级隔离(重量级) |
性能损耗 | 几乎无 | 虚拟化开销大 |
4. 常用操作命令
# 拉取镜像(比如拉取官方 Nginx 镜像)
docker pull nginx
# 启动容器(用 Nginx 镜像跑一个容器)
docker run -d -p 80:80 --name my_nginx nginx
# 查看正在运行的容器
docker ps
# 进入容器内部搞事情(比如进 Ubuntu 容器敲命令)
docker exec -it ubuntu_container bash
# 停止容器
docker stop my_nginx
# 删除容器(先得停掉!)
docker rm my_nginx
5. Dockerfile 是啥?
就是造镜像的说明书,用一堆指令告诉 Docker 怎么打包你的应用。
举个最简单的例子:
# 基础镜像(比如用 Python 3.10)
FROM python:3.10
# 把当前目录代码复制到容器里的 /app 目录
COPY . /app
# 设置工作目录
WORKDIR /app
# 安装依赖
RUN pip install -r requirements.txt
# 容器启动时执行的命令(比如运行 Python 脚本)
CMD ["python", "app.py"]
写完 docker build
就能生成镜像啦!
6. 实际应用场景
- 开发环境统一:团队用同一个镜像,避免“我机器上能跑”的尴尬。
- 微服务架构:每个服务单独打包成容器,方便扩缩容。
- 灰度发布:快速替换线上服务版本,出问题秒回滚。
- 云迁移:容器打包完,随便搬到 AWS/Azure 阿里云都行。
7. 常见坑点
- 文件挂载问题:容器里的文件修改会同步到宿主机吗?用
-v
挂载目录时要注意权限! - 端口冲突:容器端口映射到宿主机时,如果宿主机端口被占,容器会直接报错。
- 数据持久化:容器删了数据就没了!得用 Volume 或者绑定宿主机目录来保存数据。
- 镜像臃肿:别装一堆没用的软件,不然镜像大得像头鲸鱼。