如果你参与过工程化,那么Docker你一定或多或少听过,那么Docker究竟是什么呢,作为前端有必要了解吗? 本文或许能解惑一二。
一、那什么是容器呢?
容器是轻量级软件包,包含应用运行时所需要的依赖,如系统库、第三方包、部分操作系统级组件等,这些依赖都位于操作系统之上的堆栈中。
如果和虚拟机对比的话,或许更好理解。这对兄弟都是资源虚拟化技术,即把 CPU、内存、磁盘、网络等系统资源“虚拟化”,呈现为多份可用的资源。
二者的核心区别在于虚拟化层级不同:虚拟机虚拟化到硬件层,而容器只虚拟化到操作系统之上的软件层,具体如下:
| 维度 | 容器 | 虚拟机 |
|---|---|---|
| 虚拟化对象 | 操作系统以上(应用 + 依赖) | 整机(CPU、磁盘、网络等硬件 + 完整 OS) |
| 迭代速度 | 快,轻量 | 慢,需重建完整堆栈 |
| 隔离与安全 | 共享宿主机内核,存在共享主机漏洞风险 | 完全隔离,单 VM 被攻破不影响其他 VM |
| 存储与成本 | 占用小 | 镜像可达数 GB,磁盘压力大 |
| 典型用途 | 应用打包、CI/CD、微服务 | 需要特定硬件或完整 OS 的场景 |
容器的优点:迭代快、生态成熟(公共镜像仓库多,如 Docker Hub)。
容器的缺点:共享宿主机内核,一个容器的漏洞可能影响宿主机及其他容器;使用公共镜像时需注意安全与来源。
虚拟机的优点:完全隔离、适合交互式开发和“类裸机”环境,可做快照与回滚。
虚拟机的缺点:构建与变更慢、占用存储大。
二、Docker 核心概念
深入理解 Docker 时,通常围绕以下几块:
-
镜像(Image)
只读模板,包含运行应用所需的文件系统与元数据,由 Dockerfile 构建或从仓库拉取。 -
容器(Container)
镜像的运行实例,具有可写层和独立进程空间。同一镜像可创建多个容器。 -
Dockerfile
文本文件,描述如何一步步构建镜像(基础镜像、拷贝文件、安装依赖、启动命令等)。
可通过mysql官方的Dockerfile地址学习 -
仓库(Registry)
存储和分发镜像的服务。公共仓库如 Docker Hub(hub.docker.com/)。 -
Docker 引擎(Docker Engine)
包含 daemon(dockerd)与 CLI(docker),负责拉取镜像、创建/启停容器、管理网络与卷等。
关系可以简化为:Dockerfile → 构建 → 镜像 → 运行 → 容器,镜像从仓库拉取或推送。
flowchart LR
subgraph 构建
A[Dockerfile] -->|docker build| B[镜像 Image]
end
subgraph 运行
B -->|docker run| C[容器 Container]
end
R[Registry 仓库] <-->|pull / push| B
三、Docker与Kubernetes
Kubernetes 早期通过内置的 dockershim 对接 Docker,调用链如上图。
当前更推荐直接使用 containerd 或 CRI-O,调用链更短。
《切换到 containerd 的架构》
《containerd 内置 CRI 插件》
《CRI-O 方案》
Kubernetes 已逐步移除内置 dockershim,若仍用 Docker 可通过独立维护的 cri-dockerd 等适配 CRI。
四、安装与基本使用(ubuntu服务器)
4.1 安装 Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
验证与开机自启:
docker --version # 验证版本
sudo systemctl enable docker # 开机自启
sudo systemctl status docker # 或 service docker status
4.2 常用命令
日常使用 Docker 时,以下命令最为常用,可配合下图查阅。
| 命令 | 说明 |
|---|---|
| run | 从镜像创建并运行一个新容器 |
| exec | 在运行中的容器内执行命令 |
| ps | 列出容器 |
| build | 从 Dockerfile 构建镜像 |
| bake | 从文件批量构建 |
| pull | 从仓库拉取镜像 |
| push | 将镜像推送到仓库 |
| images | 列出本地镜像 |
| login | 登录镜像仓库 |
| logout | 从镜像仓库登出 |
| search | 在 Docker Hub 搜索镜像 |
| version | 显示 Docker 版本信息 |
| info | 显示系统级信息 |
常用示例:
docker ps -a # 查看所有容器(含已停止)
docker images # 查看本地镜像
docker pull nginx:latest # 拉取镜像
docker run -d -p 80:80 nginx # 后台运行并映射端口
docker exec -it <容器ID或名> /bin/sh # 进入运行中容器的 shell
docker build -t myapp:1.0 . # 当前目录 Dockerfile 构建镜像
4.3 国内镜像加速(拉取慢或超时时)
若直连 Docker Hub 超时,可配置国内镜像源。例如使用 DaoCloud 镜像,配置方法如下:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker # 重启
也可选用中科大等国内镜像地址:https://docker.mirrors.ustc.edu.cn。
注意:阿里云容器镜像服务需在控制台申请个人加速地址后再填入,本人亲测阿里云镜像服务目前已无法访问,现阶段个人更推荐DaoCloud。
五、Portainer 可视化管理
Portainer 提供 Web 界面管理 Docker。一键运行:
docker run -itd -p 8000:8000 -p 9443:9443 --name portainer --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:lts
若镜像拉取失败,先按上一节配置镜像加速并重启 Docker,再执行上述命令。
访问:https://<服务器IP>:9443(首次访问浏览器可能提示不安全,可点“高级”继续访问)。
六、Docker Compose 多容器编排
Compose 用 YAML 描述多容器应用,一条命令启动/停止。示例:运行 MySQL 并暴露 3306。
创建 docker-compose.yml:
# 示例配置,非生产环境建议加强安全与持久化配置
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
ports:
- 3306:3306
常用命令:
docker compose up -d # 后台启动
docker compose down # 停止并移除容器
之后可用 Navicat 等工具连接本机 localhost:3306(用户 root,密码为上面设置的 example)。
Compose 文件完整语法可参考:docs.docker.com/reference/c…
七、小结
Docker,不仅是理解 Kubernetes 与 containerd/CRI-O 的基础,也是CI/CD中容器化部署的关键一环,像这种基础知识不管前后端都还是建议掌握的。
学习参考链接
- Docker 官方镜像仓库:hub.docker.com/
- Docker Compose 文件参考:docs.docker.com/reference/c…