一、Docker 核心概念

Docker 是一套容器化技术工具,核心目标是 “让应用在任何环境中都能一致运行”。其核心概念可概括为 3 个核心组件:

  • 镜像(Image):应用的 “只读模板”,包含运行所需的代码、依赖、系统工具、配置等(比如一个 Nginx 镜像包含 Nginx 程序、配置文件和基础操作系统环境)。镜像不能直接运行,是容器的 “蓝图”。
  • 容器(Container):镜像的 “运行实例”,是镜像加载到内存后的动态状态。容器是独立隔离的,拥有自己的文件系统、网络空间,与宿主机和其他容器互不干扰(类似轻量级虚拟机,但更高效)。
  • 仓库(Repository):存放镜像的 “仓库”,类似代码仓库(如 GitHub)。官方仓库是 Docker Hub,包含海量现成镜像(如 Nginx、MySQL、Python 等),也可搭建私有仓库(如 Harbor)。

二、Docker 的历史

  • 2013 年:由 Solomon Hykes 主导的团队在 PyCon 大会上首次公开 Docker,最初基于 Linux 的 LXC(Linux Container)技术实现,主打 “Build, Ship, Run”(构建、发布、运行)理念。
  • 2014 年:脱离 LXC,自研容器运行时(runC),并开源核心组件,迅速成为容器技术的事实标准。
  • 2015 年:成立 OCI(开放容器倡议),推动容器技术标准化,避免厂商锁定。
  • 2019 年:Docker 公司将企业业务出售给 Mirantis,专注于开发者工具(如 Docker Desktop),但 Docker 作为容器技术的代名词已深入人心。

三、Docker 的核心作用

  1. 解决 “环境不一致” 问题:开发环境、测试环境、生产环境的依赖差异常导致 “本地能跑,线上崩了”,Docker 通过镜像打包所有依赖,确保应用在任何安装了 Docker 的环境中行为一致。
  2. 轻量级隔离:相比虚拟机(VM),容器无需模拟完整操作系统,直接共享宿主机内核,启动速度快(秒级)、资源占用低(单机可运行成百上千容器)。
  3. 快速部署与扩展:基于镜像可一键启动容器,配合编排工具(如 K8s)可实现秒级扩容缩容,适合微服务和云原生架构。
  4. 简化配置管理:镜像包含所有配置,无需手动在每台机器上部署依赖,减少 “重复配置” 的工作量。

四、与 Docker 类似的工具

Docker 是容器技术的代表,但同类工具可分为 “容器运行时” 和 “容器编排平台” 两类:

1. 容器运行时(替代 Docker 的核心运行能力)

  • Podman:RedHat 推出的无守护进程(daemonless)容器工具,命令与 Docker 兼容(可直接用alias docker=podman替代),更安全(无 root 权限的 daemon)。
  • containerd:最初是 Docker 的底层组件,后独立成 OCI 标准工具,现在 Docker 默认用 containerd 作为运行时,轻量且稳定。
  • LXC/LXD:偏向 “系统容器”(模拟完整操作系统,如一个小型 Ubuntu),适合长期运行的服务,而 Docker 更偏向 “应用容器”(聚焦单个应用)。
  • rkt:CoreOS(后被 RedHat 收购)推出的容器引擎,强调安全性和可组合性,兼容 OCI 标准,但市场份额较小。

2. 容器编排平台(管理大规模容器集群)

  • Kubernetes(K8s):容器编排的事实标准,可管理成百上千容器,提供自动扩缩容、自愈、负载均衡等能力,常与 Docker 配合使用(Docker 负责运行容器,K8s 负责调度)。
  • Docker Swarm:Docker 官方的轻量级编排工具,与 Docker 集成度高,适合小规模集群,但功能不如 K8s 丰富。
  • Apache Mesos:通用集群管理工具,可同时管理容器和非容器任务(如 Hadoop),适合复杂混合集群。

五、核心操作实战:从安装到部署

