Docker 入门到精通:从安装到实操全记录

Docker 作为当下最流行的 Linux 容器解决方案,凭借轻量、高效、环境一致性的优势,成为开发、测试、部署环节的必备工具。相比传统虚拟机,Docker 以进程级隔离实现了资源的高效利用,让应用 “一次打包,到处运行” 成为现实。这篇文章将从 Docker 的核心原理讲起,一步步完成安装、镜像管理、容器操作、网络配置等实操内容,从入门到精通,手把手带你掌握 Docker 核心用法。

一、从虚拟机到容器:理解 Docker 的核心价值

软件开发的一大痛点是环境配置不一致,“在我机器上能跑” 的问题困扰着无数开发者。为了解决这个问题,虚拟机率先登场,但它的弊端也十分明显,而 Docker 基于 Linux 容器技术,完美弥补了这些不足。

1. 虚拟机的痛点

虚拟机是在一个操作系统中模拟另一个完整的操作系统,应用在独立的虚拟环境中运行,但存在三大问题:
  • 资源占用高:独占内存、硬盘空间,即使应用仅用 1MB 内存,虚拟机也需要几百 MB 运行空间;
  • 启动速度慢:需要完整加载操作系统内核,启动通常需要几分钟;
  • 冗余步骤多:完整的系统层级操作无法跳过,比如用户登录、系统服务加载。

2. Linux 容器:轻量级虚拟化

Linux 容器(LXC)并非模拟完整操作系统,而是对进程进行隔离,给进程套上 “保护层”,让容器内进程接触到的资源都是虚拟的,实现与底层系统的隔离。相比虚拟机,容器的优势十分突出:
  • 启动快:容器内应用是底层系统的直接进程,启动等同于启动一个本地程序,秒级完成;
  • 资源占用少:仅占用实际需要的资源,多个容器可共享系统资源,无冗余开销;
  • 体积小:仅打包应用运行所需组件,无需完整操作系统,镜像文件远小于虚拟机镜像。

3. Docker:容器技术的 “易用封装”

Docker 是 Linux 容器的一种封装,提供了简单易用的容器操作接口,让开发者无需深入底层容器技术,就能快速创建、管理、发布容器。其核心价值是将应用与依赖打包成独立镜像,运行镜像即可生成虚拟容器,让应用运行环境完全一致,彻底解决环境配置问题。

二、Docker 核心实现原理

Docker 的高效运行依赖 Linux 内核的三大核心技术,这是理解 Docker 工作机制的关键,也是区分 Docker 与传统虚拟化的核心。

1. 进程隔离 ——Linux Namespace

Namespace 是 Linux 内核提供的资源隔离能力,能将 PID(进程 ID)、User ID、网络、文件系统等系统资源隔离开,为容器创建独立的运行环境。

容器内的进程会认为自己拥有独立的 PID 空间、网络栈,与宿主机及其他容器的进程完全隔离,实现了进程级的独立运行

2. 资源限制 ——Linux Cgroups

Docker 容器本质是宿主机上的一个进程,为了避免单个容器占用过多 CPU、内存等资源影响其他容器,Docker 通过 Linux Cgroups 实现资源限制与统计

Cgroups 可以对一组进程的 CPU、内存、存储、网络等资源进行精准限制,同时能统计资源的实时使用情况,保证容器间的资源隔离与公平分配。

3. 分层存储 ——Union File System(联合文件系统)

Docker 镜像采用分层结构,每一层构建在其他层之上,新增内容仅在原有层基础上增加,实现了增量更新。这一特性由联合文件系统(UnionFS)支撑,其核心能力包括:
  • 分层叠加:将多个不同的文件系统透明叠加,形成一个统一的文件系统;
  • 写时复制(Copy on Write):只有当镜像内容被修改时,才会复制对应层的内容进行修改,未修改部分共享原有层,大幅节省磁盘空间。

三、Docker 核心架构与基本概念

Docker 采用客户端 - 服务器(C/S) 架构,通过远程 API 实现客户端与守护进程的通信,核心由镜像、容器、仓库三大概念构成,三者是 Docker 操作的基础。

1. 核心架构组件

  • Docker 客户端:通过命令行(docker cmd)或工具调用 Docker API,向守护进程发送操作指令;
  • Docker 守护进程(dockerd):运行在宿主机上,负责管理镜像、容器、网络等所有 Docker 资源,处理客户端的指令;
  • Docker Registry:镜像仓库,用于存储和分发 Docker 镜像,官方仓库为 Docker Hub(hub.docker.com)。

