第1章:Docker入门:容器技术发展史、Docker核心概念、Docker与虚拟机对比、Docker安装与验证
1.1 容器技术发展史:从chroot到Docker
聊容器技术,得先说说它的前世今生。我刚开始接触服务器运维那会儿,用的还是物理机部署,一台机器跑一个应用,资源浪费得让人心疼。
容器技术的萌芽,其实可以追溯到1979年的chroot。说白了,chroot就是给进程换个根目录,让它以为自己独占整个系统。嗯,这想法很朴素,但确实管用。
后来到了2000年,FreeBSD搞出了jail技术,算是真正意义上的容器雏形。2005年,Solaris推出了Zone,再后来就是Linux的cgroups和Namespace。这些技术,说白了都是在做同一件事——隔离。
我记得2013年Docker刚出来那会儿,圈子里炸开了锅。为什么?因为Docker把之前那些零散的技术整合到了一起,还搞了个镜像分层机制。你想想看,以前部署个应用要配环境、装依赖,折腾半天。有了Docker,一个命令就搞定了。
关键时间节点:
- 1979年:chroot系统调用诞生
- 2000年:FreeBSD Jails
- 2005年:Solaris Zones
- 2008年:LXC(Linux Containers)
- 2013年:Docker正式发布
- 2015年:OCI(Open Container Initiative)成立
1.2 Docker核心概念:镜像、容器、仓库
Docker有三个核心概念,我建议你把它刻在脑子里:镜像、容器、仓库。
镜像(Image):你可以把它理解成一个只读的模板。里面装好了操作系统、应用代码、依赖库,啥都有。我在项目中遇到过有人把镜像比作「类」,容器比作「对象」,这个比喻挺贴切的。
容器(Container):镜像跑起来就是容器。它是可读写的,你可以进去改东西、装软件。但要注意,容器一旦删除,里面的改动就全没了。我曾经犯过这个错——在容器里改了配置文件,没提交到镜像,结果容器一删,配置全丢了。
仓库(Registry):存放镜像的地方。Docker Hub是官方的公共仓库,企业一般会用私有的Harbor或Nexus。
我的小建议:刚开始学Docker,别急着搞复杂的概念。先记住「镜像做菜谱,容器是炒好的菜,仓库是菜谱库」这个比喻,后面理解起来会顺很多。
1.3 Docker与虚拟机对比:为什么选Docker?
很多人问我:Docker和虚拟机到底有啥区别?我一般会反问一句:你见过虚拟机启动要多久?
虚拟机有完整的操作系统,包括内核。Docker直接共享宿主机的内核。这就导致了几个关键差异:
| 对比项 | Docker容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 磁盘占用 | MB级别 | GB级别 |
| 性能损耗 | 几乎无 | 有一定损耗 |
| 隔离性 | 进程级隔离 | 完全隔离 |
| 内核 | 共享宿主机内核 | 独立内核 |
说白了,Docker适合跑微服务、做CI/CD、搞快速部署。虚拟机适合需要强隔离的场景,比如不同租户之间的隔离。
注意:Docker的隔离性不如虚拟机。如果你在容器里跑不信任的代码,建议还是用虚拟机。我在安全审计项目中见过因为容器逃逸导致宿主机被攻破的案例,嗯,那场面挺惨的。
1.4 Docker安装与验证:动手实践
光说不练假把式。咱们现在就把Docker装上。
Linux(Ubuntu/Debian)安装:
# 更新包索引
sudo apt-get update
# 安装依赖
sudo apt-get install -y ca-certificates curl gnupg lsb-release
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker引擎
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
# 启动Docker
sudo systemctl start docker
sudo systemctl enable docker
验证安装:
# 查看Docker版本
docker --version
# 运行Hello World
docker run hello-world
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
我第一次跑 docker run hello-world 的时候,看到那个欢迎信息,心里还挺激动的。你想想看,一行命令就拉取镜像、创建容器、运行程序,这在以前得折腾半天。
避坑指南:如果你用的是非root用户,记得把用户加到docker组里:sudo usermod -aG docker $USER。然后退出重新登录。我曾经忘了这一步,结果每次都要加sudo,烦得很。
Mac/Windows安装:
直接去Docker官网下载Docker Desktop安装包就行。安装完打开,等右下角的小鲸鱼图标稳定下来,就说明跑起来了。
验证方法一样,打开终端跑 docker --version 和 docker run hello-world。
安装后必做三件事:
- 验证版本:
docker version确认客户端和服务端都正常 - 跑个测试:
docker run hello-world验证整个链路 - 查看信息:
docker info了解Docker环境详情
好了,Docker装上了,核心概念也捋了一遍。下一章咱们聊聊Docker镜像的构建和管理,到时候我会分享一些我在生产环境中踩过的坑。