从入门到实践:Docker全阶段学习指南,解锁容器化技术的核心魅力


在云计算与微服务飞速发展的今天,容器化技术已成为开发者与运维人员的必备技能。而Docker,作为容器化领域的标杆工具,凭借其轻量、高效、可移植的特性,彻底改变了应用的构建、部署与运行方式。本文将从Docker的基础概念出发,逐步深入到实操层面,带大家全面掌握Docker的核心知识与实用技巧。

一、Docker前世今生:从虚拟化到容器化的跨越

要理解Docker,首先需要理清它与云计算、虚拟化技术的关系。云计算为我们提供了可伸缩的计算资源,常见的云服务模型分为IaaS、PaaS、SaaS和DaaS四类。其中,IaaS提供虚拟化的计算资源,用户需自行管理操作系统;PaaS则提供开发平台,让开发者专注于应用开发;SaaS直接提供现成的应用程序,开箱即用;DaaS则聚焦于数据处理与分析服务。阿里云、腾讯云、AWS等主流云服务提供商,正是这些服务的主要承载者。

传统虚拟化技术(如VMware、Hyper-V)通过模拟完整的硬件环境,让多个操作系统在同一台物理机上运行。但这种方式存在资源消耗大、启动慢的问题——每个虚拟机都需要运行独立的操作系统,对硬件资源造成了不小的浪费。

而Docker带来的容器化技术,彻底解决了这一痛点。Docker诞生于2013年,由Solomon Hykes及其团队从DotCloud项目中孵化而来。它基于Linux内核的Namespace(资源隔离)、Cgroup(资源限制)和写时复制(Copy-on-Write)技术,实现了“操作系统级虚拟化”。与传统虚拟机不同,Docker容器无需运行完整的操作系统,而是共享宿主机的内核,仅打包应用及其依赖环境。这使得容器启动速度达到秒级,资源占用大幅降低,单机可支持上千个容器运行,同时还能保证应用在不同环境下的一致性运行。

二、Docker核心概念:三分钟搞懂镜像、容器与仓库

要玩转Docker,必须先掌握三个核心概念:镜像(Image)、容器(Container)和仓库(Repository),它们共同构成了Docker的基础生态。

1. 镜像(Image):应用的“只读模板”

镜像就像系统安装光盘——它包含了应用程序及其所有依赖(如操作系统、库文件、配置文件等),是创建容器的“模板”。镜像具有只读特性,并且采用分层存储结构,每一层对应一次修改操作(例如安装一个软件、配置一个环境变量)。这种分层结构不仅节省存储空间,还能实现镜像的高效复用与增量更新。

比如我们常用的Nginx镜像,底层可能是一个基础Linux系统层,之上是Nginx依赖的库文件层,最上层是Nginx应用程序层。通过docker images命令,我们可以查看本地已下载的所有镜像,包括镜像名称、标签(Tag,用于区分同一仓库的不同版本)、镜像ID等信息。

2. 容器(Container):镜像的“可运行实例”

如果说镜像相当于面向对象中的“类”,那么容器就是“对象”——它是镜像的可运行实例,拥有独立的文件系统、网络空间和进程空间。容器启动后,Docker会在镜像的只读层之上挂载一层可读写层,应用的所有修改操作都在这一层进行,不会影响原始镜像。

通过docker run命令,我们可以快速创建并启动一个容器。例如docker run -itd --name my-nginx nginx:latest,这条命令会基于最新版的Nginx镜像,创建一个名为“my-nginx”的容器,并在后台运行。容器的生命周期包括创建、启动、停止、重启、删除等,当容器内的主进程(PID=1的进程)退出时,容器也会随之停止。

3. 仓库(Repository):镜像的“存储与分发中心”

仓库是存放Docker镜像的地方,类似于代码仓库(如GitHub)。Docker Hub是全球最常用的公共仓库,提供了海量的官方与第三方镜像;同时,企业或个人也可以搭建私有仓库,用于存储敏感或定制化的镜像。

