1、容器化基础:Docker简介、Docker与虚拟机的区别、Docker核心概念(镜像、容器、仓库)、Docker安装与配置
1.1 Docker到底是什么?
说实话,我第一次接触Docker的时候,也觉得它就是个"轻量级虚拟机"。但用了一段时间才发现,这个理解其实不太对。
Docker是一个开源的容器化引擎。它让你能把应用和它所有的依赖打包在一起,形成一个标准化的单元。这个单元可以跑在任何安装了Docker的机器上——你的笔记本、测试服务器、生产环境,都一样。
我个人的理解是:Docker解决的是"在我机器上能跑"这个经典问题。你想想看,有多少次你从开发手里拿到代码,结果环境不一致,跑不起来?Docker就是来终结这个噩梦的。
一句话总结:Docker = 打包应用 + 依赖 + 运行环境,形成一个可移植的容器。
1.2 Docker与虚拟机的区别
这个问题我面试过很多人,十有八九会答错。咱们来掰扯清楚。
| 对比维度 | Docker容器 | 传统虚拟机 |
|---|---|---|
| 启动速度 | 秒级(毫秒级启动) | 分钟级(需要引导操作系统) |
| 资源占用 | 极低(共享宿主机内核) | 较高(每个VM有完整OS) |
| 隔离级别 | 进程级隔离(namespace + cgroups) | 硬件级虚拟化(Hypervisor) |
| 镜像大小 | 通常MB级别(Alpine Linux才5MB) | GB级别(包含完整操作系统) |
| 性能损耗 | 几乎无损耗(直接调用宿主机内核) | 有一定损耗(需要虚拟化层转换) |
核心区别就一句话:Docker容器共享宿主机内核,虚拟机各自拥有独立内核。
我在项目中遇到过这样一个场景:有个团队非要用虚拟机跑微服务,结果一台物理机只能起3-4个VM,资源利用率低得可怜。后来换成Docker,一台机器跑了30多个容器,CPU和内存利用率直接翻倍。
注意:因为容器共享宿主机内核,所以不能在Linux宿主机上跑Windows容器。反过来也一样。这是容器的天然限制,不是bug。
1.3 Docker核心概念
这三个概念你搞懂了,Docker就算入门了。我习惯用一个类比来理解:
- 镜像(Image) = 做蛋糕的模具
- 容器(Container) = 用模具做出来的蛋糕
- 仓库(Registry) = 存放模具的仓库
1.3.1 镜像(Image)
镜像是只读的模板。它包含了运行应用所需的一切:代码、运行时、系统工具、库、配置。
你可以从Docker Hub拉取别人做好的镜像,也可以自己写Dockerfile构建。镜像采用分层存储,每一层都是只读的。这样做的好处是:多个镜像可以共享底层,节省磁盘空间。
# 查看本地镜像
docker images
# 拉取一个镜像
docker pull nginx:latest
# 构建自己的镜像
docker build -t my-app:v1 .
我曾经踩过一个坑:构建镜像时每写一个RUN指令就会多一层。一开始我图省事,把安装包和清理工作写成了两个RUN,结果镜像体积大了200MB。后来改成链式操作,一个RUN搞定,体积直接减半。
避坑指南:构建镜像时尽量合并RUN指令,减少镜像层数。每层都是独立的,层数越多,构建和传输越慢。
1.3.2 容器(Container)
容器是镜像的运行实例。你可以启动、停止、删除、暂停一个容器。每个容器之间相互隔离,有自己的文件系统、网络、进程空间。
说白了,容器就是一个被隔离的进程。它跑在宿主机上,但看不到宿主机上的其他进程。这就是namespace的功劳。
# 启动一个容器
docker run -d --name my-nginx -p 8080:80 nginx
# 查看运行中的容器
docker ps
# 进入容器内部
docker exec -it my-nginx /bin/bash
# 停止并删除容器
docker stop my-nginx && docker rm my-nginx
嗯,这里要注意:容器停止后数据就没了。如果你需要持久化数据,要用卷(Volume)或者绑定挂载。我刚开始用Docker时,数据库容器一重启数据全丢了,那叫一个惨。
1.3.3 仓库(Registry)
仓库就是存放镜像的地方。最常用的是Docker Hub,但企业里一般用私有仓库,比如Harbor或者阿里云镜像仓库。
你可以把仓库想象成GitHub。从仓库拉取镜像叫pull,推送镜像叫push。版本管理用tag。
# 登录仓库
docker login
# 给镜像打标签
docker tag my-app:v1 my-registry.com/my-app:v1
# 推送镜像到仓库
docker push my-registry.com/my-app:v1
# 从仓库拉取镜像
docker pull my-registry.com/my-app:v1
经验之谈:生产环境一定要用私有仓库。Docker Hub有拉取频率限制,而且镜像可能被篡改。我见过有公司直接从Docker Hub拉镜像,结果某天镜像被下架了,整个CI/CD全崩。
1.4 Docker安装与配置
安装Docker其实很简单,但不同系统有些差异。我主要讲Linux和macOS。
1.4.1 Linux(以Ubuntu为例)
# 更新包索引
sudo apt update
# 安装依赖
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加Docker仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 安装Docker
sudo apt update
sudo apt install -y docker-ce
# 启动Docker并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
sudo docker run hello-world
小技巧:安装完后把当前用户加入docker组,就不用每次敲sudo了。
sudo usermod -aG docker $USER
# 然后退出重新登录
1.4.2 macOS
macOS上推荐用Docker Desktop。去官网下载安装包,双击安装就行。它会自动配置好Docker环境。
我个人习惯用Homebrew安装:
brew install --cask docker
安装完后打开Docker Desktop,等它启动完成。你会看到菜单栏出现一个小鲸鱼图标,说明Docker跑起来了。
1.4.3 配置镜像加速器
国内拉取Docker Hub镜像经常超时。我建议配置镜像加速器,比如阿里云或者中科大的。
# 创建或修改 /etc/docker/daemon.json
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://your-mirror.mirror.aliyuncs.com"]
}
EOF
# 重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
注意:配置完加速器后,记得测试一下拉取速度。我曾经遇到过加速器配置错误,结果镜像拉不下来,排查了半天才发现是URL写错了。
1.4.4 验证安装
安装完成后,跑几个命令确认一下:
# 查看Docker版本
docker --version
# 查看Docker系统信息
docker info
# 运行一个测试容器
docker run hello-world
如果看到"Hello from Docker!"的输出,恭喜你,Docker环境已经准备好了。
小结
这一章我们聊了Docker是什么、它和虚拟机的区别、三个核心概念(镜像、容器、仓库),以及怎么安装配置。说白了,Docker就是让你能"一次构建,到处运行"的工具。
下一章我们会深入Dockerfile的编写技巧,到时候我会分享一些我在生产环境中踩过的坑。嗯,保证让你少走弯路。