2. 三大核心概念

(1)镜像(Image)

镜像是创建 Docker 容器的静态模板,相当于一个完整的 root 文件系统,包含应用运行所需的代码、运行时、库、环境变量和配置文件。

镜像具有只读特性,无法直接修改,如需定制镜像,需在原有镜像基础上构建新的分层。

(2)容器(Container)

容器是镜像运行时的实体,是镜像的实例化,如同面向对象编程中 “类与对象” 的关系。

容器可以被创建、启动、停止、删除、暂停,运行时会在镜像的只读层之上创建可写层,容器内的所有操作都在可写层中进行,不影响底层镜像。

(3)仓库(Repository)

仓库是镜像的存储与分发中心,一个仓库可以包含多个标签(Tag),每个标签对应一个具体版本的镜像。

通过<仓库名>:<标签>的格式可以指定具体镜像,若不指定标签,默认使用latest(最新版)。

四、Docker 环境安装(以 CentOS7.6 为例)

Docker 分为社区版(Docker CE)和企业版(Docker EE),个人开发和小型团队使用社区版即可,以下是 CentOS7.6 的完整安装步骤,官方文档有其他系统的安装教程,可按需参考。

1. 卸载旧版本(若有)

官方建议先卸载旧版本的 Docker,避免版本冲突:
sudo yum remove docker docker-client docker-client-latest docker-common \
  docker-latest docker-latest-logrotate docker-logrotate docker-engine

2. 配置 YUM 仓库源

安装 yum-utils 工具,并添加 Docker 官方 YUM 仓库:
# 安装yum-utils
sudo yum install -y yum-utils
# 添加Docker官方仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  

3. 安装 Docker 核心组件

安装最新版的 Docker Engine、containerd(容器运行时)和 Docker Compose(容器编排工具):
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
  
安装完成后,Docker 不会自动启动,且会创建docker用户组,默认无用户加入该组。

4. 启动 Docker 并验证安装

# 启动Docker服务
sudo systemctl start docker
# 设置开机自启
sudo systemctl enable docker
# 验证版本
docker version
# 测试安装是否正常(拉取测试镜像并运行)
docker run hello-world
  
若运行docker run hello-world后出现成功提示,说明 Docker 安装并运行正常。

五、镜像核心操作:从拉取到管理

镜像是 Docker 的基础,所有容器都基于镜像创建,掌握镜像的拉取、查看、删除、归档等操作,是 Docker 实操的第一步。

1. 配置镜像仓库源(解决拉取慢问题)

Docker 默认从官方 Docker Hub 拉取镜像,国内访问速度较慢,可配置国内 / 可用镜像源,修改/etc/docker/daemon.json文件即可:
# 创建配置文件(若不存在)
sudo mkdir -p /etc/docker
# 写入镜像源配置
sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://huecker.io"
    ]
}
EOF
# 重载配置并重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
# 验证配置是否生效
docker info | grep -A 5 "Registry Mirrors"
  

2. 登录 / 退出镜像仓库

默认登录 Docker Hub,需先在官网注册账号,私有仓库需指定仓库地址:
# 登录Docker Hub(默认)
docker login -u 用户名 -p 密码
# 登录私有仓库
docker login -u 用户名 -p 密码 仓库IP:端口
# 退出仓库
docker logout [仓库地址]
  

3. 搜索镜像

通过docker search命令搜索仓库中的镜像,可根据星级、是否官方筛选:
# 语法:docker search [镜像名]
docker search nginx
  
返回结果字段说明:
  • NAME:镜像仓库名;
  • STARS:星级,代表受欢迎程度;
  • OFFICIAL:是否为官方镜像;
  • AUTOMATED:是否为自动构建镜像。

4. 拉取镜像

通过docker pull拉取镜像,可指定标签(版本),不指定则拉取latest
# 语法:docker pull [镜像名]:[标签]
# 拉取最新版nginx
docker pull nginx
# 拉取指定版本nginx(1.25.1)
docker pull nginx:1.25.1
  

5. 查看本地镜像

# 查看所有本地镜像
docker images
# 仅显示镜像ID
docker images -q
# 显示镜像完整信息(不截断)
docker images --no-trunc
  
