Docker入门学习资料

117 阅读26分钟

Docker入门学习资料

Docker简介与核心优势

Docker是一款开源的容器化平台,用于构建、打包、部署和运行应用程序,其核心理念是“一次构建,到处运行”。它通过将应用程序及其依赖项封装到标准化单元(容器)中,实现了跨环境的一致性部署,彻底改变了传统应用交付方式,成为现代云原生应用开发和运维的基石。Docker的核心概念包括镜像、容器和仓库:镜像是包含应用程序运行所需代码、运行时、库、环境变量和配置文件的只读模板;容器是镜像的可运行实例,作为独立的执行单元,可被启动、停止、删除或暂停;仓库则是用于存储和分发镜像的场所,如Docker Hub作为主流的公共仓库,支持存储超过1400万个容器镜像,月下载量达110亿次,同时提供私有仓库保障敏感内容安全。

与传统虚拟机技术相比,Docker容器具有显著优势,具体对比如下:

项目虚拟机Docker 容器
启动速度分钟级毫秒级
系统资源占用高(GB级)低(MB级)
部署复杂度
环境一致性较低

此外,Docker的核心优势还体现在:环境一致性保障,通过镜像打包解决“在我机器上能跑”的跨环境差异问题;资源利用率提升,性能损耗低于5%,远优于虚拟机15-20%的损耗;秒级启动与停止能力,支持快速扩缩容;作为微服务架构的理想载体,允许每个服务独立部署在容器中并通过网络通信;深度集成CI/CD流水线,实现代码提交到生产部署的自动化流程;跨平台兼容性,支持从本地开发环境(Mac/Windows/Linux)到云服务器(AWS/阿里云等)再到边缘设备(树莓派等ARM设备)的全场景运行;标准化运维管理,提供docker ps查看容器状态、docker logs收集日志、docker stats监控资源等统一操作接口;快速回滚与版本控制,通过镜像版本标签(如myapp:v1)实现部署版本的灵活切换;以及丰富的生态系统,集成Docker Compose、Kubernetes、Harbor等工具链。

2025年Docker技术持续演进,带来多项重要更新。Docker Desktop 4.42版本于6月发布,新增原生IPv6支持(双堆栈、仅IPv4/IPv6模式可选)及智能DNS解析,增强企业网络适应性;集成MCP工具包,支持在隔离容器中管理超过100个MCP服务器(如GitHub、MongoDB),并提供docker mcp list等CLI命令;AI助手Gordon与Model Runner工具集成,支持GGUF格式AI模型打包为OCI镜像及分发管理。Docker Engine v28.1.0(4月发布)引入docker bake命令简化多目标构建,支持查询多平台镜像信息,修复镜像加载、网络端口映射等问题,API升级至v1.49并支持Debian "Trixie"、Ubuntu 25.04等最新发行版。v28.2.2版本则聚焦核心稳定性优化,修复containerd镜像存储缺陷及iptables规则管理问题,提升镜像构建成功率与网络链路灵活性,进一步巩固Docker在容器化领域的技术领先地位。

Docker环境安装与配置

Docker支持在Linux(CentOS、Ubuntu等)、Windows及macOS等主流操作系统上运行,硬件推荐至少2GB RAM,建议4GB及以上以确保流畅体验。以下按“系统分类-步骤拆解-验证与优化”结构详细说明安装配置流程。

一、系统分类与安装步骤

(一)Linux系统
1. CentOS
  1. 移除旧版本(若存在)
    sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
    [来源:"blog.csdn.net/qq_44623314…", "juejin.cn/post/744856…"]

  2. 安装依赖包
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    [来源:阿里云镜像加速教程]

  3. 配置YUM源

    • 官方源:sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    • 阿里云源(推荐国内用户):sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo,并执行sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo修改配置
      [来源:"juejin.cn/post/739693…"]
  4. 安装Docker Engine
    sudo yum install -y docker-ce docker-ce-cli containerd.io(安装最新稳定版)
    [来源:Docker官网文档]

  5. 启动服务并设置开机自启
    sudo systemctl start docker
    sudo systemctl enable docker
    [来源:Docker官网文档]