我们可以通过docker pull命令从仓库拉取镜像(如docker pull nginx:latest),通过docker push命令将本地镜像上传到仓库。需要注意的是,镜像标签的命名规范——例如swr.cn-east-3.myhuaweicloud.com/nginx:web01,表示该镜像属于华为云仓库中的“nginx”仓库,标签为“web01”。

三、Docker实操指南:从安装到容器管理的全流程

掌握了基础概念后,我们来进入实操环节。以下操作以CentOS 7系统为例,带大家完成Docker的安装、镜像管理与容器管理。

1. Docker安装与配置

Docker仅支持64位系统,安装前需先关闭防火墙与SELinux,避免权限冲突:

# 关闭防火墙
systemctl stop firewalld.service
# 临时关闭SELinux
setenforce 0

接着安装Docker依赖包,并配置阿里云镜像源(国内用户可大幅提升镜像下载速度):

# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置阿里云Docker源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

最后安装Docker-CE(社区版,免费开源)并设置开机自启:

# 安装Docker-CE(如需指定版本,可添加版本号,如docker-ce-20.10.18)
yum install -y docker-ce docker-ce-cli containerd.io
# 启动Docker服务
systemctl start docker.service
# 设置开机自启
systemctl enable docker.service

通过docker --version命令验证安装是否成功,若显示版本信息(如Docker version 20.10.3, build 48d30b5),则说明安装完成。

2. 镜像管理:搜索、拉取、导出与上传

  • 搜索镜像:通过docker search命令在Docker Hub搜索镜像,例如搜索Nginx:
    docker search nginx
    
    结果会显示镜像名称、描述、星级(反映受欢迎程度)等信息。
  • 拉取镜像:使用docker pull拉取指定镜像,默认拉取latest标签(最新版):
    docker pull nginx:latest
    
  • 镜像加速:国内用户可配置镜像加速器(如阿里云、华为云),提升拉取速度。以阿里云为例:
    # 创建Docker配置目录
    mkdir -p /etc/docker
    # 写入加速器配置
    tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://ae3f5qei.mirror.aliyuncs.com"]
    }
    EOF
    # 重启Docker服务使配置生效
    systemctl daemon-reload
    systemctl restart docker
    
  • 导出与导入镜像:如需迁移镜像,可将本地镜像导出为tar包,再导入到其他机器:
    # 导出镜像(将nginx:latest导出为nginx.tar)
    docker save -o nginx.tar nginx:latest
    # 导入镜像(从nginx.tar导入镜像)
    docker load -i nginx.tar
    
  • 删除镜像:通过docker rmi命令删除镜像,需注意先删除依赖该镜像的容器:
    # 通过标签删除(若镜像有多个标签,仅删除指定标签)
    docker rmi nginx:web
    # 通过镜像ID删除(彻底删除镜像)
    docker rmi 41f689c20910
    

3. 容器管理:创建、启动、交互与迁移

  • 创建与启动容器docker run命令可直接创建并启动容器,常用参数如下:
    • -i:保持标准输入打开
    • -t:分配伪终端
    • -d:后台运行
    • --name:指定容器名称
    • -p:端口映射(如-p 8080:80表示将宿主机8080端口映射到容器80端口)
      示例:创建并启动一个后台运行的Nginx容器,映射宿主机8080端口到容器80端口:
    docker run -itd --name my-nginx -p 8080:80 nginx:latest
    
  • 查看容器状态docker ps命令查看正在运行的容器,添加-a参数查看所有容器(包括已停止的):
    # 查看运行中的容器
    docker ps
    # 查看所有容器
    docker ps -a
    
  • 容器交互:通过docker exec命令进入运行中的容器,进行命令操作:
    # 进入my-nginx容器,启动bash终端
    docker exec -it my-nginx /bin/bash
    
    执行exit命令可退出容器,且容器会继续后台运行(若直接使用docker run -it启动容器,退出后容器会停止)。
  • 文件复制:通过docker cp命令在宿主机与容器之间复制文件:
    # 将宿主机的test.txt复制到容器/opt目录下
    docker cp ~/test.txt my-nginx:/opt/
    # 将容器/opt/test.txt复制到宿主机~/abc123.txt
    docker cp my-nginx:/opt/test.txt ~/abc123.txt
    
  • 容器迁移:通过docker export导出容器为tar包,再通过docker import导入为镜像(需注意:导入后仅生成镜像,需重新创建容器):
    # 导出容器(将my-nginx容器导出为centos7.tar)
    docker export my-nginx > centos7.tar
    # 导入为镜像(将centos7.tar导入为centos7:test镜像)
    cat centos7.tar | docker import - centos7:test
    
  • 删除容器:通过docker rm命令删除容器,删除运行中的容器需添加-f参数强制删除:
    # 删除已停止的容器
    docker rm my-nginx
    # 强制删除运行中的容器
    docker rm -f my-nginx
    

