Docker 容器与镜像

Docker 容器与镜像技术

一、Docker 概述

Docker 是一种轻量级容器化技术,通过打包应用程序及其依赖环境,实现 "一次构建,到处运行" 的目标。容器技术相比传统虚拟机,具有启动速度快、资源占用低、可移植性强等优势,已成为现代应用部署的主流方案。

1.1 容器核心概念

容器是一个自包含的运行环境,包含:

  1. 应用程序本身
  2. 应用所需的全部依赖(库、二进制文件、配置文件等)

容器通过操作系统级虚拟化技术,实现与宿主机器及其他容器的隔离,同时避免了传统虚拟机的 Hypervisor 层开销,性能接近原生系统。

1.2 Docker 优势

|------------|--------------------------------|
| 优势 | 说明 |
| 快速交付部署 | 容器启动时间为秒级,大幅缩短开发、测试、部署周期 |
| 高效虚拟化 | 内核级虚拟化,无需额外 Hypervisor,资源利用率更高 |
| 可移植性强 | 可在物理机、虚拟机、公有云、私有云等任意环境运行 |
| 简化管理 | 增量更新,自动化管理,减少环境配置差异带来的问题 |

1.3 容器标准化

容器技术遵循两大核心标准:

  • Runtime Spec:运行时标准,定义容器的运行环境规范
  • Image Format Spec:镜像格式标准,定义容器镜像的结构规范

主流容器运行时(Runtime):

  1. LXC:Linux 老牌容器运行时,Docker 早期使用
  2. Runc:Docker 开发的默认运行时,符合 OCI 规范
  3. Rkt:CoreOS 开发的容器运行时,兼容 Docker 镜像

二、Docker 架构与核心组件

Docker 采用C/S(客户端 - 服务器)架构,核心组件包括客户端、守护进程、镜像、容器和仓库。

2.1 架构示意图

复制代码
[客户端] <--REST API--> [Docker守护进程]
                           |
         +----------------+----------------+
         |                |                |
    [镜像(Images)]  [容器(Containers)]  [仓库(Registry)]

2.2 核心组件说明

  1. 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 firewalld

    setenforce 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 为例)

  1. 安装依赖包:

    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 docker

systemctl enable docker

5.验证安装:

复制代码
docker --version # 显示版本信息则安装成功

3.3 配置镜像加速器

由于默认镜像仓库(Docker Hub)访问速度慢,需配置国内加速器:

  1. 创建 / 修改配置文件:

    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-reload

systemctl 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 镜像管理注意事项

  1. 同一镜像可以有多个标签,共享同一镜像 ID(类似硬链接)
  2. 若镜像被容器使用,需先删除容器才能删除镜像(或使用 -f 强制删除)
  3. 镜像名称格式:仓库地址/用户名/镜像名:标签(默认仓库为 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 容器交互与进入

  1. docker exec (推荐)

    进入运行中的容器(退出后容器继续运行)

    docker exec -it mynginx /bin/bash

2.docker attach (不推荐)

复制代码
# 进入容器(退出后容器会停止)

docker attach mynginx

5.3 容器导入导出

用于容器迁移,保留容器当前状态:

  1. 导出容器

    将运行或停止的容器导出为压缩包

    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 准备工作

  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 验证部署

  1. 查看容器状态:

    docker ps | grep mynginx # 确保容器处于运行状态

2.访问测试:

    • 查看日志验证:docker logs mynginx

6.4 配置说明

  • 端口映射( -p :解决容器网络隔离问题,使外部可访问容器服务
  • 目录挂载( -v
    • 实现宿主机与容器文件共享
    • 确保容器重启后数据不丢失(如日志、配置、网页内容)
    • 便于在宿主机直接修改容器内的配置和内容

七、总结

Docker 容器技术通过封装应用及其依赖,解决了 "环境不一致" 的核心问题,大幅提升了软件交付效率。本文重点介绍:

  1. 核心概念:镜像(只读模板)与容器(运行实例)的区别与联系
  2. 架构组件:客户端、守护进程、镜像、容器、仓库的协同工作方式
  3. 操作命令:镜像的拉取、标签、删除;容器的创建、启动、进入、迁移
  4. 实战部署:通过 Nginx 案例展示端口映射和目录挂载的实际应用

掌握 Docker 基础后,可进一步学习 Docker Compose(多容器编排)、Docker Swarm(容器集群)等高级主题,构建更复杂的容器化应用架构。

相关推荐
博图光电1 天前
博图机械臂:以智能精度,重塑多行业自动化新生态
运维·自动化
容器魔方1 天前
Karmada 用户组再迎新成员,Scatter Lab 正式加入!
云原生·容器·云计算
小安运维日记1 天前
RHCA - DO374 | Day01:使用红帽Ansible自动化平台开发剧本
运维·服务器·云原生·自动化·云计算·ansible
刘岩Tony1 天前
ssh别名和多服务器同步文件
运维·服务器·ssh
zzy20887402711 天前
自定义服务器实现时间同步
运维·服务器
LXY_BUAA1 天前
在电脑中安装双系统(win11 + linux)20251019
linux·运维·服务器
小小爱大王1 天前
AI 编码效率提升 10 倍的秘密:Prompt 工程 + 工具链集成实战
java·javascript·人工智能
王中阳Go背后的男人1 天前
Docker磁盘满了?这样清理高效又安全
后端·docker
王中阳Go1 天前
Docker磁盘满了?这样清理高效又安全
docker
神龙斗士2401 天前
继承和组合
java·开发语言