2. Ubuntu
  1. 更新系统包索引
    sudo apt-get update
    [来源:"blog.csdn.net/callback_CS…"]

  2. 安装依赖包
    sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
    [来源:"blog.csdn.net/callback_CS…"]

  3. 添加Docker官方GPG密钥
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    [来源:"blog.csdn.net/callback_CS…"]

  4. 配置APT仓库
    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    [来源:"blog.csdn.net/callback_CS…"]

  5. 安装Docker Engine
    sudo apt-get install -y docker-ce docker-ce-cli containerd.io
    [来源:"blog.csdn.net/qq_45704789…"]

(二)Windows系统
  1. 启用Hyper-V功能
    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
    [来源:"blog.csdn.net/qq_45704789…"]

  2. 安装Docker包管理器
    Install-Module DockerMsftProvider -Force
    [来源:"blog.csdn.net/qq_45704789…"]

  3. 安装Docker
    Install-Package Docker -ProviderName DockerMsftProvider
    [来源:"blog.csdn.net/qq_45704789…"]

(三)macOS系统

通过Homebrew安装Docker Desktop:
brew install --cask docker
[来源:"blog.csdn.net/qq_45704789…"]

二、安装验证

(一)基础验证命令
  1. 版本检查:执行docker --versiondocker -v,输出类似Docker version 26.0.0, build 1d4ffaaa,表示Docker客户端已正确安装[1][2]。

  2. 系统信息查看:执行docker info,输出包含Docker引擎版本、镜像仓库配置、容器运行时等信息,验证服务状态正常[1]。

(二)核心功能验证:docker run hello-world

执行docker run hello-world,若输出以下内容,表明Docker环境配置成功:

Docker核心命令详解

镜像管理命令

下载镜像(docker pull)

命令功能:从镜像仓库下载指定镜像到本地。
语法格式docker pull [选项] 镜像名[:标签]
参数说明

  • :tag:指定镜像版本标签,默认使用 latest(最新版)。标签需与仓库中存在的版本匹配,否则下载失败。
    实战示例
    下载 Ubuntu 22.04 版本镜像:docker pull ubuntu:22.04。若不指定标签,默认执行 docker pull ubuntu:latest 下载最新版。
构建镜像(docker build)

命令功能:基于 Dockerfile 构建自定义镜像,支持灵活配置输出格式。
语法格式docker build [选项] 上下文路径
参数说明

  • --build-arg:传递构建时参数,用于动态配置 Dockerfile 中的变量(如环境变量、版本号)。
  • --output(或 -o):指定构建输出格式,可将结果导出为文件而非镜像(2025 版增强功能)。
  • --tag(或 -t):为构建的镜像指定名称和标签,格式为 镜像名[:标签]
    实战示例
  1. 传递构建参数并打标签:docker build --build-arg VERSION=1.0 -t my-app:v1.0 .,通过 --build-arg 传入版本号 1.0,生成标签为 v1.0 的镜像 my-app
  2. 导出构建结果到本地目录:docker build --output=. .,将构建容器内的文件系统导出到当前工作目录,而非生成镜像[3]。
查看本地镜像(docker images)

命令功能:列出本地已下载或构建的所有镜像基本信息。
语法格式docker images [选项]
参数说明:无核心参数,默认显示所有镜像的仓库名(REPOSITORY)、标签(TAG)、镜像 ID(IMAGE ID)、创建时间(CREATED)和大小(SIZE)。
实战示例
查看本地所有镜像:docker images,输出结果包含上述信息,便于确认镜像版本和占用空间。

镜像打标签(docker tag)

命令功能:为本地镜像添加新标签,常用于标记仓库路径(如 Docker Hub 用户名/仓库名)以便推送。
语法格式docker tag 源镜像名[:标签] 目标镜像名[:新标签]
参数说明

  • 目标镜像名需符合仓库命名规范(如 Docker Hub 格式为 docker.io/用户名/镜像名),否则无法推送至远程仓库。
    实战示例
    为本地镜像 my-python-app:latest 打标签,准备推送至 Docker Hub:docker tag my-python-app:latest username/my-python-app:v1.0,其中 username 为 Docker Hub 用户名,v1.0 为版本标签。
推送镜像(docker push)

命令功能:将本地镜像上传至远程仓库(如 Docker Hub、私有 Harbor),供其他环境拉取使用。
语法格式docker push [选项] 镜像名[:标签]
参数说明

  • 推送前需通过 docker login 登录目标仓库,否则无权限操作。
  • 镜像名必须包含仓库地址(如 Docker Hub 可省略默认地址 docker.io)和用户名,与 docker tag 步骤的目标镜像名一致。
    实战示例
    推送标签为 v1.0 的镜像至 Docker Hub:docker push username/my-python-app:v1.0。推送成功后,其他用户可通过 docker pull username/my-python-app:v1.0 拉取该镜像。
