当前位置: 首页 > news >正文

Docker(一)—— Docker入门到精通:从基础概念到容器管理

文章目录

  • 前言
  • 一、Docker发展与简介
    • 1.1 云服务与虚拟化基础
      • 1.1.1 云服务模型介绍
      • 1.1.2 常见云服务提供商
    • 1.2 虚拟化技术概述
      • 1.2.1 虚拟化基础
    • 1.3 Docker简介及其重要性
      • 1.3.1 为什么使用Docker?
      • 1.3.2 Docker发展历史
      • 1.3.3 Docker版本:CE vs EE
      • 1.3.4 Docker与传统虚拟化的区别
      • 1.3.5 容器化技术生态系统
      • 1.3.6 Docker容器的优势
      • 1.3.7 容器技术的应用场景
    • 1.4 Docker基础概念
      • 1.4.1 Docker核心认知
      • 1.4.2 Linux六大命名空间(Namespace)
      • 1.4.3 Docker架构与组件
      • 1.4.4 Docker核心技术
      • 1.4.5 Docker 核心概念(重点)
      • 1.4.6 Docker安装与配置(CentOS 7示例)
  • 二、Docker容器管理
    • 2.1 Docker镜像操作
      • 2.1.1 搜索镜像
      • 2.1.2 拉取镜像
      • 2.1.3 镜像加速下载
      • 2.1.4 查看镜像信息
      • 2.1.5 为镜像添加标签
      • 2.1.6 删除镜像
      • 2.1.7 导出/导入镜像
      • 2.1.8 上传镜像到仓库
    • 2.2 Docker容器操作
      • 2.2.1 创建容器
      • 2.2.2 启动/停止容器
      • 2.2.3 查看容器状态
      • 2.2.4 创建并启动容器(`docker run`)
        • 当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:
      • 2.2.5 在后台持续运行 docker run 创建的容器
      • 2.2.6 容器交互(进入容器)
      • 2.2.6 容器文件复制(宿主机↔容器)
      • 2.2.7 容器导出/导入
      • 2.2.8 删除容器
  • 三、Docker网络管理(重点)
    • 3.1 Docker网络实现原理
    • 3.2 Docker的5种网络模式
      • 3.2.1 Host模式(`--net=host`)
      • 3.2.2 Container模式(`--net=container:容器名`)
      • 3.2.3 None模式(`--net=none`)
      • 3.2.4 Bridge模式(默认,`--net=bridge`)
      • 3.2.5 自定义网络模式
      • 3.5.6 网络模式总结
  • 总结

前言

在云原生和DevOps飞速发展的今天,Docker作为容器化技术的标杆,已经成为开发者和运维人员必备的技能之一。它解决了“开发环境能跑,生产环境跑不起来”的经典痛点,通过“一次封装,到处运行”的理念,让应用部署、迁移和扩展变得前所未有的高效。

本文基于最新的Docker技术文档,梳理了从基础概念到实战操作的全阶段知识,涵盖Docker发展背景、核心原理、容器管理、网络配置等关键内容,既适合新手入门,也可作为资深开发者的参考手册。建议结合实际操作学习,每一个命令都亲手执行一遍,才能真正掌握Docker的精髓。


一、Docker发展与简介

1.1 云服务与虚拟化基础

Docker的诞生离不开云计算和虚拟化技术的发展,理解这两者是掌握Docker的前提。

1.1.1 云服务模型介绍

云计算通过网络提供可伸缩的计算资源,根据服务粒度不同,主要分为以下4类模型:

服务模型核心能力优点缺点典型场景
IaaS(基础设施即服务)提供虚拟化硬件(虚拟机、存储、路由交换机、防火墙灵活度高、可自定义配置需自行管理OS和软件,技术门槛高企业搭建私有服务器、测试环境
PaaS(平台即服务)提供开发平台(如数据库、中间件、运行时简化开发流程,专注业务逻辑灵活度低,受平台限制开发者快速开发Web应用、API服务
SaaS(软件即服务)提供现成应用(如Office 365、钉钉)开箱即用,无需维护定制化差,依赖服务商日常办公软件、在线协作工具
DaaS(数据即服务)提供数据处理/分析能力(如大数据平台)降低数据管理成本,支持快速分析数据隐私风险,依赖服务商安全能力企业用户行为分析、行业数据洞察

1.1.2 常见云服务提供商

目前市场上主流的云服务提供商均支持Docker容器部署,主要包括:

  • 国内:阿里云、腾讯云、华为云(提供镜像加速、容器服务K8s版等)
  • 国外:AWS(ECS/EKS)、Google Cloud(GKE)、Microsoft Azure(AKS)
  • 这些厂商通常提供“存储+计算+网络+CDN”的一站式服务,可与Docker无缝集成。

1.2 虚拟化技术概述

虚拟化技术是实现资源隔离和共享的基础,分为全虚拟化和半虚拟化两类,也是Docker与传统虚拟机的核心区别之一。

1.2.1 虚拟化基础

  1. 虚拟化类型对比

    类型核心原理性能适用场景
    全虚拟化完全模拟硬件环境,允许多个操作系统共享硬件资源较低(硬件模拟开销大)需兼容多OS(如Linux+Windows共存)
    半虚拟化Guest OS与宿主OS协作(修改内核),无需硬件模拟较高(减少模拟开销)高性能需求的环境,尤其是优化了开源操作系统(如 Linux)的虚拟化
  2. 主流虚拟化产品

    • VMware:企业级首选,支持全/半虚拟化,功能完善(如vSphere、Workstation)
    • KVM:Linux内核原生虚拟化,支持硬件虚拟化,依赖硬件支持(如Intel VT-x),性能接近物理机
    • Hyper-V:微软推出,集成于Windows Server,适合Windows环境虚拟化
    • VirtualBox:开源免费,跨平台(Linux/macOS/Windows),适合个人开发测试
    • ESXi:VMware的裸金属虚拟化系统,直接运行在硬件上,性能优于宿主OS上的虚拟化(安装教程参考)

1.3 Docker简介及其重要性

1.3.1 为什么使用Docker?

Docker是一种操作系统级虚拟化技术(基于Linux LXC),核心是将应用及其依赖打包成标准化容器。类比生活中的“集装箱”——无论运输到哪个港口(环境),集装箱内的货物(应用)状态不变。

与传统虚拟机(如VMware)相比,Docker的优势:

  • 资源占用少:无需为每个容器运行完整OS,共享宿主OS内核,内存/CPU开销降低50%以上
  • 启动速度快:容器启动时间秒级(虚拟机需分钟级)
  • 移植性强(跨平台部署/运行):从CentOS到Ubuntu,从本地到云端,容器可无缝迁移
  • 隔离性好:通过Namespace实现进程、网络、文件系统隔离,互不干扰

1.3.2 Docker发展历史

Docker自2013年诞生以来,发展迅速,关键节点如下:

  • 2013年:Docker项目从DotCloud(PaaS服务商)拆分,首次开源

  • 2014年:Docker公司成立,获得融资,生态开始扩张

  • 2015年:发布Docker 1.8,引入新网络架构和卷管理,奠定核心功能

  • 2017年:拆分CE(社区版)和EE(企业版),推出时间驱动版本发布策略

  • 2018年:Docker 18.09支持多阶段构建(Multi-stage Builds),集成Kubernetes

  • 2019年:Docker 19.03支持GPU加速,Docker Desktop增强K8s集成

  • 2020年Docker 20.10 发布,新增了对 Docker Compose v2 的支持,并在性能、功能和稳定性方面进行了一系列增强。

    Docker 宣布将 Docker SwarmKubernetes 的集成进行区分,Kubernetes 成为 Docker 引擎推荐的容器编排工具。

    Docker 开始更加聚焦于开发者工具,而逐渐减少对企业级 Kubernetes 的直接支持,特别是在容器编排方面。

  • 2021年:Docker 进一步优化了其本地开发工具,使得开发者能够更容易在本地环境中使用容器和 Kubernetes 进行集成。

    Docker HubDocker Desktop 的改进,使得 Docker 的云端镜像存储和本地开发环境更加流畅。

  • 2022年:Docker 继续加大对 开发者体验 的关注,推出了对 GitHub 等工具的深度集成,帮助开发者快速构建和部署容器。

    在企业领域,Docker 企业版继续被 Kubernetes 和其他工具组合使用,尤其是对于 CI/CDDevOps 环境中的大规模部署。

  • 2023年:Docker 23.x强化云原生支持,优化CI/CD和安全性

1.3.3 Docker版本:CE vs EE

Docker分为两个主要版本,满足不同用户需求:

版本目标用户功能亮点价格更新周期
CE(社区版)个人开发者、小型团队基础容器功能、Docker Desktop免费每月更新,支持周期短
EE(企业版)大型企业、生产环境企业级安全(如镜像扫描)、官方支持、高可用付费每季度更新,维护周期长(18个月)

1.3.4 Docker与传统虚拟化的区别

Docker 通过操作系统级虚拟化(LXC)提供轻量级的虚拟化,容器之间共享宿主机的操作系统内核,因此相比传统虚拟机,Docker 容器更加轻便、高效。

  • 传统虚拟机:每个虚拟机都包含完整的操作系统,资源占用大。
  • Docker 容器:共享宿主操作系统的内核,启动快,占用少,易于管理。
特性Docker容器传统虚拟机(VM)
启动速度秒级分钟级
资源损耗几乎无(共享内核)约50%(运行完整OS)
性能接近原生弱于原生
单机支持数量上千个几十个
隔离性资源隔离/限制(进程级)完全隔离(OS级)
镜像大小MB级GB级

1.3.5 容器化技术生态系统

容器技术是一种轻量级、提供隔离的虚拟化技术。常见的容器技术包括:

  1. Docker:市场上最为知名和流行的容器框架之一,拥有生态系统完善且社区活跃的优秀特点。它通过简单的工具和接口,使得应用程序的部署于测试过程更为简单。
  2. Kubernetes:Google 开发并开源的容器编排平台,可以管理、调度和扩展容器的应用。
  3. OpenShift:是 Red Hat 提供的开源的容器平台,基于 Kubernetes,但提供了更丰富的功能。
  4. LXC: Linux 容器技术,比 Docker 更接近传统的虚拟化技术,可以看作是轻量级的 VM(虚拟机)。
  5. Rkt:由 CoreOS 开发的一种容器技术,设计上有别于 Docker,它更注重于安全性和模块化。
  6. Apache Mesos:一种用于大规模数据中心的容器编排平台,特别地,它可以与其他调度系统如 Marathon、Chronos 或 Jenkins 集成。
  7. Containerd:是一个开源的容器运行时,是 Docker 的核心组件之一,可用于管理完整的容器生命周期。
  8. Crio:是一个轻量级的容器运行时,专门用于 Kubernetes。
  9. Singularity:一款专注于面向性能敏感和计算密集型应用程序的容器技术。
  10. Podman:与 Docker 相似,但无需守护进程,支持运行和管理 OCI 容器和镜像。

1.3.6 Docker容器的优势

  • 移植性强:应用及其依赖项打包在容器中,实现跨平台、跨环境的无缝运行
  • 隔离性好:容器间相互隔离,确保应用互不干扰,也不会影响宿主机系统
  • 资源高效:无需完整操作系统支持,容器占用资源少,启动速度快
  • 部署便捷:借助Docker可快速完成容器的创建、复制、修改和删除,大幅简化应用部署与管理流程

1.3.7 容器技术的应用场景

  1. CI/CD(持续集成/持续交付):开发环境、测试环境、生产环境使用相同容器,避免“环境不一致”问题
  2. 微服务架构:每个微服务打包成独立容器,独立部署、扩展、升级
  3. 多云/混合云环境:容器可在阿里云、AWS等不同云平台间无缝迁移
  4. 开发测试:快速创建临时测试环境,测试完成后销毁,节省资源
  5. 大数据处理:通过容器部署Hadoop、Spark等组件,简化集群搭建

1.4 Docker基础概念

1.4.1 Docker核心认知

在这里插入图片描述

  1. Docker Logo含义
    Logo是一条蓝色鲸鱼拖着多个集装箱:

    • 鲸鱼:代表宿主机(Host)
    • 集装箱:代表容器(Container),每个集装箱包含一个独立应用
    • 设计隐喻:“将应用打包成标准化容器,在宿主机上高效运行”
  2. Docker设计宗旨
    Build, Ship and Run Any App, Anywhere(构建、发布、运行任何应用,在任何地方),核心是“应用组件级别的标准化”。

  3. 容器化优势

    • 灵活:复杂应用(如微服务集群)也可拆分为多个容器
    • 轻量级:容器利用并共享主机内核。
    • 可互换:支持快速更新镜像,实现应用版本迭代
    • 便携式:可以在本地构建,部署到云,并在任何地方运行。
    • 可扩展:可以增加并自动分发容器副本。
    • 可堆叠:多个容器可通过网络协作,组成完整服务(如前端+后端+数据库)

1.4.2 Linux六大命名空间(Namespace)

Docker通过Linux Namespace实现资源隔离,这是容器技术的核心原理之一,六大命名空间如下:

命名空间缩写作用效果
MNT(Mount)挂载文件系统隔离每个容器有独立的文件系统挂载点(如/目录)
NET(Network)网络网络资源隔离每个容器有独立的网卡、IP、路由表、端口
PID(Process ID)进程进程号隔离容器内的PID从1开始,与宿主机PID不冲突
IPC(Inter-Process Communication)间通进程间通信隔离容器内的IPC(如消息队列)不与其他容器共享
UTS(UNIX Time Sharing)主机主机名/域名隔离每个容器可设置独立的主机名和域名
USER(User ID)用户用户名/组隔离容器内的用户ID可与宿主机映射(如容器内root≠宿主机root)

1.4.3 Docker架构与组件

Docker采用C/S(客户端-服务器)架构,核心组件包括:

  1. Docker Daemon(守护进程)

    • 运行在宿主机后台的进程(dockerd),负责管理容器生命周期(创建、启动、停止)
    • 可通过Docker Client或API与之通信
  2. Docker Client(客户端)

    • 用户与Docker交互的入口(如docker命令行工具)
    • 支持的命令:docker build(构建镜像)、docker run(启动容器)、docker pull(拉取镜像)等
  3. Docker Image(镜像)

    • 只读模板,包含应用及其依赖(如Nginx镜像包含Nginx程序、配置文件、基础OS库)
    • 类比:系统安装光盘(用光盘安装系统,用镜像创建容器)
    • 特性:分层存储(基于UnionFS),可复用(如多个容器共享同一基础镜像层)
  4. Docker Container(容器)

    • 镜像的可运行实例(类比:类与对象的关系,镜像是类,容器是对象)
    • 特性:可读写(在镜像只读层之上挂载可读写层)、独立资源空间(通过Namespace隔离)
  5. Docker Registry(仓库)

    • 存储镜像的服务,分为公有仓库和私有仓库
    • 公有仓库:Docker Hub(默认,包含官方镜像如nginxubuntu
    • 私有仓库:企业内部搭建的仓库(如Harbor),用于存储私有镜像
    • 类比:Maven仓库(Registry=Maven仓库,镜像=Jar包,标签=版本号)

1.4.4 Docker核心技术

Docker容器本质是宿主机上的一个进程,通过以下3项技术实现资源隔离和高效运行:

  1. Namespace实现资源隔离(如进程、网络、文件系统),见1.4.2节
  2. Cgroup(Control Group)实现资源限制(如限制容器最大CPU使用率、内存大小),避免单个容器占用过多资源
  3. 写时复制(Copy-on-Write)实现高效的文件操作。镜像分层存储,容器启动时共享镜像层,仅在修改文件时复制该层到容器可读写层,节省存储空间和启动时间

1.4.5 Docker 核心概念(重点)

  1. 镜像(Image)
    • 镜像是包含应用程序及其所有依赖环境的可执行包。它是一个只读模板,基于该模板可以创建容器实例。
  2. 容器(Container)
    • 容器是镜像的运行实例。容器提供了与外部环境隔离的运行时环境,可以在不同的系统上运行。
    • 容器通过 Docker 引擎启动,具有独立的文件系统、网络、进程空间。
  3. 仓库(Repository)
    • 仓库是存放 Docker 镜像的地方。Docker Hub 是最常用的公共仓库,用户也可以创建私有仓库。

1.4.6 Docker安装与配置(CentOS 7示例)

Docker仅支持64位系统,以下是CentOS 7的安装步骤:

  1. 关闭防火墙和SELinux
    (避免防火墙阻止Docker网络通信)

    # 关闭防火墙(临时)
    systemctl stop firewalld.service
    # 禁止防火墙开机启动
    systemctl disable firewalld.service
    # 关闭SELinux(临时)
    setenforce 0
    # 永久关闭SELinux(需重启)
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    
  2. 安装依赖包

    yum install -y yum-utils device-mapper-persistent-data lvm2
    # yum-utils:提供yum-config-manager工具
    # device-mapper:Linux 内核中支持逻辑卷管理的通用设备映射机制。
    # device-mapper-persistent-data/lvm2:device-mapper 存储驱动程序所需的依赖包。
    
  3. 设置阿里云镜像源
    (国内用户优先选择,加速镜像拉取)

    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  4. 安装Docker CE

    # 安装最新版Docker CE
    yum install -y docker-ce docker-ce-cli containerd.io
    # 安装指定版本(如20.10.18,推荐生产环境使用固定版本)
    # yum install -y docker-ce-20.10.18 docker-ce-cli-20.10.18 containerd.io
    
  5. 启动Docker并设置开机自启

    # 启动Docker
    systemctl start docker.service
    # 设置开机自启
    systemctl enable docker.service
    - Docker 系统包含两个程序:Docker 服务端和 Docker 客户端。
    - Docker 服务端是一个服务进程,负责管理所有容器。
    - Docker 客户端是 Docker 服务端的远程控制器,用于控制 Docker 服务端进程。
    
  6. 验证安装

    # 查看Docker版本
    docker --version
    # 查看Docker系统信息(验证是否正常运行)
    docker info
    
    Client:
    Context:    default
    Debug Mode: false
    Plugins:
    app: Docker App (Docker Inc., v0.9.1-beta3)
    buildx: Docker Buildx (Docker Inc., v0.9.1-docker)
    scan: Docker Scan (Docker Inc., v0.23.0)Server:
    Containers: 0
    Running: 0
    Paused: 0
    Stopped: 0
    Images: 0
    Server Version: 20.10.18
    Storage Driver: overlay2
    Backing Filesystem: xfs
    Supports d_type: true
    Native Overlay Diff: true
    userxattr: false
    Logging Driver: json-file
    Cgroup Driver: cgroupfs
    Cgroup Version: 1
    Plugins:
    Volume: local
    Network: bridge host ipvlan macvlan null overlay
    Log: awslogs fluentd gcplogs gelf journald json-file local 			logentries splunk syslog
    Swarm: inactive
    Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
    Default Runtime: runc
    Init Binary: docker-init
    containerd version: 	d2d58213f83a351ca8f528a95fbd145f5654e957
    runc version: v1.1.12-0-g51d5e94
    init version: de40ad0
    Security Options: seccomp
    Profile: default
    Kernel Version: 3.10.0-1160.el7.x86_64
    Operating System: CentOS Linux 7 (Core)
    OSType: linux
    Architecture: x86_64
    CPUs: 2
    Total Memory: 3.682GiB
    Name: simon14
    ID: IMBH:5HKK:JE6W:ILLB:AAJ5:I27X:FVQV:RLVO:VAM6:FNDW:DIUR:4V5K
    Docker Root Dir: /var/lib/docker
    Debug Mode: false
    Registry: https://index.docker.io/v1/
    Labels:
    Experimental: false
    Insecure Registries: 127.0.0.0/8
    Live Restore Enabled: false
    
  7. 解读docker info关键信息

    • Containers:容器总数(运行/暂停/停止)
    • Images:本地镜像数量
    • Server Version:server 版本
    • Storage Driver:存储驱动(默认overlay2,高效)
    • Backing Filesystem: xfs 宿主机上的底层文件系统
    • Cgroup Driver: cgroupfs Cgroups 驱动
    • Kernel Version:宿主机的相关信息
    • Docker Root Dir:Docker数据存储目录(默认/var/lib/docker
    • Registry: https://index.docker.io/v1/ registry 地址
    • Registry Mirrors:镜像加速地址(如阿里云)

二、Docker容器管理

2.1 Docker镜像操作

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

2.1.1 搜索镜像

从Docker Hub搜索镜像,示例:

# 搜索nginx镜像
docker search nginx

搜索结果解读

  • NAME:镜像名称(如nginx为官方镜像,bitnami/nginx为第三方镜像)
  • DESCRIPTION:镜像描述
  • STARS:星级评价(越高越可靠)
  • OFFICIAL:是否为官方镜像([OK]表示官方)

2.1.2 拉取镜像

从仓库下载镜像到本地,示例:

# 拉取最新版nginx(默认标签latest)
docker pull nginx
# 拉取指定版本nginx(如1.25.3)
docker pull nginx:1.25.3

说明:镜像标签(Tag)用于区分版本,latest表示最新版,但生产环境建议使用具体版本(如1.25.3),避免版本迭代导致问题。

2.1.3 镜像加速下载

国内用户直接拉取Docker Hub镜像速度较慢,可配置镜像加速器:

  1. 阿里云加速器(推荐)

    # 创建Docker配置目录
    mkdir -p /etc/docker
    # 写入加速器配置
    tee /etc/docker/daemon.json <<-'EOF'
    {"registry-mirrors": ["https://你的阿里云加速地址.mirror.aliyuncs.com"]
    }
    EOF
    # 重启Docker生效
    systemctl daemon-reload
    systemctl restart docker
    

    (阿里云加速地址需登录阿里云控制台获取,免费)

  2. 华为云加速器

    mkdir -p /etc/docker
    tee /etc/docker/daemon.json <<-'EOF'
    {"registry-mirrors": ["https://0a40cefd360026b40f39c00627fa6f20.mirror.swr.myhuaweicloud.com"]
    }
    EOF
    

配置完加速后,重启docker

systemctl daemon-reload
systemctl restart docker

2.1.4 查看镜像信息

  1. 查看镜像信息

    cat /var/lib/docker/image/overlay2/repositories.json
    

    在这里插入图片描述

  • 作用:查看 Docker 本地镜像的详细信息。/var/lib/docker 是 Docker 存储所有数据的目录,镜像存储在 image 目录下的 overlay2 子目录中。
  1. 查看本地所有镜像
    docker images
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    nginx        latest    41f689c20910   6 weeks ago   192MB
    
    结果解读
    • REPOSITORY:镜像仓库名称
    • TAG:镜像标签
    • IMAGE ID:镜像唯一ID(可用于操作镜像)
    • CREATED:镜像创建时间
    • SIZE:镜像大小
  • 作用:列出所有已经下载到本地的镜像,包括仓库名称、标签、镜像 ID、创建时间和大小等信息。
  1. 查看镜像详细信息
    (如分层结构、环境变量、启动命令)
    # 通过IMAGE ID查看nginx镜像详情
    docker inspect 41f689c20910
    
  • 作用:获取指定镜像(通过镜像 ID)详细信息。此命令返回一个 JSON 格式的详细信息,包括镜像的层次、历史记录、配置、大小等。

2.1.5 为镜像添加标签

为现有镜像添加新标签(便于识别或上传到仓库),示例:

# 为nginx:latest添加标签nginx:web
#格式:docker tag 名称:[标签] 新名称:[新标签]
docker tag nginx:latest nginx:web
# 查看标签是否添加成功
docker images | grep nginx

说明:添加标签不会创建新镜像,只是为同一镜像增加一个“别名”。
在这里插入图片描述

2.1.6 删除镜像

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

# 通过标签删除镜像(仅删除该标签,若有其他标签则镜像不删除)
docker rmi nginx:web
# 通过IMAGE ID删除镜像(彻底删除,需确保无容器依赖)
docker rmi 41f689c20910
# 强制删除镜像(即使有容器依赖,不推荐)
docker rmi -f 41f689c20910

作用:删除指定标签的镜像。注意:如果镜像有多个标签,删除指定标签不会删除镜像本身,只有在没有其他标签和容器依赖的情况下才会彻底删除镜像。如果镜像正在被容器使用,需要先删除容器。
在这里插入图片描述
在这里插入图片描述

2.1.7 导出/导入镜像

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

  1. 导出镜像(将镜像保存为tar文件)

    # 导出nginx:latest为nginx.tar
    docker save -o nginx.tar nginx:latest
    

    作用:将本地镜像 nginx:latest 保存为 tar 包(nginx.tar)。这可以用于镜像备份或迁移。
    在这里插入图片描述

  2. 导入镜像(从tar文件加载镜像)

    # 从nginx.tar导入镜像
    docker load < nginx.tar
    # 或使用-i参数
    docker load -i nginx.tar
    

    作用:从本地 tar 文件中加载镜像。你可以将导出的镜像文件通过此命令重新加载到 Docker 中。
    在这里插入图片描述

2.1.8 上传镜像到仓库

将本地镜像上传到Docker Hub或私有仓库,示例(上传到Docker Hub):

  1. 登录Docker Hub

    docker login
    # 输入用户名和密码(需先在Docker Hub注册账号)
    
  2. 为镜像打标签(格式:仓库地址/用户名/镜像名:标签

    docker tag nginx:latest yourusername/nginx:web
    
  3. 上传镜像

    docker push yourusername/nginx:web
    

说明:若上传到私有仓库(如Harbor),需将标签中的yourusername替换为私有仓库地址(如harbor.example.com/yourproject/nginx:web)。

2.2 Docker容器操作

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

2.2.1 创建容器

创建容器但不启动,示例:

格式:docker create [选项] 镜像
# 创建交互式nginx容器(-i:标准输入,-t:伪终端)
docker create -it --name mynginx nginx:latest /bin/bash

参数说明

  • -i:保持容器标准输入打开
  • -t:为容器分配伪终端(便于交互)
  • --name:指定容器名称(避免自动生成随机名称)

在这里插入图片描述

2.2.2 启动/停止容器

# 启动容器(通过名称或ID)
docker start mynginx
# 停止容器
docker stop mynginx
# 重启容器
docker restart mynginx
# 暂停容器(暂停进程)
docker pause mynginx
# 恢复暂停的容器
docker unpause mynginx

在这里插入图片描述
在这里插入图片描述

2.2.3 查看容器状态

# 查看正在运行的容器
docker ps
# 查看所有容器(运行/暂停/停止)
docker ps -a
# 查看容器简洁信息(仅ID和名称)
docker ps -aq

docker ps -a结果解读

  • CONTAINER ID:容器唯一ID
  • NAME:容器名称
  • STATUS:容器状态(Up运行中,Exited已停止,Paused暂停)
  • PORTS:端口映射(如0.0.0.0:8080->80/tcp表示宿主机8080端口映射到容器80端口)

2.2.4 创建并启动容器(docker run

可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。
注意:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行, 命令结束容器退出。

docker 容器默认会把容器内部第一个进程,也就是 pid=1 的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。

​ 容器的生命周期包括创建、启动、停止、重启、删除等操作。容器会根据其进程的状态自动结束,例如当容器中的 PID=1 的进程退出时,容器也会停止。

docker run centos:7 /usr/bin/bash -c ls /
docker ps -a		#会发现创建了一个新容器并启动执行一条 shell 命令,之后就停止了

在这里插入图片描述

当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:
  • Dockers引擎会在本地查找镜像
  • 本地找到镜像 然后启动镜像
  • 本地没有找到镜像,然后根据Docker引擎配置的仓库地址,远程去查找镜像。
  • 远程查询到镜像,把镜像下载到本地,然后启动镜像
  • 远程查询到镜像,Docker返回错误,提示镜像远程未找到。
  • 运行中的镜像支持:停止、启动、重启、删除(先停止才可以删除)操作

在这里插入图片描述

2.2.5 在后台持续运行 docker run 创建的容器

需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束

docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"
docker ps -a					#可以看出容器始终处于 UP,运行状态
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                       PORTS     NAMES
77c7fa347272   centos:7       "/usr/bin/bash -c 'w…"   26 seconds ago   Up 25 seconds                          goofy_knuth
#创建容器并持续运行容器
docker run -itd --name mycentos centos:7 /bin/bash   

在这里插入图片描述
Docker容器主要有以下7个状态

  • created:已创建,还未运行的容器
  • running:正在运行中的容器
  • restarting:容器正在重启中
  • removing:容器正在迁移中
  • paused:已暂停状态的容器
  • exited:停止状态的容器
  • dead:死亡,主要是操作系统出现异常或者断电关机等有可能引发dead状态,不是很常见。

暂停和停止状态的区别

  • docker pause 命令挂起指定容器中的所有进程
  • docker stop 容器内主进程会在指定时间内被杀死,默认为10s后。

2.2.6 容器交互(进入容器)

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

示例:docker exec -it <container_id> bash,进入容器交互式 shell

  • -i 选项表示让容器的输入保持打开;
  • -t 选项表示让 Docker 分配一个伪终端。
# 进入mycentos容器,启动bash交互
docker exec -it mycentos /bin/bash
ls
# 退出容器(容器继续运行)
exit
docker ps -a

在这里插入图片描述

补充:执行docker run -it centos:7 bash,不加 -d 选项会创建容器后直接进入容器,但是退出容器,容器也会停止

2.2.6 容器文件复制(宿主机↔容器)

面试高频题:如何在宿主机和容器间传输文件?

echo abc123 > ~/test.txt
# 宿主机文件复制到容器(格式:docker cp 宿主机路径 容器名:容器路径)
docker cp ~/test.txt mycentos:/opt/

在这里插入图片描述

# 容器文件复制到宿主机(格式:docker cp 容器名:容器路径 宿主机路径)
docker cp mycentos:/opt/test.txt ~/abc123.txt

在这里插入图片描述

2.2.7 容器导出/导入

用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。

注意:导出的是容器当前状态,导入后变为镜像

  1. 导出容器

    #导出格式:docker export 容器ID/名称 > 文件名
    # 导出mynginx容器为centos7.tar
    docker export mycentos > centos7.tar
    

    在这里插入图片描述

  2. 导入容器(生成镜像)

    #导入格式:cat 文件名 | docker import – 镜像名称:标签
    # 从centos7.tar导入为镜像centos7:test
    cat centos7.tar | docker import - centos7:test
    

    在这里插入图片描述

区别docker save/load操作镜像,docker export/import操作容器(导入后失去镜像历史层)。

2.2.8 删除容器

格式:docker rm [-f] 容器ID/名称

# 删除已停止的容器
docker stop 9b0247bdac6e
docker rm 9b0247bdac6e
# 强制删除运行中的容器
docker rm -f 9b0247bdac6e

在这里插入图片描述

# 批量停止容器
docker ps -a | awk 'NR>=2{print $1}'| xargs docker stop
docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash			
# 批量删除所有容器
docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm
docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash	

在这里插入图片描述
在这里插入图片描述

# 批量删除镜像
docker images | awk 'NR>=2{print $3}'|xargs docker rmi
docker images | awk 'NR>=2{print "docker rmi "$3}'| bash	
# 删除none镜像		
docker images | grep none | awk '{print $3}' | xargs docker rmi	

在这里插入图片描述

# 批量清理后台停止的容器
docker rm $(docker ps -a -q)		

在这里插入图片描述

三、Docker网络管理(重点)

Docker网络是容器通信的核心,理解网络模式是实现容器间、容器与外部通信的关键。

3.1 Docker网络实现原理

Docker通过Docker容器网桥(docker0)实现容器网络:

  1. Docker启动时在宿主机虚拟一个Docker容器网桥docker0(默认IP:172.17.0.1)
  2. 每个容器启动时,分配一个Container-IP(如172.17.0.2),并且Docker网桥是每个容器的默认网关
  3. 因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信
  4. Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的
  5. 外部网络通过端口映射-p参数)访问容器(如宿主机IP:8080 → 容器IP:80),访问容器的时候就通过[宿主机IP]:[容器端口]访问容器
#随机映射端口(从32768开始)
docker run -d --name test1 -P nginx					

在这里插入图片描述

docker run -d --name test2 -p 43000:80 nginx		#指定映射端口
docker ps -a

在这里插入图片描述
可以通过http://192.168.10.14:43000、http://192.168.10.14:49153

#查看容器的输出和日志信息
docker logs 容器的ID/名称

在这里插入图片描述

3.2 Docker的5种网络模式

Docker支持5种网络模式,通过--net参数指定,默认使用bridge模式。

3.2.1 Host模式(--net=host

  • 原理:容器使用宿主机的IP和端口,不创建独立Network Namespace
  • 特点:容器使用宿主机IP和端口,无端口映射,性能最高
  • 适用场景:需要高性能网络的应用(如数据库)
  • 示例
    docker run -d --net=host --name mynginx nginx:latest
    
  • 注意:容器端口可能与宿主机端口冲突,需避免。

3.2.2 Container模式(--net=container:容器名

  • 原理:新容器共享已有容器的Network Namespace(IP、端口、路由相同)

  • 特点:两个容器网络完全共享,其他资源(文件系统、进程)隔离,两个容器的进程可以通过lo网卡设备通信

  • 适用场景:需共享网络的多容器应用(如Sidecar模式)

  • 示例

    # 创建基础容器test1
    docker run -itd --name test1 centos:7 /bin/bash
    #查看容器进程号
    docker inspect -f '{{.State.Pid}}' test1
    1753
    ##查看容器的进程、网络、文件系统等命名空间编号
    ls -l /proc/1753/ns
    

    在这里插入图片描述

    # 创建test2共享test1网络
    docker run -itd --name test2 --net=container:test1 centos:7 /bin/bash
    docker inspect -f '{{.State.Pid}}' test2
    1844
    #查看可以发现两个容器的 net namespace 编号相同
    ls -l /proc/1844/ns
    

    在这里插入图片描述

3.2.3 None模式(--net=none

  • 原理:容器有独立Network Namespace,但无任何网络配置(仅lo回环接口)
  • 特点:无法联网,完全隔离
  • 适用场景:需极高安全性的应用(如处理敏感数据,仅内部进程通信)
  • 示例
    docker run -itd --net=none --name mynginx nginx:latest
    

3.2.4 Bridge模式(默认,--net=bridge

Docker 默认使用 bridge 网络模式,无需额外指定 --net 参数即可启用。

该模式类似于 VMware 的 NAT 模式,容器拥有独立的 network namespace 并通过 docker0 虚拟网卡连接。具体实现方式是通过 docker0 网桥和 iptables nat 表实现与宿主机的通信,每个容器都会获得独立的 Network Namespace 和 IP 地址,并连接到主机的虚拟网桥。

实现原理如下:

  1. Docker 服务启动时会在主机创建 docker0 虚拟网桥,所有容器都会自动连接到该网桥。其工作原理类似物理交换机,使主机上的容器处于同一个二层网络中。

  2. 系统会从 docker0 子网中为容器分配 IP 地址,并将 docker0 的 IP 设为容器默认网关。同时创建一对 veth pair 虚拟网卡设备,这种设备总是成对出现构成数据通道,用于连接网络设备。

  3. Docker 将 veth pair 的一端分配给容器作为 eth0 网卡,另一端命名后加入 docker0 网桥,可通过 brctl show 命令查看。

  4. 使用 docker run -p 时,Docker 会在 iptables 中自动配置 DNAT 规则实现端口转发,可通过 iptables -t nat -vnL 命令查看具体规则。

3.2.5 自定义网络模式

默认bridge模式不支持指定容器IP,自定义网络可解决此问题,支持三种驱动:

  1. bridge:自定义网桥,功能比默认docker0更强大(如自动DNS解析容器名称)
  2. overlay:跨主机网络,用于Docker Swarm集群
  3. macvlan:容器直接使用宿主机物理网卡MAC地址,模拟物理设备

自定义bridge网络示例

# 创建自定义网络(子网172.18.0.0/16,网卡名docker1)
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
- docker1 为执行 ifconfig -a 命令时,显示的网卡名,如果不使用 --opt 参数指定此名称,那你在使用 ifconfig -a 命令查看网络信息时,看到的是类似 br-110eb56a0b22 这样的名字
- mynetwork 为执行 docker network list 命令时,显示的bridge网络模式名称。
# 启动容器并指定IP(172.18.0.10)
docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash

优势:容器可通过名称相互通信(如ping test4),无需依赖IP。

3.5.6 网络模式总结

  1. 桥接模式(bridge)
    • 默认的网络模式,容器通过虚拟网桥与宿主机和其他容器通信。
  2. 主机模式(host)
    • 容器共享宿主机的网络栈,直接使用宿主机的 IP 地址。
  3. 容器模式(container)
    • 容器共享另一个容器的网络栈,两个容器可以使用相同的 IP 地址进行通信。
  4. 无网络模式(none)
    • 容器没有网络配置,只有回环接口(lo)。
  5. 自定义网路:定义网络允许用户自定义容器的网络范围、子网和路由,从而提供更高的网络控制和隔离性。

额外附加:

  1. Overlay:这是Docker Swarm模式的网络,主要用于在多个主机上创建一个分布式网络。容器间即便在不同的主机也能完成通信,相当于在跨主机的容器之间创建了一个覆盖网络。
  2. Macvlan:Macvlan模式可以让容器直接连接到主机的物理网络,每个Macvlan接口都有一个唯一的MAC地址,此模式使得容器看起来就像是网络上的物理设备。

总结

本文从Docker的发展背景、核心概念入手,逐步深入到镜像管理、容器操作、网络配置等实战内容,覆盖了Docker从入门到进阶的关键知识点。

Docker的核心价值在于“标准化”和“高效性”,它不仅解决了环境一致性问题,还为DevOps和云原生架构提供了基础。学习Docker的关键在于“理论+实践”:

  1. 理解Namespace、Cgroup、写时复制等核心原理,知其然更知其所以然
  2. 熟练掌握镜像和容器的常用命令,尤其是docker rundocker exec、端口映射等高频操作
  3. 根据业务场景选择合适的网络模式,如 Host 模式用于高性能场景,自定义网络用于固定 IP 需求
http://www.dtcms.com/a/409831.html

相关文章:

  • python(44) : docker compose基于基础镜像部署python服务
  • VMware+RockyLinux+ikuai+docker+cri-docker+k8s+calico BGP网络 自用 实践笔记(四)
  • 深入理解 Docker:从入门到实践
  • 实战排查:Java 解析 Excel 大型 导致内存溢出问题的完整解决过程
  • 【实录】使用 Verdaccio 从零搭建私有 npm 仓库(含完整步骤及避坑指南)
  • 物联网人体红外检测系统详解
  • 关于Unix Domain Socket的使用入门
  • 机器视觉系统中工业相机的常见类型及其特点、应用
  • RTT操作系统(4)
  • 基于卷积神经网络的 CIFAR-10 图像分类实验报告
  • 微服务项目->在线oj系统(Java-Spring)----[前端]
  • 做网站撘框架小米手机如何做游戏视频网站
  • 如何建自己网站做淘宝客黄骅港吧
  • 交叉口内CAV调度:轨迹优化与目标速度规划,助力智能交通无缝运行!
  • Navicat 技术指引 | KingbaseES 专用 AI 助手
  • 如何优化Android app耗电量
  • 面试复习题---Flutter 资深专家
  • 在 C# 中将邮件转换为 PDF | MSG 转 PDF | EML 转 PDF
  • 【LangChain4j+Redis】会话记忆功能实现
  • Android Handler的runWithScissors方法
  • 180课时吃透Go语言游戏后端开发3:Go语言中其他常用的数据类型
  • 在 Android 11 上实现 WiFi 热点并发支持(同时开启 STA + AP 模式)
  • 济南高新区网站建设wordpress举报插件
  • html 占位符
  • GPT-5 Codex正式上线 Azure AI Foundry(国际版)
  • C++设计模式之结构型模式:享元模式(Flyweight)
  • STM32 智能垃圾桶项目笔记(一):超声波模块(HC-SR04)原理与驱动实现
  • 全文 -- Vortex: Extending the RISC-V ISA for GPGPU and 3D-Graphics Research
  • 设计网站推荐理由公司网站备案电话
  • 事件驱动与CDS:基于FHIR R5 Subscriptions与Bulk Data的再考察(下)