四、Docker网络管理:理解网络模式,实现容器通信

Docker的网络管理是容器部署的关键环节,不同的网络模式适用于不同的场景。Docker默认提供了4种网络模式,同时支持自定义网络。

1. 四种默认网络模式

网络模式特点适用场景
bridge(桥接模式)默认模式,容器通过docker0虚拟网桥与宿主机、其他容器通信,拥有独立IP大多数场景,需容器间通信且需要端口映射
host(主机模式)容器共享宿主机网络栈,无独立IP,直接使用宿主机IP和端口对网络性能要求高,无需端口映射的场景
container(容器模式)新容器共享已有容器的网络栈,与已有容器共用IP和端口需两个容器紧密通信(如前端容器与后端容器),且避免端口冲突
none(无网络模式)容器仅拥有回环接口(lo),无其他网络配置需完全隔离网络,保证安全性的场景(如内部测试容器)

2. 自定义网络

默认的bridge模式不支持指定容器IP,若需自定义IP范围,可创建自定义bridge网络:

# 创建自定义网络,子网为172.18.0.0/16,网卡名为docker1,网络名为mynetwork
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
# 基于自定义网络创建容器,指定IP为172.18.0.10
docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash

自定义网络支持容器名称的DNS解析,容器间可直接通过名称通信(如ping test4),无需依赖IP地址,大幅提升了部署灵活性。

五、Docker的应用场景:为何它成为DevOps的核心工具?

Docker的优势不仅在于轻量与高效,更在于它完美契合了现代软件开发与运维的需求,主要应用场景包括:

1. CI/CD(持续集成与持续交付)

在CI/CD流程中,Docker可以为开发、测试、生产环境提供一致的运行环境,避免“开发环境能跑,生产环境报错”的问题。开发者通过Dockerfile构建镜像,将应用与依赖打包;测试人员直接使用该镜像启动容器进行测试;运维人员将镜像部署到生产环境,整个流程无缝衔接,大幅提升交付效率。

2. 微服务架构

微服务架构将应用拆分为多个独立的服务,每个服务可独立部署与扩展。Docker为每个微服务提供了隔离的运行环境,服务间通过网络通信,互不干扰。结合Kubernetes(容器编排工具),还可以实现微服务的自动扩缩容、故障自愈等功能,进一步提升系统的稳定性与可扩展性。

3. 多云与混合云环境

Docker容器具有极强的可移植性,可在不同云平台(如阿里云、AWS)、不同操作系统(如Linux、Windows)间无缝迁移。这使得企业可以灵活选择云服务提供商,避免绑定单一厂商,同时实现“本地+云端”的混合云部署架构。

六、总结:开启容器化技术的进阶之路

Docker作为容器化技术的代表,不仅简化了应用的部署与管理,更推动了DevOps、微服务等理念的落地。通过本文的学习,相信大家已经掌握了Docker的基础概念、安装配置、镜像与容器管理、网络模式等核心知识。

但Docker的学习之路并未结束——后续还可以深入学习Dockerfile(自定义镜像构建)、Docker Compose(多容器编排)、Kubernetes(大规模容器集群管理)等内容,进一步提升容器化技术的应用能力。无论是开发者还是运维人员,掌握Docker都将成为职场中的重要竞争力,助力你在云计算时代稳步前行。

Logo

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

更多推荐