保存镜像(docker save)

命令功能:将本地镜像打包为文件(通常为 .tar 格式),用于离线传输或备份。
语法格式docker save [选项] -o 输出文件 镜像名[:标签]
参数说明

  • -o:指定输出文件名,必须显式设置,否则命令失败。
    实战示例
    ubuntu:22.04 镜像保存为本地文件 ubuntu-22.04.tardocker save -o ubuntu-22.04.tar ubuntu:22.04。文件可通过 docker load -i ubuntu-22.04.tar 恢复为镜像。
删除镜像(docker rmi)

命令功能:删除本地无用或冗余镜像,释放磁盘空间。
语法格式docker rmi [选项] 镜像名[:标签]|镜像ID
参数说明

  • -f:强制删除正在被容器使用的镜像(不建议,可能导致容器异常)。
  • 批量删除:通过 $(docker images -q) 获取所有镜像 ID,组合为 docker rmi $(docker images -q) 批量删除(高危操作)。
    高危警告
    批量删除命令 docker rmi $(docker images -q) 会删除本地所有镜像,包括正在使用或重要的镜像,操作前必须通过 docker images 确认镜像列表,建议添加过滤条件(如 docker rmi $(docker images -q --filter "dangling=true") 仅删除虚悬镜像)。
    实战示例
  1. 删除单个镜像:docker rmi ubuntu:22.04(需确保无容器依赖该镜像)。
  2. 批量删除虚悬镜像(标签为 \<none> 的镜像):docker rmi $(docker images -q --filter "dangling=true")
多平台构建(docker bake,2025 版新命令)

命令功能:一次性构建适配多个硬件平台(如 amd64、arm64、ppc64le)的镜像,简化跨平台分发流程(2025 版核心更新)。
核心优势
传统构建需为每个平台单独配置环境,而 docker bake 通过 HCL/JSON 配置文件定义多平台参数,自动调用 Buildx 后端并行构建,输出包含多平台架构的“清单列表镜像”,用户拉取时自动匹配本地平台,无需手动指定架构标签。
实战示例
创建 bake.hcl 配置文件定义多平台构建规则:

容器生命周期命令

容器的生命周期可划分为创建-运行、管理、销毁三个核心阶段,每个阶段对应特定的操作命令。以下按生命周期阶段排序,详细介绍各命令的语法、参数、示例及注意事项,并通过“问题-解决”形式增强实用性。

一、创建与运行阶段:docker run

功能:创建并启动容器,是容器生命周期的起点。
语法docker run [选项] \<镜像名> [命令]

核心参数说明
参数作用描述
--name指定容器名称(如不指定,Docker将自动生成随机名称),需保证唯一性。
-d后台运行容器(守护进程模式),容器启动后返回容器ID至终端。
-it以交互式终端运行容器(-i保持标准输入打开,-t分配伪终端),适用于需手动操作的场景。
-p端口映射,格式为“主机端口:容器端口”,如-p hostPort:containerPort
-v数据卷挂载,格式为“主机路径:容器路径[:权限]”,实现宿主机与容器的目录共享。
示例
  1. 后台运行容器(生产环境常用)
    创建名为user-service的容器,基于user:1.0镜像后台运行:

网络与数据卷命令

网络管理

Docker网络是容器间通信及容器与外部网络交互的基础,其核心模式包括bridge(默认)、host(性能优先)和overlay(跨主机),适用场景及特性如下表所示:

网络模式核心特点适用场景
bridge默认模式,通过docker0网桥实现容器间通信,支持端口映射,隔离性较好单机环境下多容器协同工作(如Web服务与数据库)
host容器直接使用主机网络栈,无需网络地址转换(NAT),性能最优但隔离性弱对网络性能要求极高的场景(如高并发API服务)
overlay基于VXLAN技术实现跨主机容器通信,支持Swarm或Kubernetes集群环境分布式系统跨主机容器通信(如微服务集群)

自定义网络管理是优化容器通信的重要手段。通过创建自定义bridge网络可避免默认bridge网络的端口冲突问题,命令示例如下:

  • 创建自定义bridge网络:docker network create --driver bridge my-network
  • 容器连接至自定义网络:docker run -d --name app-container --network my-network my-image
    此时,同一网络内的容器可通过容器名称直接通信,无需依赖IP地址,提升配置灵活性。
