Docker 学习入门篇:从基础概念到实战部署

Docker 学习入门篇:从基础概念到实战部署_第1张图片

一、Docker 核心概念与核心价值

1.1 Docker 是什么?

Docker 是基于 Go 语言开发的开源容器化平台,旨在实现“一次镜像,处处运行”。它通过将应用程序及其依赖环境(代码、运行时、系统工具、系统库等)打包成一个轻量级、可移植的镜像(Image),使应用能够在不同环境中稳定运行,彻底解决了传统开发中环境不一致、部署复杂的难题。

1.2 Docker 解决了什么问题?

  • 环境一致性难题:开发、测试、生产环境因依赖差异导致的“本地能跑,上线报错”问题,通过镜像打包实现环境的完整复制,确保应用运行环境的一致性。
  • 迁移与扩缩容痛点:传统部署需重复配置环境,扩缩容成本高。Docker 镜像可快速复制,单机支持上千个容器,显著提升资源利用率和部署效率。
  • 资源浪费问题:对比传统虚拟机(需模拟硬件+完整操作系统),Docker 基于 Linux 内核的容器技术,仅隔离进程并共享宿主机内核,资源占用从 GB 级降至 MB 级,启动时间从分钟级缩短至秒级。

1.3 容器 vs 虚拟机:核心差异对比

特性 Docker 容器 传统虚拟机(VM)
隔离级别 进程级隔离(共享宿主机内核) 操作系统级隔离(独立内核)
启动时间 秒级(1-10 秒) 分钟级(1-5 分钟)
资源占用 镜像大小通常为 MB 级 虚拟机文件通常为 GB 级
单机支持量 数千个容器 数十个虚拟机
性能 接近原生应用 存在虚拟化性能损耗

1.4 Docker 核心组件

  1. 镜像(Image)

    • 只读模板,包含应用代码、依赖和环境,类似面向对象中的“类”。
    • 可通过 docker build(基于 Dockerfile)或 docker commit(基于容器修改)生成。
    • 示例:ubunturedis:6.0.8 等。
  2. 容器(Container)

    • 镜像的运行实例,提供隔离的运行环境,支持创建、启动、停止、删除。
    • 本质是一个进程,可视为“轻量级 Linux 环境”,包含独立的进程空间、网络空间和文件系统。
    • 示例:通过 docker run -d redis 启动一个 Redis 容器。
  3. 仓库(Repository)

    • 镜像的集中存储中心,分为公共仓库(如 Docker Hub、阿里云镜像站)和私有仓库(企业自建)。
    • 公共仓库提供海量官方镜像(如 nginxmysql),私有仓库用于托管敏感镜像。

二、Linux 环境安装 Docker(以 CentOS 为例)

2.1 环境准备

  • 系统要求:64 位 Linux,内核版本 ≥ 3.8(通过 uname -r 检查)。
  • 卸载旧版本(如有):
    sudo yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-logrotate docker-engine
    

2.2 安装 Docker Engine

  1. 设置 yum 存储库

    sudo yum install -y yum-utils  # 安装仓库配置工具
    # 添加国内镜像源(阿里云)
    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  2. 更新缓存

    yum makecache fast  # 加速软件包搜索
    
  3. 安装 Docker 及依赖

    sudo yum install -y docker-ce docker-ce-cli containerd.io
    
  4. 启动 Docker 服务

    sudo systemctl start docker          # 启动服务
    sudo systemctl enable docker         # 开机自启
    

2.3 验证安装

  • 运行测试容器
    sudo docker run hello-world  # 下载并运行官方测试镜像
    
    输出 Hello from Docker! 表示安装成功。

2.4 配置镜像加速

  • 修改配置文件
    sudo vim /etc/docker/daemon.json  # 新建或编辑文件
    
    添加国内镜像源(如腾讯云、网易云):
    {
      "registry-mirrors": [
        "https://mirror.ccs.tencentyun.com",
        "https://hub-mirror.c.163.com"
      ]
    }
    
  • 重启 Docker
    sudo systemctl daemon-reload && sudo systemctl restart docker
    

三、Docker 常用指令详解

3.1 镜像管理命令

命令 说明
docker images 列出本地镜像,支持过滤(如 docker images redis)。
docker search [镜像名] 搜索公共仓库镜像(--limit 5 限制结果数,--filter is-official=true 筛选官方镜像)。
docker pull [镜像名[:标签]] 拉取镜像(默认拉取 latest 标签,如 docker pull mysql:5.7)。
docker rmi [镜像名/ID] 删除镜像(-f 强制删除,$(docker images -qa) 删除所有镜像)。
docker save/load 镜像归档与恢复(如 docker save -o my_centos.tar centos)。

3.2 容器操作命令

启动与运行
  • 交互式容器(如 Ubuntu)
    docker run -it --name my_ubuntu ubuntu bash  # -i 交互模式,-t 分配伪终端
    
  • 守护式容器(如 Redis)
    docker run -d -p 6379:6379 --name my_redis redis  # -d 后台运行,-p 端口映射(宿主机:容器)
    
状态管理
命令 说明
docker ps [-a] 查看运行中容器(-a 显示所有容器,包括已停止的)。
docker start/stop 启动/停止容器(支持容器 ID 或名称)。
docker restart/kill 重启容器/强制停止容器。
docker rm 删除容器(-f 强制删除运行中的容器)。
调试与交互
  • 进入容器
    docker exec -it 容器ID bash  # 推荐使用 exec,退出不影响容器运行
    docker attach 容器ID         # 直接进入容器启动命令的终端,退出会停止容器
    
  • 查看日志
    docker logs 容器ID  # 排查容器启动失败问题
    
  • 文件交互
    docker cp 容器ID:容器内路径 宿主机路径  # 从容器复制文件到宿主机
    

