Docker 容器与镜像
Docker 容器与镜像技术
一、Docker 概述
Docker 是一种轻量级容器化技术,通过打包应用程序及其依赖环境,实现 "一次构建,到处运行" 的目标。容器技术相比传统虚拟机,具有启动速度快、资源占用低、可移植性强等优势,已成为现代应用部署的主流方案。
1.1 容器核心概念
容器是一个自包含的运行环境,包含:
- 应用程序本身
- 应用所需的全部依赖(库、二进制文件、配置文件等)
容器通过操作系统级虚拟化技术,实现与宿主机器及其他容器的隔离,同时避免了传统虚拟机的 Hypervisor 层开销,性能接近原生系统。
1.2 Docker 优势
优势 | 说明 |
快速交付部署 | 容器启动时间为秒级,大幅缩短开发、测试、部署周期 |
高效虚拟化 | 内核级虚拟化,无需额外 Hypervisor,资源利用率更高 |
可移植性强 | 可在物理机、虚拟机、公有云、私有云等任意环境运行 |
简化管理 | 增量更新,自动化管理,减少环境配置差异带来的问题 |
1.3 容器标准化
容器技术遵循两大核心标准:
- Runtime Spec:运行时标准,定义容器的运行环境规范
- Image Format Spec:镜像格式标准,定义容器镜像的结构规范
主流容器运行时(Runtime):
- LXC:Linux 老牌容器运行时,Docker 早期使用
- Runc:Docker 开发的默认运行时,符合 OCI 规范
- Rkt:CoreOS 开发的容器运行时,兼容 Docker 镜像
二、Docker 架构与核心组件
Docker 采用C/S(客户端 - 服务器)架构,核心组件包括客户端、守护进程、镜像、容器和仓库。
2.1 架构示意图
[客户端] <--REST API--> [Docker守护进程]|+----------------+----------------+| | |[镜像(Images)] [容器(Containers)] [仓库(Registry)]
2.2 核心组件说明
- Docker 客户端
-
- 常用工具:docker 命令行工具
-
- 功能:向 Docker 守护进程发送指令(构建、运行、管理容器等)
-
- 通信方式:通过 UNIX 套接字或网络接口与守护进程通信
2.Docker 守护进程(Docker Daemon)
-
- 运行位置:Docker 主机后台
-
- 功能:负责创建、运行、监控容器,管理镜像和仓库交互
3.Docker 镜像(Image)
-
- 本质:只读模板,包含运行应用所需的代码、依赖、配置等
-
- 特点:分层存储,可复用,不可修改(修改会生成新层)
4.Docker 容器(Container)
-
- 本质:镜像的可运行实例,是一个隔离的运行环境
-
- 特点:可启动、停止、删除、暂停,状态可持久化
5.Docker 仓库(Registry)
-
- 功能:存储和分发 Docker 镜像
-
- 分类:
-
-
- 公有仓库:Docker Hub(官方)、阿里云容器仓库等
-
-
-
- 私有仓库:企业内部自建的镜像仓库
-
三、Docker 部署与环境配置
3.1 前置条件
- 关闭防火墙和 SELinux:
systemctl stop firewalld && systemctl disable firewalldsetenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
- 配置网络 YUM 源(推荐阿里云源)
https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.22081b117nyHaS
3.2 安装 Docker(CentOS 为例)
- 安装依赖包:
yum install -y yum-utils device-mapper-persistent-data lvm2
2.添加 Docker 官方源:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3.安装 Docker CE:
yum install -y docker-ce docker-ce-cli containerd.io
4.启动 Docker 并设置开机自启:
systemctl start dockersystemctl enable docker
5.验证安装:
docker --version # 显示版本信息则安装成功
3.3 配置镜像加速器
由于默认镜像仓库(Docker Hub)访问速度慢,需配置国内加速器:
- 创建 / 修改配置文件:
vim /etc/docker/daemon.json
2.添加加速器地址:
{"registry-mirrors": ["https://docker.m.daocloud.io","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn"]}
3.重启 Docker 使配置生效:
systemctl daemon-reloadsystemctl restart docker
四、Docker 镜像管理
镜像是 Docker 容器的基础,所有容器都基于镜像创建。以下是常用镜像操作命令。
4.1 镜像基本操作
命令 | 功能说明 | 示例 |
docker images | 列出本地所有镜像 | docker images |
docker search 镜像名 | 搜索镜像(Docker Hub) | docker search nginx |
docker pull 镜像名[:标签] | 拉取镜像 | docker pull nginx:latest |
docker tag 原镜像 新镜像[:标签] | 为镜像添加标签 | docker tag nginx:latest mynginx:v1 |
docker rmi 镜像名[:标签] | 删除镜像 | docker rmi nginx:latest |
docker history 镜像名 | 查看镜像构建历史 | docker history nginx |
4.2 镜像高级操作
4.2.1 镜像导入导出
# 导出镜像为压缩包docker image save nginx > nginx-image.tar.gz# 从压缩包导入镜像docker image load -i nginx-image.tar.gz
4.2.2 清理无用镜像
# 清理临时镜像和未使用的镜像docker image prune# 清理所有无用镜像(包括未打标签的)docker image prune -a -f
4.2.3 查看镜像详细信息
# 查看镜像完整信息(JSON格式)docker image inspect nginx:latest# 查看镜像特定信息(如架构)docker image inspect -f {{".Architecture"}} nginx:latest
4.3 镜像管理注意事项
- 同一镜像可以有多个标签,共享同一镜像 ID(类似硬链接)
- 若镜像被容器使用,需先删除容器才能删除镜像(或使用 -f 强制删除)
- 镜像名称格式:仓库地址/用户名/镜像名:标签(默认仓库为 Docker Hub)
五、Docker 容器管理
容器是镜像的运行实例,以下是容器的创建、启动、停止等核心操作。
5.1 容器基本操作
命令 | 功能说明 | 示例 |
docker ps | 查看运行中的容器 | docker ps |
docker ps -a | 查看所有容器(包括停止的) | docker ps -a |
docker create -it --name 容器名 镜像名 | 创建容器(不启动) | docker create -it --name mycentos centos:7 |
docker start 容器名/ID | 启动容器 | docker start mycentos |
docker run -it 镜像名 命令 | 创建并启动容器(交互模式) | docker run -it centos:7 /bin/bash |
docker run -itd 镜像名 命令 | 创建并启动容器(后台模式) | docker run -itd --name mynginx nginx |
docker stop 容器名/ID | 停止容器 | docker stop mynginx |
docker rm 容器名/ID | 删除停止的容器 | docker rm mycentos |
docker rm -f 容器名/ID | 强制删除容器(包括运行中的) | docker rm -f mynginx |
5.2 容器交互与进入
- docker exec(推荐):
# 进入运行中的容器(退出后容器继续运行)docker exec -it mynginx /bin/bash
2.docker attach(不推荐):
# 进入容器(退出后容器会停止)docker attach mynginx
5.3 容器导入导出
用于容器迁移,保留容器当前状态:
- 导出容器:
# 将运行或停止的容器导出为压缩包docker export -o mycontainer.tar mycentos
2.导入为镜像:
# 从压缩包导入为新镜像docker import mycontainer.tar myimage:v1
3.从新镜像创建容器:
docker run -itd --name newcontainer myimage:v1 /bin/bash
5.4 容器高级操作
命令 | 功能说明 | 示例 |
docker pause 容器名 | 暂停容器 | docker pause mynginx |
docker unpause 容器名 | 恢复暂停的容器 | docker unpause mynginx |
docker logs 容器名 | 查看容器日志 | docker logs -f mynginx(实时查看) |
docker inspect 容器名 | 查看容器详细信息 | docker inspect mynginx |
docker container prune | 清理所有停止的容器 | docker container prune -f |
docker cp 本地文件 容器名:路径 | 复制文件到容器 | docker cp test.txt mynginx:/tmp/ |
docker cp 容器名:路径 本地文件 | 从容器复制文件 | docker cp mynginx:/etc/nginx/nginx.conf ./ |
六、容器应用实战:部署 Nginx 服务
通过端口映射和目录挂载,实现宿主机与容器的资源共享,部署可持久化的 Nginx 服务。
6.1 准备工作
- 创建宿主机目录结构(用于挂载容器数据):
mkdir -p /root/nginx/{www,logs,conf}
2.创建测试网页:
echo "Hello" > /root/nginx/www/index.html
3.获取 Nginx 默认配置文件(先创建临时容器复制配置):
# 创建临时容器docker run -itd --name tmpnginx nginx:latest# 复制配置文件到宿主机docker cp tmpnginx:/etc/nginx/nginx.conf /root/nginx/conf/# 删除临时容器docker rm -f tmpnginx
6.2 创建并启动 Nginx 容器
docker run -itd \--name mynginx \-p 80:80 \ # 端口映射:宿主机80 -> 容器80-v /root/nginx/www:/usr/share/nginx/html \ # 网页目录挂载-v /root/nginx/logs:/var/log/nginx \ # 日志目录挂载-v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ # 配置文件挂载nginx:latest
6.3 验证部署
- 查看容器状态:
docker ps | grep mynginx # 确保容器处于运行状态
2.访问测试:
-
- 通过宿主机 IP 访问:http://宿主机IP,应显示测试页面内容
-
- 查看日志验证:docker logs mynginx
6.4 配置说明
- 端口映射(-p):解决容器网络隔离问题,使外部可访问容器服务
- 目录挂载(-v):
-
- 实现宿主机与容器文件共享
-
- 确保容器重启后数据不丢失(如日志、配置、网页内容)
-
- 便于在宿主机直接修改容器内的配置和内容
七、总结
Docker 容器技术通过封装应用及其依赖,解决了 "环境不一致" 的核心问题,大幅提升了软件交付效率。本文重点介绍:
- 核心概念:镜像(只读模板)与容器(运行实例)的区别与联系
- 架构组件:客户端、守护进程、镜像、容器、仓库的协同工作方式
- 操作命令:镜像的拉取、标签、删除;容器的创建、启动、进入、迁移
- 实战部署:通过 Nginx 案例展示端口映射和目录挂载的实际应用
掌握 Docker 基础后,可进一步学习 Docker Compose(多容器编排)、Docker Swarm(容器集群)等高级主题,构建更复杂的容器化应用架构。