数据持久化

容器默认数据存储具有临时性,一旦容器销毁,内部数据将丢失。数据持久化通过数据卷(Volume)绑定挂载(Bind Mount) 实现,二者技术差异及应用场景如下:

持久化方式技术特性适用场景
Volume由Docker引擎统一管理,存储路径独立于主机文件系统(通常位于/var/lib/docker/volumes/),生命周期与容器解耦生产环境关键数据持久化(如数据库、用户文件)
绑定挂载直接将主机目录或文件挂载至容器,依赖主机路径,Docker不管理挂载源开发环境代码实时同步(如挂载本地项目目录)

命令示例

  • 数据卷操作:创建卷 docker volume create my-volume;挂载卷至容器 docker run -d --name my-container -v my-volume:/data my-image [4]。
  • 绑定挂载操作:docker run -d --name my-container -v /host/path:/container/path my-image [4]。

实战案例:电商项目中MySQL数据库的数据持久化。使用数据卷挂载数据库存储目录,命令如下:
docker run -d --name mysql-ecommerce -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=securepass mysql:8.0
其中,mysql-data为数据卷,确保数据库文件(如用户交易记录、商品信息)独立于容器生命周期,即使容器重启或重建,数据仍可完整恢复,有效避免业务数据丢失。

数据持久化的重要性:容器化部署中,数据持久化是保障业务连续性的核心。通过Volume或绑定挂载,可确保关键数据(如用户信息、交易日志)长期保存,是生产环境部署的必备配置。

Dockerfile实战指南

基础指令

Dockerfile基础指令是构建镜像的核心,以下为常用指令的语法、区别及示例。

FROM
语法:FROM \<image>[:tag] [AS \<stage>]
作用:指定基础镜像,可通过AS \<stage>命名构建阶段以便多阶段构建时引用。
示例:FROM node:18-alpine(使用Node.js 18 Alpine镜像作为基础);FROM rust:alpine as build(指定构建阶段镜像并命名为build)[3].

COPY
语法:COPY [--from=\<stage>] \<src>... \<dest>
作用:复制本地文件或目录到镜像中,--from=\<stage>可从其他构建阶段复制文件。
与ADD的区别:COPY仅支持本地文件/目录复制,功能明确;ADD除复制外,还支持解压本地压缩文件(如.tar.gz)、下载URL资源,建议优先使用COPY以保持构建过程的可预测性。
示例:COPY package*.json ./(复制当前目录下所有package.json和package-lock.json到镜像工作目录);COPY --from=build /bin/hello /(从build阶段复制二进制文件到最终镜像根目录)[3].

RUN
语法:RUN \<command>
作用:在镜像构建过程中执行命令,常用于安装依赖、编译代码等。
示例:RUN npm install(安装Node.js依赖);RUN rustc -o /bin/hello hello.rs(编译Rust源文件生成二进制文件)[3].

ENTRYPOINT
语法:ENTRYPOINT [[5](executable)][[6](param1)][[7](param2)](exec形式,推荐)或ENTRYPOINT command param1 param2(shell形式)
作用:设置容器启动时执行的命令,不可被docker run命令行参数覆盖,常用于固定容器主程序。
示例:ENTRYPOINT [[8](/hello)](容器启动时执行/hello二进制文件)[3].

进阶技巧

多阶段构建减少镜像体积

多阶段构建通过分离构建环境与运行环境,仅保留运行所需文件,显著减小镜像体积。典型流程为“编译阶段生成产物→运行阶段仅复制产物”。
示例(Rust应用):

  1. 构建阶段:使用rust:alpine镜像编译代码,FROM rust:alpine as build;内联创建源文件COPY \<\<EOT hello.rs;执行编译RUN rustc -o /bin/hello hello.rs,生成二进制文件[3].
  2. 运行阶段:使用scratch空镜像(无操作系统层),FROM scratch;从构建阶段复制产物COPY --from=build /bin/hello /;设置启动命令ENTRYPOINT [[8](/hello)]。最终镜像仅包含单个二进制文件,体积极小[3].
合理排序指令利用缓存

