Docker容器技术指南

前言

简单说,Docker就像一个"集装箱",能把你的应用程序和它需要的所有依赖(比如软件库、配置文件)打包在一起。不管你把这个"集装箱"搬到Windows、Linux还是云端服务器,里面的应用都能原样运行。如今Docker已经成为开发者和运维人员的必备技能,尤其是在云原生和DevOps飞速发展的今天,学好Docker能让你的部署效率翻倍。这篇文章就从基础概念到实战操作,带你一步步搞懂Docker。

一、Docker发展与简介

1.1 云服务与虚拟化基础

Docker的诞生离不开云计算和虚拟化技术的铺垫,先搞懂这两个基础,学习Docker会更轻松。

1.1.1 云服务模型介绍

云计算简单说就是"通过网络租用计算资源",根据租用的资源类型,主要分为4种模式,用生活场景类比会更易理解:

  • IaaS(基础设施即服务):相当于租一台裸机服务器,你可以自己装系统、配环境,灵活度最高,但需要自己管理所有细节。比如阿里云ECS、腾讯云CVM都属于这类。
  • PaaS(平台即服务):相当于租一个现成的开发平台,不用管底层服务器和系统,直接在上面写代码、部署应用。比如百度智能云的BAE、Google App Engine。
  • SaaS(软件即服务):相当于直接用现成的软件,不用安装、不用维护,打开网页就能用。比如钉钉、Office 365、微信公众号后台。
  • DaaS(数据即服务):相当于租数据处理能力,不用自己搭建大数据平台,就能分析海量数据。比如阿里云数加、腾讯云数据万象。
1.1.2 常见云服务提供商

现在主流的云厂商都支持Docker部署,国内常用的有阿里云、腾讯云、华为云,国外的有AWS、Google Cloud、Microsoft Azure。这些厂商还会提供镜像加速服务,让你下载Docker相关资源更快。

1.2 虚拟化技术概述

虚拟化技术的核心是"资源共享与隔离",简单说就是把一台物理服务器分成多个独立的虚拟环境,每个环境都能独立运行。

1.2.1 虚拟化基础

虚拟化主要分为两种类型:

  • 全虚拟化:完全模拟物理硬件,不同操作系统(比如Windows和Linux)可以在同一台服务器上同时运行,但性能损耗较大。比如VMware Workstation就属于这类。
  • 半虚拟化:虚拟机和宿主机操作系统协作,不用完全模拟硬件,性能更好,但需要对操作系统内核做一些修改。比如Linux系统的KVM虚拟化。

常见的虚拟化产品有:VMware(企业级常用)、VirtualBox(个人开发测试免费)、Hyper-V(微软自带)、KVM(Linux内核原生支持)。

1.3 Docker简介及其重要性

1.3.1 为什么使用Docker?

Docker是一种"轻量级虚拟化"技术,和传统虚拟机(比如VMware)比,优势特别明显:

  • 资源占用少:传统虚拟机需要给每个虚拟环境装完整操作系统,而Docker容器共享宿主机的内核,不用单独装系统,内存和CPU开销能减少50%以上。
  • 启动速度快:虚拟机启动需要几分钟,而Docker容器启动只需要几秒。
  • 移植性强:打包好的容器可以在任何支持Docker的环境中运行,真正实现"一次打包,到处运行"。
  • 隔离性好:每个容器都是独立的,应用之间互不干扰,也不会影响宿主机。
1.3.2 Docker发展历史

Docker的发展历程不算长,但迭代很快:

  • 2013年:Docker项目从PaaS服务商DotCloud拆分,首次开源;
  • 2014年:Docker公司成立,开始快速扩张生态;
  • 2017年:拆分社区版(CE)和企业版(EE),满足不同用户需求;
  • 2018年:集成Kubernetes,支持容器编排;
  • 2020年:重点支持Docker Compose v2,强化开发者工具;
  • 2023年:Docker 23.x版本强化云原生支持,优化安全性和CI/CD功能。
1.3.3 Docker版本:CE vs EE

Docker主要分两个版本,按需选择即可:

  • 社区版(CE):免费,适合个人开发者和小型团队,提供基础的容器功能,每月更新一次;
  • 企业版(EE):付费,适合大型企业和生产环境,提供企业级安全、官方技术支持,维护周期更长(18个月)。
1.3.4 Docker与传统虚拟化的区别

