手把手系列之——Docker

53 阅读5分钟

如果你参与过工程化,那么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

Dockershim 调用链

Kubernetes 早期通过内置的 dockershim 对接 Docker,调用链如上图。
当前更推荐直接使用 containerdCRI-O,调用链更短。

《切换到 containerd 的架构》
切换到 containerd

《containerd 内置 CRI 插件》 containerd 内置 CRI

《CRI-O 方案》 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 时,以下命令最为常用,可配合下图查阅。

image.png

命令说明
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(首次访问浏览器可能提示不安全,可点“高级”继续访问)。 image.png


六、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)。
image.png Compose 文件完整语法可参考:docs.docker.com/reference/c…


七、小结

Docker,不仅是理解 Kubernetes 与 containerd/CRI-O 的基础,也是CI/CD中容器化部署的关键一环,像这种基础知识不管前后端都还是建议掌握的。

学习参考链接