Docker构建时会缓存已执行指令的结果,若指令未变化,直接使用缓存加速构建。优化策略为:将不变文件(如依赖配置)优先复制,变化文件(如源代码)后置
示例:Node.js应用中,先复制package*.json(依赖配置,变更频率低),执行npm install(依赖安装,利用缓存);再复制源代码(变更频率高),避免依赖未变时重复安装。

实战案例:Node.js应用Dockerfile

以下为完整Node.js应用Dockerfile,标注每步作用以说明构建流程:

Docker Compose多容器编排

基础概念与安装

Docker Compose是用于定义和运行多容器Docker应用程序的工具,其核心功能是通过单个YAML文件统一管理多容器应用的服务、网络和卷,支持应用在生产、开发、测试及持续集成等环境中的全生命周期管理,包括启动、停止、重建服务,查看运行状态,日志流监控以及执行一次性命令等操作[9][10][11][12][13]。该工具能够简化多容器应用的部署流程,用户无需手动逐个配置和启动容器,而是通过配置文件集中定义服务间的依赖关系并实现一键式部署与运行。

安装Docker Compose的方式因操作系统而异。在Linux系统中,用户通常需要手动安装,例如在CentOS环境下可通过安装docker-compose-plugin获取Compose支持[14][15]。而对于安装了Docker Desktop(适用于Windows和macOS)的用户,Compose功能会自动集成,无需额外执行安装步骤。为确保安装的版本兼容性和安全性,具体操作建议参考Docker官方文档获取最新指导[12][13]。

Docker Compose v2与v1在命令使用上存在显著差异,用户需特别注意版本迁移时的命令适配。传统v1版本采用docker-compose [options] command的独立命令形式,而v2版本已整合至Docker CLI,命令格式变更为docker compose [options] command[11][16]。v2版本支持通过-f选项指定自定义配置文件路径、-p选项设置项目名称等全局参数,进一步增强了命令的灵活性和与Docker生态的一致性。

2025年6月6日发布的Docker Compose v2.37.0版本默认启用了Bake构建引擎,该引擎通过支持并行构建和多目标构建显著提升了镜像构建效率[17]。并行构建可同时处理多个镜像构建任务,减少等待时间;多目标构建则允许根据不同场景需求生成差异化配置的镜像。这一改进为后续.compose.yml文件的编写和命令使用奠定了高效基础,尤其适用于复杂应用的构建流程优化。

docker-compose.yml配置文件

核心字段

docker-compose.yml是定义多容器应用配置的YAML文件,核心字段包括servicesnetworksvolumes等,具体定义可参考官方文档“Compose file reference”[12].

  • version:指定Compose文件格式版本(如'3.8'),需与Docker引擎版本兼容。
  • services:核心字段,定义应用中的各个服务(如Web服务、数据库服务),每个服务对应一个容器实例。
  • services.[service_name].image:指定服务使用的镜像名称(如nginx:alpinemysql:8.0)。
  • services.[service_name].ports:定义端口映射,格式为“主机端口:容器端口”(如"80:80"表示主机80端口映射到容器80端口)。
  • services.[service_name].volumes:定义数据挂载,支持宿主机路径(如./nginx/conf.d:/etc/nginx/conf.d)或命名卷(如mysql-data:/var/lib/mysql)。
  • services.[service_name].depends_on:定义服务依赖关系,取值为服务名称列表(如[[18](mysql)]),用于控制启动顺序。
  • networks:定义服务间通信的网络,实现容器隔离与连接。
  • volumes:定义命名数据卷,用于持久化服务数据,避免容器重启后数据丢失。
示例解析

以下是Nginx+MySQL多容器应用的完整docker-compose.yml示例,包含缩进规范(YAML语法要求)及关键配置注释:

常用compose命令

Docker Compose命令可按生命周期管理-日常运维-高级操作三大维度分类,其设计旨在简化多容器应用的全流程管理。以下结合核心命令功能、关键参数及实际应用场景展开说明。

一、生命周期管理命令

此类命令聚焦容器的创建、启动、停止与销毁,是多容器应用部署的基础操作。

命令参数功能描述使用示例
docker compose up-d, --detach后台运行容器docker compose up -d
--build启动前强制重建镜像docker compose up --build
--force-recreate强制重新创建容器docker compose up --force-recreate
docker compose down--volumes删除关联的命名数据卷docker compose down --volumes
--rmi \<类型>删除服务镜像(all/local)docker compose down --rmi all
docker compose start-启动已停止的容器docker compose start web
docker compose stop-停止运行中的容器docker compose stop db
docker compose restart-重启服务容器docker compose restart redis