用一张表就能看明白核心差异:

特性 Docker容器 传统虚拟机
启动速度 秒级 分钟级
资源损耗 几乎无 约50%
性能 接近原生 弱于原生
单机支持数量 上千个 几十个
隔离性 资源隔离(进程级) 完全隔离(系统级)
镜像大小 MB级 GB级
1.3.5 容器化技术生态系统

Docker不是孤立的,它属于一个庞大的容器生态,常见的相关技术有:

  • Kubernetes(K8s):Google开源的容器编排工具,能管理成千上万个容器,负责调度、扩展和维护;
  • Harbor:企业级镜像仓库,用来存储和管理私有Docker镜像;
  • LXC:早期的Linux容器技术,Docker就是基于它发展而来;
  • Podman:和Docker功能类似,但不用后台守护进程,更安全。
1.3.6 Docker容器的优势

除了前面提到的,Docker还有两个核心优势:

  • 简化部署:创建、复制、删除容器都只要一条命令,不用手动配置依赖;
  • 版本控制:镜像支持标签(比如v1.0、v2.0),可以轻松切换应用版本,回滚也很方便。
1.3.7 容器技术的应用场景

Docker的应用场景非常广泛,主要包括:

  • CI/CD(持续集成/持续交付):开发、测试、生产环境用相同容器,避免"环境不一致"问题;
  • 微服务架构:把一个复杂应用拆成多个小服务,每个服务打包成独立容器,独立部署和扩展;
  • 开发测试:快速创建临时测试环境,测试完成后直接删除,不占用资源;
  • 多云环境:容器可以在不同云厂商之间无缝迁移,不用修改配置。

1.4 Docker基础概念

1.4.1 Docker核心认知

Docker的Logo是一条蓝色鲸鱼拖着多个集装箱,特别形象:

  • 鲸鱼:代表宿主机(比如你的电脑或服务器);
  • 集装箱:代表容器,每个容器里都装着一个独立的应用和它的依赖;
    Docker的设计宗旨是"Build, Ship and Run Any App, Anywhere"(构建、发布、运行任何应用,在任何地方)。
1.4.2 Linux六大命名空间(Namespace)

Docker能实现容器隔离,核心靠的是Linux的六大命名空间,简单说就是给每个容器"画一个独立的圈子":

  • MNT(挂载):每个容器有自己的文件系统,看不到宿主机的文件;
  • NET(网络):每个容器有自己的网卡、IP和端口,和其他容器网络隔离;
  • PID(进程):容器内的进程号从1开始,和宿主机的进程号不冲突;
  • IPC(进程间通信):容器内的进程不能和其他容器的进程通信;
  • UTS(主机):每个容器可以设置自己的主机名和域名;
  • USER(用户):容器内的用户名和权限可以和宿主机不同。
1.4.3 Docker架构与组件

Docker采用"客户端-服务器"架构,主要由5个部分组成:

  • Docker Daemon(守护进程):运行在宿主机后台的服务,负责管理容器的创建、启动、停止等生命周期;
  • Docker Client(客户端):我们操作Docker的工具,比如命令行中的docker rundocker pull都是通过客户端发送指令;
  • Docker Image(镜像):相当于容器的"模板",包含应用和所有依赖,是只读的。比如nginx镜像就包含了nginx服务器和相关配置;
  • Docker Container(容器):镜像的可运行实例,相当于"模板造出来的产品"。一个镜像可以创建多个容器;
  • Docker Registry(仓库):存储镜像的地方,相当于"镜像超市"。Docker Hub是官方公共仓库,里面有大量现成镜像,企业也可以搭建私有仓库。
1.4.4 Docker核心技术

Docker能高效运行,靠的是三个核心技术:

  • Namespace:实现资源隔离(前面已经讲过);
  • Cgroup:实现资源限制,比如限制某个容器最多使用1个CPU、2GB内存,避免单个容器占用太多资源;
  • 写时复制(Copy-on-Write):镜像分层存储,多个容器可以共享镜像层,只有当容器修改文件时,才会复制该层到容器内部,节省存储空间和启动时间。
1.4.5 Docker 核心概念(重点)

这三个概念是学习Docker的基础,一定要搞懂:

  • 镜像(Image):只读模板,是创建容器的基础。比如Ubuntu镜像、nginx镜像;
  • 容器(Container):镜像的运行实例,可启动、停止、删除,每个容器都是独立的;
  • 仓库(Repository):存储镜像的地方,分为公有仓库(如Docker Hub)和私有仓库(如Harbor)。