步骤 1:安装 Docker 并验证

  • Windows/Mac:直接下载 Docker Desktop,安装后启动(会自动启动 Docker 引擎)。

  • Linux(以 Ubuntu 为例)

    # 安装依赖
    sudo apt-get update
    sudo apt-get install 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 docker-ce docker-ce-cli containerd.io
    
    # 启动Docker并设置开机自启
    sudo systemctl start docker
    sudo systemctl enable docker
    
  • 验证安装:终端输入 docker --version,显示版本号即成功(如Docker version 24.0.6, build ed223bc)。再运行 docker run hello-world,若看到 “Hello from Docker!” 提示,说明 Docker 可正常工作(会自动拉取 hello-world 镜像并启动容器)。

步骤 2:镜像核心操作

镜像操作是管理 “应用模板” 的基础,常用命令如下:

  1. 拉取镜像(从仓库下载镜像):

    # 格式:docker pull 镜像名:版本(不指定版本默认拉取latest)
    docker pull nginx:latest  # 拉取最新版Nginx镜像
    docker pull mysql:8.0     # 拉取8.0版本MySQL镜像
    
  2. 查看本地镜像

    docker images  # 列出所有本地镜像(包含镜像名、版本、ID、大小等)
    
  3. 删除镜像(需先删除依赖该镜像的容器):

    # 格式:docker rmi 镜像ID/镜像名:版本
    docker rmi nginx:latest  # 通过镜像名删除
    docker rmi a1b2c3d4      # 通过镜像ID(前几位即可)删除
    

步骤 3:容器核心操作

容器是镜像的运行实例,核心操作围绕 “启动、查看、操作、停止、删除” 展开:

  1. 启动容器(从镜像创建并运行容器):

    # 格式:docker run [参数] 镜像名 [容器内命令]
    # 示例:启动一个Nginx容器,命名为mynginx,后台运行,将容器80端口映射到宿主机8080端口
    docker run -d -p 8080:80 --name mynginx nginx
    

    参数说明:

    • -d:后台运行容器( detached );
    • -p 宿主机端口:容器端口:端口映射(外部通过宿主机端口访问容器内服务);
    • --name:给容器起别名(方便后续操作)。
  2. 查看容器

    docker ps         # 查看正在运行的容器
    docker ps -a      # 查看所有容器(包括已停止的)
    
  3. 进入容器内部操作(交互式访问):

    # 格式:docker exec -it 容器名/ID 终端命令
    docker exec -it mynginx /bin/bash  # 进入mynginx容器,启动bash终端
    

    进入后可执行容器内命令(如ls查看文件、cat /etc/nginx/nginx.conf查看 Nginx 配置),输入exit退出容器。

  4. 停止 / 启动容器

    docker stop mynginx   # 停止运行中的mynginx容器
    docker start mynginx  # 启动已停止的mynginx容器
    
  5. 删除容器(需先停止,或强制删除):

    docker rm mynginx      # 删除已停止的容器
    docker rm -f mynginx   # 强制删除运行中的容器(-f=force)
    

步骤 4:实战部署:容器化运行一个自定义静态网页

目标:将本地的index.html部署到 Nginx 容器,通过浏览器访问。

  1. 准备本地文件:在本地创建一个目录(如/home/user/myweb),并新建index.html

    <!DOCTYPE html>
    <html>
    <body>
      <h1>我的第一个Docker容器网页</h1>
      <p>通过Docker部署,真简单!</p>
    </body>
    </html>
    
  2. 启动 Nginx 容器并挂载本地目录:用-v参数将本地目录挂载到容器内 Nginx 的默认网页目录(/usr/share/nginx/html),实现 “本地修改,容器内实时生效”:

    # 注意替换本地目录路径(Windows用绝对路径如C:/user/myweb,Linux/Mac用/home/user/myweb)
    docker run -d -p 80:80 --name myweb -v /home/user/myweb:/usr/share/nginx/html nginx
    
  3. 验证效果:打开浏览器,访问http://localhost(或宿主机 IP),即可看到自定义的网页内容。若修改本地index.html,刷新浏览器会直接生效(无需重启容器)。

小结

Docker 的核心价值是 “用镜像打包环境,用容器运行应用”,通过上述操作可快速掌握镜像管理、容器生命周期控制和基础部署。后续可深入学习 Dockerfile(自定义镜像)、Docker Compose(多容器编排)等进阶内容,应对更复杂的应用场景。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