1. 启动服务:docker compose up
功能:构建、创建并启动所有服务容器,若配置文件或镜像变更,会自动重建相关容器。
关键参数:

  • -d, --detach:后台运行容器,不阻塞终端输出,适用于生产环境持续运行[19][20]。
  • --build:启动前强制重建服务镜像,确保使用最新代码或依赖[19][21]。
  • --force-recreate:忽略容器状态,强制重新创建所有服务容器,常用于配置更新后完全刷新环境[19]。
    示例:docker compose up -d --build(后台启动并构建所有服务)。

2. 停止与销毁:docker compose down
功能:停止并删除所有服务容器、网络,默认保留数据卷和镜像。
关键参数:

  • --volumes:删除与服务关联的命名数据卷,需谨慎使用,可能导致数据永久丢失[19][22]。
  • --rmi \<类型>:删除服务镜像,all表示删除所有关联镜像,local仅删除本地构建镜像[19]。
    示例:docker compose down --volumes(停止服务并删除数据卷)。

3. 启停控制:start/stop/restart

  • docker compose start [SERVICE...]:启动已停止的服务容器(需先通过up创建)[20][22]。
  • docker compose stop [SERVICE...]:停止运行中的容器,但不删除容器或数据卷,可通过start恢复[20]。
  • docker compose restart [SERVICE...]:重启服务容器,适用于配置更新后无需重建的场景[22]。
二、日常运维命令

此类命令用于监控容器状态、调试服务及执行临时操作,支撑应用的日常管理。

命令参数功能描述使用示例
docker compose logs-f, --follow实时跟踪日志输出docker compose logs -f
--tail \<行数>限制输出日志行数docker compose logs --tail 100
docker compose ps-查看服务容器状态docker compose ps
docker compose exec-u \<用户>指定执行用户docker compose exec -u root db sh

1. 日志查看:docker compose logs
功能:聚合输出指定服务的容器日志,支持实时跟踪与历史日志筛选。
关键参数:

  • -f, --follow:实时跟踪日志输出,类似tail -f[20][23]。
  • --tail \<行数>:限制输出日志行数,如--tail 200仅显示最近200行[19][22]。
    示例:docker compose logs -f --tail 100 web(实时查看web服务最近100行日志)。

2. 状态监控:docker compose ps
功能:查看当前项目中所有服务的容器状态,包括容器ID、状态、端口映射等信息[20][22]。
示例:docker compose ps(列出全部服务状态);docker compose ps db(仅查看db服务状态)。

3. 容器执行:docker compose exec
功能:在运行中的服务容器内执行命令,常用于调试或临时操作。
docker exec的核心区别:

  • docker compose exec基于服务名定位容器,无需记忆自动生成的容器名,如docker compose exec web sh(直接指定web服务)[22][24]。
  • docker exec需指定容器名/ID,如docker exec myapp_web_1 sh(容器名通常为“项目名_服务名_序号”)。
    示例:docker compose exec -u root db mysql -u root -p(以root用户在db服务容器中执行MySQL登录)。
三、高级操作命令

此类命令聚焦镜像构建、服务扩展、环境配置等复杂场景,支撑应用的定制化与规模化管理。

命令参数功能描述使用示例
docker compose build--no-cache禁用构建缓存docker compose build --no-cache
--pull拉取最新基础镜像docker compose build --pull
docker compose up--scale \<服务名>=\<数量>扩展服务实例数量docker compose up --scale web=3
docker compose config-q, --quiet仅验证配置格式docker compose config -q
--env-file指定环境变量文件docker compose --env-file .env.prod config

1. 镜像构建:docker compose build
功能:单独构建或重建服务镜像,支持精细化控制构建过程。
关键参数:

  • --no-cache:禁用构建缓存,确保依赖包完全更新[19][24]。
  • --pull:强制拉取基础镜像的最新版本,避免使用本地旧镜像[19]。
    示例:docker compose build --no-cache --pull web(无缓存构建web服务镜像并拉取最新基础镜像)。

2. 服务扩展:docker compose up --scale
功能:动态调整服务的容器实例数量,实现横向扩展。
示例:docker compose up -d --scale web=3(后台启动3个web服务实例,需确保服务支持无状态部署)[20][22]。