1.4.6 Docker安装与配置(CentOS 7示例)

Docker只支持64位系统,以CentOS 7为例,安装步骤很简单:

  1. 关闭防火墙和SELinux(避免干扰网络):
bash 复制代码
systemctl stop firewalld.service  # 关闭防火墙
setenforce 0  # 临时关闭SELinux
  1. 安装依赖包:
bash 复制代码
yum install -y yum-utils device-mapper-persistent-data lvm2
  1. 设置阿里云镜像源(国内下载更快):
bash 复制代码
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 安装Docker CE并启动:
bash 复制代码
yum install -y docker-ce  # 安装最新版
systemctl start docker.service  # 启动Docker
systemctl enable docker.service  # 设置开机自启
  1. 验证安装是否成功:
bash 复制代码
docker --version  # 查看版本
docker info  # 查看系统信息

如果能看到Docker版本号和系统信息,说明安装成功了。

二、Docker容器管理

2.1 Docker镜像操作

镜像是Docker的基础,所有容器都基于镜像创建,下面是常用的镜像操作命令。

2.1.1 搜索镜像

从Docker Hub搜索需要的镜像,比如搜索nginx:

bash 复制代码
docker search nginx

搜索结果会显示镜像名称、描述、星级(越高越可靠),带"OFFICIAL"标记的是官方镜像。

2.1.2 拉取镜像

从仓库下载镜像到本地,默认下载最新版(标签为latest):

bash 复制代码
docker pull nginx  # 下载最新版nginx
docker pull nginx:1.25.3  # 下载指定版本nginx
2.1.3 镜像加速下载

国内直接下载Docker Hub镜像速度较慢,推荐配置阿里云加速器:

  1. 登录阿里云控制台,找到"容器镜像服务",获取专属加速地址;
  2. 配置加速:
bash 复制代码
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["你的阿里云加速地址"]
}
EOF
  1. 重启Docker生效:
bash 复制代码
systemctl daemon-reload
systemctl restart docker
2.1.4 查看镜像信息
  • 查看本地所有镜像:
bash 复制代码
docker images

会显示镜像名称、标签、ID、创建时间和大小;

  • 查看镜像详细信息(通过镜像ID):
bash 复制代码
docker inspect 镜像ID

会显示镜像的分层结构、环境变量等详细信息。

2.1.5 为镜像添加标签

给镜像添加标签,方便识别或上传到仓库:

bash 复制代码
docker tag nginx:latest mynginx:v1  # 给nginx:latest添加标签mynginx:v1

添加标签不会创建新镜像,只是给同一镜像起了个别名。

2.1.6 删除镜像

删除本地镜像,注意:如果镜像已被容器使用,需先删除容器:

bash 复制代码
docker rmi mynginx:v1  # 通过标签删除
docker rmi 镜像ID  # 通过镜像ID删除
2.1.7 导出/导入镜像

用于镜像备份或迁移(比如迁移到无网络的服务器):

  • 导出镜像(保存为tar文件):
bash 复制代码
docker save -o nginx.tar nginx:latest  # 导出nginx镜像为nginx.tar
  • 导入镜像(从tar文件加载):
bash 复制代码
docker load < nginx.tar  # 导入镜像
2.1.8 上传镜像到仓库

将本地镜像上传到Docker Hub或私有仓库,以Docker Hub为例:

  1. 登录Docker Hub(需先注册账号):
bash 复制代码
docker login  # 输入用户名和密码
  1. 给镜像打标签(格式:用户名/镜像名:标签):
bash 复制代码
docker tag nginx:latest 你的用户名/nginx:v1
  1. 上传镜像:
bash 复制代码
docker push 你的用户名/nginx:v1

2.2 Docker容器操作

容器是镜像的运行实例,下面是容器的全生命周期操作。

2.2.1 创建容器

创建容器但不启动,需要指定镜像和名称:

bash 复制代码
docker create -it --name mynginx nginx:latest  # 创建名为mynginx的容器
  • -i:保持标准输入打开;
  • -t:分配伪终端,方便后续交互;
  • --name:指定容器名称。
2.2.2 启动/停止容器
  • 启动容器:
bash 复制代码
docker start mynginx  # 通过名称启动
docker start 容器ID  # 通过容器ID启动
  • 停止容器:
bash 复制代码
docker stop mynginx  # 停止容器
docker restart mynginx  # 重启容器
2.2.3 查看容器状态
  • 查看正在运行的容器:
bash 复制代码
docker ps
  • 查看所有容器(运行中、已停止):
bash 复制代码
docker ps -a

结果会显示容器ID、名称、状态(Up为运行中,Exited为已停止)、端口映射等信息。

2.2.4 创建并启动容器(docker run

docker run 等同于先执行 docker create 再执行 docker start,是最常用的命令:

bash 复制代码
docker run -it --name mycentos centos:7 /bin/bash  # 创建并启动centos容器

注意:如果不加 -d 参数,容器会在你退出后停止。因为Docker容器默认以PID=1的进程为核心,进程退出,容器就会停止。

当执行 docker run 时,Docker会按以下步骤运行:

  1. 在本地查找指定镜像;
  2. 找到镜像则直接启动;
  3. 没找到则从配置的仓库下载,下载完成后启动;
  4. 仓库也没找到则返回错误。
2.2.5 在后台持续运行 docker run 创建的容器

要让容器在后台持续运行,需要添加 -d 参数(守护模式):

bash 复制代码
docker run -d --name mynginx nginx:latest  # 后台运行nginx容器

这样即使退出终端,容器也会继续运行。

2.2.6 容器交互(进入容器)

进入运行中的容器执行命令,推荐使用 docker exec(退出后容器不会停止):

bash 复制代码
docker exec -it mycentos /bin/bash  # 进入mycentos容器
  • -i:保持输入打开;
  • -t:分配伪终端;
    执行完命令后,输入 exit 即可退出容器,容器会继续后台运行。
2.2.6 容器文件复制(宿主机↔容器)

这是面试高频题,学会在宿主机和容器之间传输文件:

  • 宿主机文件复制到容器:
bash 复制代码
docker cp 宿主机文件路径 容器名称:容器内路径
# 示例:把宿主机的test.txt复制到mycentos容器的/opt目录
docker cp ~/test.txt mycentos:/opt/
  • 容器文件复制到宿主机:
bash 复制代码
docker cp 容器名称:容器内路径 宿主机文件路径
# 示例:把mycentos容器的/opt/test.txt复制到宿主机的~/abc目录
docker cp mycentos:/opt/test.txt ~/abc/
2.2.7 容器导出/导入

用于容器迁移,导出的是容器当前状态,导入后会变成镜像:

  • 导出容器:
bash 复制代码
docker export mycentos > centos.tar  # 导出mycentos容器为centos.tar
  • 导入容器(生成镜像):
bash 复制代码
cat centos.tar | docker import - centos:test  # 导入为centos:test镜像
2.2.8 删除容器

删除容器前需确保容器已停止,否则需要强制删除:

  • 删除单个已停止容器:
bash 复制代码
docker rm mycentos  # 通过名称删除
docker rm 容器ID  # 通过容器ID删除
  • 强制删除运行中的容器(不推荐):
bash 复制代码
docker rm -f mycentos
  • 批量删除所有已停止容器:
bash 复制代码
docker rm $(docker ps -a -q)

总结

Docker的核心价值在于"标准化"和"高效性",它用"集装箱"的理念解决了环境一致性问题,让应用部署变得简单、快速、可移植。

学习Docker的关键在于"理论+实践":先理解镜像、容器、仓库的核心概念,搞懂Namespace、Cgroup等底层技术原理,再通过实际操作熟练掌握常用命令。刚开始可以从简单的镜像拉取、容器创建入手,慢慢尝试部署nginx、tomcat等应用,逐步深入到网络配置、资源限制、镜像构建等高级功能。

相关推荐
Leinwin2 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
2401_865382502 小时前
信息化项目运维与运营的区别
运维·运营·信息化项目·政务信息化
漠北的哈士奇2 小时前
VMware Workstation导入ova文件时出现闪退但是没有报错信息
运维·vmware·虚拟机·闪退·ova
如意.7592 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
运维小欣2 小时前
智能体选型实战指南
运维·人工智能
yy55273 小时前
Nginx 性能优化与监控
运维·nginx·性能优化
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ3 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
05大叔5 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密5 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
dashizhi20155 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