返回结果字段说明:
  • REPOSITORY:镜像仓库名;
  • TAG:镜像标签(版本);
  • IMAGE ID:镜像唯一 ID;
  • CREATED:镜像创建时间;
  • SIZE:镜像大小。

6. 删除镜像

通过镜像名、标签或镜像 ID 删除,删除前需停止基于该镜像的所有容器:
# 语法:docker rmi [镜像名:标签/镜像ID]
# 删除指定版本nginx
docker rmi nginx:1.25.1
# 删除所有未使用镜像
docker image prune -a
  

7. 镜像归档与导入

(1)归档镜像(保存为 tar 文件,用于离线传输)

# 语法:docker save -o 归档文件名.tar 镜像名:标签
docker save -o nginx-latest.tar nginx:latest
  

(2)导入归档镜像

# 语法:docker load -i 归档文件名.tar
docker load -i nginx-latest.tar
  

8. 为镜像打标签

为本地镜像添加新标签,常用于将镜像关联到私有仓库,方便推送:
# 语法:docker tag 原镜像名:原标签 新镜像名:新标签
# 关联私有仓库
docker tag nginx:latest 192.168.1.100:5000/nginx:v1
  

9. 推送镜像到仓库

推送前需先登录仓库,并为镜像打好对应仓库的标签:
# 语法:docker push 镜像名:标签
docker push 192.168.1.100:5000/nginx:v1
  

六、容器生命周期:从创建到销毁

容器是镜像的运行实例,掌握容器的创建、启动、运行、停止、删除等操作,是 Docker 实操的核心,所有应用的运行都围绕容器展开。

1. 创建容器(仅创建,不启动)

# 语法:docker create [选项] 镜像名 [命令]
# 创建一个nginx容器,命名为mynginx,暴露80端口
docker create --name mynginx -p 80:80 nginx
  

2. 启动容器

启动已创建的容器,或直接创建并启动容器(docker run,最常用)。

(1)启动已创建的容器

# 语法:docker start [容器名/容器ID] 
docker start mynginx
  

(2)创建并启动容器(docker run)

docker run是最常用的容器启动命令,包含 “创建 + 启动” 两步,核心选项如下:
选项 作用
-i 保持容器标准输入打开
-t 为容器分配伪终端,实现交互
-d 后台运行容器
--name 为容器指定自定义名称
-p 端口映射,宿主机端口:容器端口
-v 数据卷挂载,宿主机目录:容器目录
--restart 容器重启策略(always/on-failure)
# 示例1:交互式运行centos容器,进入bash
docker run -it centos /bin/bash
# 示例2:后台运行nginx容器,命名mynginx,端口80映射,开机自启
docker run -d --name mynginx -p 80:80 --restart always nginx
  

3. 停止 / 重启 / 强制停止容器

# 停止容器(优雅停止,等待进程退出)
docker stop [容器名/容器ID]
# 重启容器
docker restart [容器名/容器ID]
# 强制停止容器(类似kill -9,立即终止)
docker kill [容器名/容器ID]
  

4. 查看容器

# 查看正在运行的容器
docker ps
# 查看所有容器(运行中+已停止)
docker ps -a
# 仅显示容器ID
docker ps -q
# 查看容器详细信息
docker inspect [容器名/容器ID]
  

5. 进入运行中的容器

容器后台运行时,如需进入容器执行命令,使用docker exec(推荐)或docker attach
# 推荐:进入容器并打开bash,退出容器不影响运行
docker exec -it [容器名/容器ID] /bin/bash
# 附加到容器,退出容器会导致容器停止
docker attach [容器名/容器ID]
  

6. 删除容器

删除已停止的容器,强制删除需加-f(不推荐,先停止再删除):
# 语法:docker rm [容器名/容器ID]
docker rm mynginx
# 删除所有已停止的容器
docker container prune
# 强制删除运行中的容器
docker rm -f mynginx
  

7. 暂停 / 恢复容器

暂停容器内的进程,暂停期间容器不占用资源,恢复后继续运行:
# 暂停容器
docker pause [容器名/容器ID]
# 恢复容器
docker unpause [容器名/容器ID]
  

七、容器常用运维操作

掌握容器的日常运维命令,能快速排查问题、管理容器资源,包括查看日志、端口映射、资源统计、文件复制等。

1. 查看容器日志