四、Docker 镜像深度解析

4.1 镜像底层技术:UnionFS 联合文件系统

  • 分层存储:镜像由多层只读层叠加而成,每层代表一次修改(如安装软件、修改配置)。
  • 共享机制:多个镜像可共享底层公共层(如基础操作系统层),减少存储占用。
  • 容器层:容器启动时在镜像顶部添加一个可写层,所有修改(如新建文件)仅存储在该层,不影响底层镜像。

4.2 镜像构建方式

  1. 基于容器创建(docker commit)

    • 对运行中的容器修改后,提交为新镜像:
      docker commit -m="添加 Vim" -a="作者" 容器ID 新镜像名:标签
      
    • 示例:为 Ubuntu 容器安装 Vim 后生成自定义镜像。
  2. Dockerfile 构建(推荐)

    • 通过脚本定义镜像构建步骤,支持版本控制和自动化。
    • 示例 Dockerfile:
      FROM ubuntu:22.04
      RUN apt-get update && apt-get install -y vim
      CMD ["bash"]
      
    • 构建命令:docker build -t my_ubuntu_vim .

4.3 镜像仓库操作

  • 推送至公共仓库(以 Docker Hub 为例)
    docker login  # 登录账号
    docker tag 本地镜像:标签 仓库名/镜像:标签  # 如 docker tag my_ubuntu:1.0 your_dockerhub_name/my_ubuntu:1.0
    docker push 仓库名/镜像:标签
    
  • 搭建私有仓库
    docker pull registry  # 拉取官方私有仓库镜像
    docker run -d -p 5000:5000 -v /my_registry:/var/lib/registry registry  # 启动私有仓库
    

五、容器数据卷:实现数据持久化

5.1 数据卷是什么?

  • 持久化存储:将容器内数据映射到宿主机磁盘,容器删除后数据不丢失。
  • 核心特点
    • 数据实时同步:容器与宿主机双向共享数据。
    • 独立生命周期:数据卷存在直至无容器使用。
    • 支持多容器共享:多个容器可挂载同一数据卷。

5.2 常用操作

  • 创建数据卷
    docker run -it -v 宿主机路径:容器内路径 --name data_container ubuntu  # 如 -v /data/host_data:/data/container_data
    
  • 读写权限控制
    docker run -v 宿主机路径:容器内路径:ro 镜像  # 容器内只读(ro),默认读写(rw)
    
  • 卷继承
    docker run --volumes-from 源容器名 --name new_container 镜像  # 新容器继承源容器的数据卷
    

六、生产环境常用组件部署

6.1 Tomcat 部署

# 拉取并启动 Tomcat
docker run -d -p 8080:8080 --name my_tomcat tomcat
# 部署 WAR 包:将 war 文件复制到容器的 webapps 目录(注意:新版本 Tomcat 需将 webapps.dist 重命名为 webapps)
docker exec -it my_tomcat mv webapps.dist webapps

6.2 MySQL 部署(含数据持久化)

简易版(无持久化)
docker pull mysql:5.7
docker run -d -p 3306:3306 --name testmysql -e MYSQL_ROOT_PASSWORD=123456 mysql
生产版(挂载数据卷)
docker run -d -p 3306:3306 \
  -v /app/mysql/data:/var/lib/mysql \    # 数据目录
  -v /app/mysql/conf:/etc/mysql/conf.d \  # 配置目录
  -e MYSQL_ROOT_PASSWORD=123456 \
  --name my_mysql mysql:5.7
  • 解决中文乱码:在 /app/mysql/conf/my.cnf 中添加:
    [client]
    default_character_set=utf8
    [mysqld]
    character_set_server=utf8
    collation_server=utf8_general_ci
    

6.3 Redis 集群搭建(3 主 3 从)

  1. 启动节点
    # 启动 6 个 Redis 容器(端口 6381-6386)
    docker run -d --name redis-node-1 --net host -v /data/redis-6381:/data redis:6.0.8 --cluster-enabled yes --port 6381
    # 类似启动其他节点,修改端口和数据卷路径
    
  2. 初始化集群
    redis-cli --cluster create 主机IP:6381 主机IP:6382 主机IP:6383 主机IP:6384 主机IP:6385 主机IP:6386 --cluster-replicas 1
    
  3. 验证集群
    redis-cli -p 6381 -c  # -c 开启集群模式,支持自动重定向
    

七、总结:Docker 的价值与实践建议

7.1 核心价值

  • 开发效率:一次打包,处处运行,消除环境差异。
  • 部署效率:秒级启动、弹性扩缩容,支撑微服务架构。
  • 资源利用率:轻量隔离,单机运行数千容器,降低硬件成本。

7.2 最佳实践

  • 数据卷优先:生产环境务必挂载数据卷,避免容器删除导致数据丢失。
  • 镜像优化:基于官方基础镜像构建,使用多阶段构建减少镜像体积。
  • 网络管理:通过 docker network create 创建自定义网络,实现容器间通信。
  • 安全配置:限制容器资源(--cpu-shares--memory),使用私有仓库管理敏感镜像。

Docker 作为云原生的基石,不仅解决了传统部署的痛点,更推动了 DevOps 文化的普及。通过掌握其核心概念和实战技巧,开发者和运维人员能够高效构建可移植、易扩展的应用系统,拥抱敏捷开发与部署的未来。

你可能感兴趣的:(Docker 学习入门篇:从基础概念到实战部署)