Docker 入门到精通:从安装到实操全记录
- Docker
- 2025-03-08
- 178热度
- 1评论
一、从虚拟机到容器:理解 Docker 的核心价值
1. 虚拟机的痛点
- 资源占用高:独占内存、硬盘空间,即使应用仅用 1MB 内存,虚拟机也需要几百 MB 运行空间;
- 启动速度慢:需要完整加载操作系统内核,启动通常需要几分钟;
- 冗余步骤多:完整的系统层级操作无法跳过,比如用户登录、系统服务加载。
2. Linux 容器:轻量级虚拟化
- 启动快:容器内应用是底层系统的直接进程,启动等同于启动一个本地程序,秒级完成;
- 资源占用少:仅占用实际需要的资源,多个容器可共享系统资源,无冗余开销;
- 体积小:仅打包应用运行所需组件,无需完整操作系统,镜像文件远小于虚拟机镜像。
3. 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(联合文件系统)
- 分层叠加:将多个不同的文件系统透明叠加,形成一个统一的文件系统;
- 写时复制(Copy on Write):只有当镜像内容被修改时,才会复制对应层的内容进行修改,未修改部分共享原有层,大幅节省磁盘空间。
三、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 为例)
1. 卸载旧版本(若有)
sudo yum remove docker docker-client docker-client-latest docker-common \
docker-latest docker-latest-logrotate docker-logrotate docker-engine
2. 配置 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 核心组件
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
docker用户组,默认无用户加入该组。4. 启动 Docker 并验证安装
# 启动Docker服务
sudo systemctl start docker
# 设置开机自启
sudo systemctl enable docker
# 验证版本
docker version
# 测试安装是否正常(拉取测试镜像并运行)
docker run hello-world
docker run hello-world后出现成功提示,说明 Docker 安装并运行正常。五、镜像核心操作:从拉取到管理
1. 配置镜像仓库源(解决拉取慢问题)
/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 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. 删除镜像
# 语法: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
六、容器生命周期:从创建到销毁
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. 查看容器资源使用情况
# 语法: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 容器网络
1. Docker 默认网络
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(无网络模式)
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 与自定义镜像
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)构建镜像
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 核心结构
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 常用命令
# 启动所有服务(后台运行加-d)
docker-compose up -d
# 停止所有服务
docker-compose stop
# 重启所有服务
docker-compose restart
# 查看所有服务容器
docker-compose ps
# 停止并删除所有服务容器、网络
docker-compose down
# 查看服务日志
docker-compose logs -f nginx
十一、总结
- 理解 Docker 与虚拟机的区别,掌握 Namespace、Cgroups、UnionFS 三大核心原理;
- 完成 Docker 安装与镜像源配置,掌握镜像的拉取、管理、归档等操作;
- 精通容器的生命周期管理和日常运维操作,解决实际使用中的常见问题;
- 了解 Docker 网络模型,掌握不同网络驱动的使用场景和自定义网络操作;
- 学会通过 Dockerfile 定制自定义镜像,使用 Docker Compose 实现多容器编排。

学习了