排查容器运行问题的核心命令,支持实时跟踪、按时间筛选、按行数筛选:
# 语法:docker logs [选项] 容器名/容器ID
# 查看nginx容器所有日志
docker logs mynginx
# 实时跟踪日志(类似tail -f)
docker logs -f mynginx
# 查看最新100行日志,并实时跟踪
docker logs -f --tail 100 mynginx
# 查看指定时间后的日志
docker logs --since "2024-01-01 00:00:00" mynginx
  

2. 查看容器内运行的进程

# 语法:docker top 容器名/容器ID
docker top mynginx
  

3. 查看容器端口映射

# 语法:docker port 容器名/容器ID
docker port mynginx
  

4. 容器与宿主机间复制文件

实现宿主机和容器之间的文件 / 目录传输,容器运行 / 停止状态均可操作:
# 宿主机 → 容器
docker cp 宿主机文件路径 容器名/容器ID:容器内路径
# 容器 → 宿主机
docker cp 容器名/容器ID:容器内文件路径 宿主机路径
# 示例:将宿主机的index.html复制到nginx容器的网页根目录
docker cp /root/index.html mynginx:/usr/share/nginx/html/
  

5. 查看容器资源使用情况

实时统计容器的 CPU、内存、网络 I/O 等资源消耗:
# 语法:docker stats [容器名/容器ID]
# 统计单个容器
docker stats mynginx
# 统计所有运行中的容器,非实时输出
docker stats --no-stream
  

6. 容器导出与导入

(1)导出容器(将容器文件系统保存为 tar,快照形式)

# 语法:docker export -o 归档文件名.tar 容器名/容器ID
docker export -o mynginx.tar mynginx
  

(2)导入容器为镜像

# 语法:docker import 归档文件名.tar 新镜像名:新标签
docker import mynginx.tar mynginx:v2
  
注意docker save(镜像归档)与docker export(容器导出)的区别:
  • docker save保存镜像的完整分层和元数据,可重新生成原镜像;
  • docker export仅保存容器的当前文件系统快照,丢失分层信息,体积更小。

八、Docker 容器网络

Docker 为容器提供了独立的网络环境,核心由沙盒(Sandbox)、网络(Network)、端点(Endpoint) 构成,官方提供了 5 种网络驱动,满足不同场景的网络需求。

1. Docker 默认网络

安装 Docker 后,会自动创建 3 个默认网络,可通过docker network ls查看:
docker network ls
  
  • bridge:默认网络,容器连接到该网络,通过 docker0 虚拟网桥与宿主机通信,容器间通过内网 IP 互通;
  • host:容器与宿主机共享网络栈,无独立 IP,直接使用宿主机的 IP 和端口;
  • none:容器无网络配置,关闭网络功能,适用于无需网络的批处理任务。

2. 核心网络驱动

(1)bridge(桥接模式,默认)

相当于 VMware 的 NAT 模式,容器拥有独立的 Network Namespace,通过 docker0 虚拟网桥实现与宿主机、其他容器的通信。

特点:容器间内网互通,宿主机可通过端口映射访问容器,网络隔离性较好。

(2)host(主机模式)

相当于 VMware 的桥接模式,容器与宿主机共享 Network Namespace,无独立 IP 和端口,直接使用宿主机的网络资源。

特点:网络性能最优,无端口映射开销;缺点是容器与宿主机端口冲突,隔离性差。

(3)container(容器模式)

新创建的容器与一个已存在的容器共享 Network Namespace,共享 IP 和端口,其他资源(文件系统、进程)完全隔离。

特点:适用于两个容器需要紧密通信的场景,无需端口映射。

(4)overlay(覆盖模式)

用于多主机 /docker swarm 集群,实现跨主机的容器互通,通过将二层报文封装在 IP 报文上,突破网络拓扑限制。

特点:支持跨主机容器通信,是容器集群的核心网络模式。

(5)none(无网络模式)

容器拥有独立的 Network Namespace,但无任何网络配置(无网卡、IP、路由),关闭网络功能

3. 网络常用操作

# 查看所有网络
docker network ls
# 查看网络详细信息
docker network inspect bridge
# 创建自定义网络(推荐,支持容器名解析)
docker network create --driver bridge mynet
# 将容器连接到自定义网络
docker network connect mynet mynginx
# 将容器从网络断开
docker network disconnect mynet mynginx
# 删除未使用的网络
docker network prune
# 删除指定网络
docker network rm mynet
  