3. 配置验证:docker compose config
功能:验证Compose配置文件的语法正确性,并输出解析后的配置内容。
关键参数:

  • -q, --quiet:仅验证格式,不输出配置详情,适合CI/CD流程中的自动化检查[20]。
  • --env-file:指定替代环境文件,覆盖默认.env[19][25]。
    示例:docker compose --env-file .env.prod config -q(使用生产环境变量文件验证配置)。
四、电商项目实战示例

以典型电商项目(包含web前端、api服务、mysql数据库、redis缓存、rabbitmq消息队列)为例,通过Compose命令实现“一键启动所有服务”:

实战案例:多容器应用部署

案例场景

本案例以"Web应用+MySQL数据库"的经典多容器架构为例,模拟用户注册系统的后端服务部署。场景中包含两个核心容器:Node.js编写的Web服务(处理HTTP请求、业务逻辑)和MySQL数据库(存储用户数据)。两者通过Docker网络实现跨容器通信,Web服务依赖MySQL提供数据持久化能力,体现多容器应用的服务解耦与协作模式。该场景可延伸至微服务架构中的基础组件部署,如摘要中提及的"用户服务、订单服务、支付服务独立容器"的通信逻辑[9]。

配置文件(compose.yml)

以下是完整的compose.yml配置文件,包含Web服务与MySQL服务的协同部署配置:

常见问题与最佳实践

常见问题(FAQ)

1. 国内环境镜像下载缓慢或失败

