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的编写技巧,到时候我会分享一些我在生产环境中踩过的坑。嗯,保证让你少走弯路。