九、Dockerfile 与自定义镜像

当官方镜像或现有镜像无法满足需求时,可通过Dockerfile定制自定义镜像。Dockerfile 是一个文本文件,包含一条条构建镜像的指令,通过docker build命令可根据 Dockerfile 构建镜像。

1. Dockerfile 核心指令(常用)

指令 作用
FROM 指定基础镜像(必选,第一个指令)
MAINTAINER 指定镜像作者(已过时,推荐用 LABEL)
LABEL 添加镜像元数据,如作者、描述
RUN 构建镜像时执行的命令(分层执行)
COPY 将宿主机文件 / 目录复制到容器中
ADD 与 COPY 类似,支持自动解压压缩包、拉取远程文件
WORKDIR 指定容器的工作目录,后续命令均在此目录执行
ENV 设置环境变量
EXPOSE 声明容器暴露的端口(仅声明,不映射)
CMD 指定容器启动时执行的命令(仅最后一个生效,可被覆盖)
ENTRYPOINT 指定容器启动时的入口命令(不可被覆盖,可与 CMD 配合)

2. 构建自定义镜像示例

(1)编写 Dockerfile(以定制 Nginx 镜像为例,创建 Dockerfile 文件)

# 指定基础镜像
FROM nginx:latest
# 作者信息
LABEL author="test" description="custom nginx image"
# 复制宿主机的index.html到容器网页根目录
COPY index.html /usr/share/nginx/html/
# 声明暴露80端口
EXPOSE 80
# 容器启动命令
CMD ["nginx", "-g", "daemon off;"]
  

(2)构建镜像

在 Dockerfile 所在目录执行docker build命令,-t指定镜像名和标签,.表示 Dockerfile 所在目录:
docker build -t mynginx:v3 .
  

(3)基于自定义镜像创建容器

docker run -d -p 8080:80 --name mynginx3 mynginx:v3
  

十、Docker Compose:多容器编排

在实际开发中,一个应用通常由多个容器组成(如 Nginx+MySQL+PHP),手动管理多个容器的启动、网络、依赖十分繁琐,Docker Compose可解决这一问题。

Docker Compose 是 Docker 官方的多容器编排工具,通过docker-compose.yml配置文件定义所有服务(容器),使用一条命令即可创建、启动所有服务。

1. docker-compose.yml 核心结构

采用 YAML 格式,核心包含version(版本)、services(服务,即容器)、networks(网络)、volumes(数据卷)四部分,示例(Nginx+MySQL):
version: '3.8'
# 定义服务
services:
  # nginx服务
  nginx:
    image: nginx:latest
    container_name: mynginx
    ports:
      - "80:80"
    networks:
      - mynet
    restart: always
  # mysql服务
  mysql:
    image: mysql:8.0
    container_name: mymysql
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=testdb
    ports:
      - "3306:3306"
    networks:
      - mynet
    restart: always
# 定义网络
networks:
  mynet:
    driver: bridge
  

2. Docker Compose 常用命令

在 docker-compose.yml 所在目录执行:
# 启动所有服务(后台运行加-d)
docker-compose up -d
# 停止所有服务
docker-compose stop
# 重启所有服务
docker-compose restart
# 查看所有服务容器
docker-compose ps
# 停止并删除所有服务容器、网络
docker-compose down
# 查看服务日志
docker-compose logs -f nginx
  

十一、总结

Docker 的核心价值是环境一致性和资源高效利用,从基础的镜像、容器操作,到自定义镜像、多容器编排,再到网络配置,所有操作都围绕 “让应用更便捷地打包、部署、运行” 展开。
本文从原理到实操,覆盖了 Docker 入门到精通的核心内容:
  1. 理解 Docker 与虚拟机的区别,掌握 Namespace、Cgroups、UnionFS 三大核心原理;
  2. 完成 Docker 安装与镜像源配置,掌握镜像的拉取、管理、归档等操作;
  3. 精通容器的生命周期管理和日常运维操作,解决实际使用中的常见问题;
  4. 了解 Docker 网络模型,掌握不同网络驱动的使用场景和自定义网络操作;
  5. 学会通过 Dockerfile 定制自定义镜像,使用 Docker Compose 实现多容器编排。
Docker 的生态十分丰富,后续可深入学习 Docker Swarm、K8s 等容器编排技术,实现容器的集群化管理,让 Docker 在生产环境中发挥更大的价值。