问题现象:在国内网络环境中,使用Docker官方镜像源拉取镜像时,出现下载速度缓慢、超时或失败的情况。
原因分析:Docker官方镜像源服务器位于国外,国内网络访问存在链路延迟高、带宽受限等问题,导致镜像拉取效率低下或失败。
解决方法:配置国内第三方镜像源加速下载,如docker.m.daocloud.io。具体操作步骤为:编辑Docker配置文件(通常为/etc/docker/daemon.json),添加{"registry-mirrors": [[26](https://docker.m.daocloud.io)]},然后重启Docker服务(systemctl restart docker)。
排查命令

  • 使用docker info查看当前配置的镜像源列表,确认第三方镜像源是否已生效;
  • 通过docker pull hello-world测试镜像拉取速度,验证配置效果。
2. Docker Compose依赖服务未自动重启

问题现象:在使用Docker Compose管理多服务应用时,当依赖服务的镜像重建后,相关依赖服务未自动重启,导致应用仍使用旧版本镜像运行,出现功能不一致或错误。
原因分析:Docker Compose旧版本(如v2.37.0之前)未实现依赖服务镜像更新后的自动重启逻辑,无法感知依赖服务镜像的变更并触发重启。
解决方法:将Docker Compose升级至v2.37.0及以上版本,该版本修复了依赖服务镜像重建后自动重启的问题,确保最新镜像能够即时生效[27]。
排查命令

  • 使用docker compose version确认当前Compose版本;
  • 通过docker compose ps查看服务运行状态,判断是否有服务未重启;
  • 使用docker compose logs [服务名]查看服务日志,排查是否因使用旧镜像导致错误。
3. Rootless模式下容器权限不足

问题现象:在Docker rootless模式下运行容器时,出现文件读写权限不足、无法绑定低端口(如80/443)等操作失败的情况。
原因分析:Docker Engine旧版本在rootless模式下存在权限管理缺陷,导致用户命名空间映射、文件系统权限控制等功能异常。
解决方法:升级Docker Engine至25.0及以上版本,该版本修复了rootless模式下的权限问题及并行构建导致的磁盘空间泄漏等缺陷[28]。
排查命令

  • 使用docker version确认Docker Engine版本;
  • 通过docker exec -it [容器名] id查看容器内用户ID,验证权限配置;
  • 查看journalctl -u docker/var/log/docker.log检查Docker服务日志,定位权限相关错误。

最佳实践

1. 合理限制容器资源

为什么做:防止容器无限制占用主机CPU、内存、磁盘等资源,避免影响主机及其他容器的稳定性和性能。
怎么做:在运行容器时,通过--memory--cpus等参数限制资源使用。例如,docker run --memory=512m --cpus=0.5 --name=limited-container nginx,限制容器最大使用512MB内存和0.5个CPU核心[9]。

2. 启用容器只读文件系统增强安全隔离

为什么做:防止容器内恶意程序或误操作修改文件系统,减少攻击面,增强容器运行时安全性。
怎么做:使用--read-only参数以只读模式运行容器,并通过--tmpfs挂载临时可写目录(如/tmp)。例如,docker run --read-only --tmpfs /tmp --name=secure-container nginx[9]。

3. 避免在不适合的场景使用Docker

为什么做:Docker容器基于共享内核的虚拟化技术,在某些场景下无法满足需求,可能导致性能损耗、功能受限或安全风险。
怎么做:避免将Docker用于以下场景:需要极高性能(如高频交易系统)、强依赖GUI界面的应用(如桌面软件)、金融核心系统(需严格合规和隔离)[9]。

4. 及时更新Docker组件及依赖

为什么做:旧版本Docker Engine、Docker Compose等组件可能存在安全漏洞(如CVE-2024-29018)、功能缺陷或兼容性问题,影响系统安全和稳定性。
怎么做:定期关注Docker官方更新,及时升级Docker Engine至最新稳定版(如25.0及以上),Docker Compose至v2.37.0及以上,修复已知安全问题和bug[27][28]。

5. 配置国内镜像源加速镜像管理

为什么做:国内网络环境下,直接访问Docker官方镜像源可能存在速度慢、连接不稳定等问题,影响镜像拉取效率。
怎么做:在Docker配置文件中添加国内第三方镜像源,如docker.m.daocloud.io。编辑/etc/docker/daemon.json文件,添加{"registry-mirrors": [[26](https://docker.m.daocloud.io)]},重启Docker服务使配置生效[28]。
排查命令:使用docker info | grep "Registry Mirrors"验证镜像源配置是否生效。

附录:Docker命令速查表

为便于读者快速检索常用Docker命令,以下表格按实际使用频率排序,整合了容器管理及Docker Compose相关核心命令,并对易混淆用法添加备注说明︰

| 命令 | 功能描述 |常用参数 |备注 |引用来源 |
|---------------------|:-----------------------------|:---------------------------------|:---------------------------------------------------------------------------------------|:--------------------------------------------|"docker run |启动容器 |-d(后台运行)、-p(端口映射)--namel 指定名称)|基础容器创建命令,需配合镜像名称执行,如docker run -d --name mynginx nginx |["blog.csdn.net/qq_446...]|… ps |查看容器状态 |-a(显示所有容器)、-q(仅输出ID) |默认仅显示运行中的容器;-a 参数扩展显示范围至所有容器(含已停止状态) |["blog.csdn.net/jigetage...… |docker stop |停止运行中的容器 |\<容器ID/名称> |需精确指定目标容器标识执行,停止后容器状态变更为Exited |["blog.csdn.net/qq_446...]| docker logs |查看容器日志 |-f(实时跟踪)、-t(时间戳)--tail N(末尾N行)|f 参数支持持续输出新增日志,常用于实时调试场景 |["blog.csdn.net/jigetage...… stats |监控容器资源占用 |无 |实时展示CPU、内存、网络I/O等指标动态数据按Ctrl+C终止监控 |["blog.csdn.net/qq_446...]| |docker-compose up |启动Compose服务栈 |d(后台运行)、--build(构建镜像)|基于docker-compose.yml配置启动服务集群,--build 选项强制重新构建镜像 |["blog.csdn.net/jigetage...… |docker-compose exec |在容器内执行命令 |--privileged(特权模式-u 指定用户)|用于容器内操作调试--privileged 选项可获取系统级权限 |["blog.csdn.net/jigetage...… logs |查看服务栈日志 |f(实时跟踪)、t(时间戳)--tail N |同docker logs 功能,但作用于整个Compose服务集群 |["blog.csdn.net/jigetage...… build |构建服务镜像 |--no-cache(禁用缓存)--buildarg K=V 设置构建变量)|--no-cache 选项强制重新拉取依赖,适用于依赖更新场景 |["blog.csdn.net/jigetage...… |docker-compose rm |删除已停止服务容器 |-f(强制删除)、-v(删除关联卷)|需谨慎操作-v选项将同时清除数据卷,可能导致数据丢失 |["blog.csdn.net/jigetage...… |docker-compose config |验证配置文件 |-q(仅验证)、--services打印服务名)|用于检查docker-compose.yml语法正确性,--services可快速列出服务组件清单 |["blog.csdn.net/jigetage...… |docker-compose port |查看端口映射关系 |--protocol tcp(指定协议)--index N |显示服务内部端口与宿主机端口的映射详情--index用于多实例服务 |["blog.csdn.net/jigetage...…