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等应用,逐步深入到网络配置、资源限制、镜像构建等高级功能。

相关推荐
zhuzewennamoamtf2 小时前
Linux SPI设备驱动
android·linux·运维
春日见2 小时前
在虚拟机上面无法正启动机械臂的控制launch文件
linux·运维·服务器·人工智能·驱动开发·ubuntu
松涛和鸣2 小时前
Linux Makefile : From Basic Syntax to Multi-File Project Compilation
linux·运维·服务器·前端·windows·哈希算法
LF3_3 小时前
配置ssh免密登录
运维·ssh
再睡一夏就好3 小时前
深入Linux线程:从轻量级进程到双TCB架构
linux·运维·服务器·c++·学习·架构·线程
小小药3 小时前
09-vmware配置虚机连接互联网-nat模式
linux·运维·centos
广东大榕树信息科技有限公司3 小时前
如何通过国产信创动环监控系统优化工厂环境管理?
运维·网络·物联网·国产动环监控系统·动环监控系统
莫白媛4 小时前
Linux创作笔记综合汇总篇
linux·运维·笔记
studytosky4 小时前
Linux系统编程:深度解析 Linux 进程,从底层架构到内存模型
linux·运维·服务器·开发语言·架构·vim