摘要
docker官网: Docker: Accelerated Container Application Development
docker desktop官网:http://hub.docker.com/
docker文档官网:Docker Docs
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是:Build, Ship and Run Any App, Anywhere(构建,装载任何应用在任何地方),也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP及其运行环境能做到一次镜像,处处运行。
目录
解决的问题
试想如下场景,是不是经常遇到?
运维/测试: 你的程序不能跑呀!
开发:这里能跑啊!!!
(1)环境不一致导致诸多困扰。换一台机器就要重来一次费时费力。
(2)扩缩容同样也是个棘手问题(因为需要同样的环境),移植非常麻烦。
于是有人在想能不能从根本上解决问题。软件带环境安装,也就是说安装的时候把原始环境一模一样地复制过来。
有个docker后,我们就可以把跑通的程序的源码+配置+环境+版本等统一打包成一个镜像问题。也就是说以前开发提交的只是一份源代码,但是现在变成了源码+配置+环境+依赖包等等。可以以搬家进行比喻。以前搬家要收拾自己的东西,打包、运输、解包,期间肯定会丢失很多东西。有了docker之后搬家就相当于是搬楼,整栋楼移植过去。
注:其实就类似于vmware虚拟机那样,既然虚拟机能把整个系统都打包,那这里把程序依赖打包自然不是什么大问题。
虚拟机到虚拟容器:
特性 | 传统虚拟机(VM) | 容器虚拟化技术 |
---|---|---|
虚拟化层级 | 硬件级虚拟化(Hypervisor + Guest OS) | 操作系统级虚拟化(共享主机内核) |
隔离性 | 强(独立内核,硬件隔离) | 较弱(进程隔离,依赖内核特性如cgroups/namespace) |
启动速度 | 慢(分钟级,需启动完整OS) | 快(秒级,直接复用主机内核) |
资源占用 | 高(每个VM需独立OS和虚拟硬件) | 低(共享内核,无额外OS开销) |
性能损耗 | 较高(硬件虚拟化开销) | 极低(接近原生性能) |
镜像大小 | 大(GB级,包含完整OS) | 小(MB级,仅包含应用和依赖) |
部署密度 | 低(单机部署少量VM) | 高(单机可部署数百容器) |
跨平台兼容性 | 强(可运行不同Guest OS) | 弱(依赖主机内核,需匹配OS类型) |
典型工具/平台 | VMware ESXi、KVM、Hyper-V | Docker、Kubernetes、containerd |
docker利用的是宿主机的内核,不需要加载操作系统os内核。当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较耗时耗资源的过程。
1.docker--组成
docker本身是一个容器运行载体、管理引擎。其组成包括如下三要素:
概念 | 定义与特性 | 功能与用途 |
---|---|---|
镜像(Image) | - 只读的模板文件,包含运行容器所需的代码、依赖、环境配置。 - 不可直接修改,需通过新镜像版本更新。 |
提供标准化的应用打包方式,确保环境一致性(如 nginx:latest 镜像)。 |
容器(Container) | - 镜像的运行实例,拥有隔离的进程、用户、网络空间。 - 可创建、启动、停止、删除,资源隔离但共享主机内核。 |
运行应用的轻量级沙箱环境(如通过 nginx 镜像启动一个 Web 服务容器)。 |
仓库(Repository) | - 集中存储和管理镜像的场所,分为公开仓库(如 Docker Hub)和私有仓库(如阿里云 ACR)。 - 支持版本控制(通过标签区分镜像版本)。 |
实现镜像的分发与共享,支持团队协作和持续集成(如从仓库拉取 ubuntu:20.04 )。 |
也就是说: 容器是运行在镜像里面的:
# 镜像 = 类(Class)
class NginxImage:
def __init__(self):
self.code = "nginx-1.25"
self.deps = ["libc6", "openssl"]
# 容器 = 类的实例(Object)
container1 = NginxImage() # 容器1
container2 = NginxImage() # 容器2(同一镜像可创建多个容器)
Docker也是典型的Client-Server架构,后端是一个搜耦合架构,众多模块各司其职。docker运行的基本流程如下:
以下是 Docker 架构核心流程总结 的表格和说明,结合您提供的步骤整理而成:
Docker 核心架构与工作流程
步骤 | 组件/角色 | 功能说明 | 关键交互 |
---|---|---|---|
(1) | Docker Client | 用户通过命令行(CLI)或 API 发送请求(如 docker run )。 |
与 Docker Daemon 建立通信(默认通过 UNIX 套接字或 TCP)。 |
(2) | Docker Daemon | 接收 Client 请求的核心服务,包含 Docker Server 模块处理请求。 |
解析请求并分发任务给 Docker Engine 。 |
(3) | Docker Engine | 执行具体任务,每个任务以 Job 形式运行(如创建容器、拉取镜像)。 | 调用底层驱动(Graph/Network/Exec Driver)完成操作。 |
(4) | Graph Driver | 管理镜像存储(如 Overlay2、AUFS),从 Docker Registry 下载镜像并存储。 | 镜像以分层(Layer)形式存储,复用相同层提高效率。 |
(5) | Network Driver | 配置容器网络(如 bridge 、host 模式),通过 libcontainer 实现隔离。 |
创建虚拟网卡、IP 分配等(依赖 iptables /CNM 模型)。 |
(6) | Exec Driver | 执行容器内命令,限制资源(CPU/内存),默认使用 containerd (原为 libcontainer )。 |
调用 runc 启动容器进程,通过 cgroups 隔离资源。 |
(7) | libcontainer | 底层容器运行时库(现集成到 runc ),提供命名空间、cgroups 等隔离功能。 |
被 Network Driver 和 Exec Driver 调用,实现容器生命周期管理。 |
2.Docker Desktop安装
就是docker的可视化软件
2.1 下载及安装
进入Docker官网 (www.docker.com/) ,下载对应版本并安装
安装之前需要打开:
一般windows家庭版是没有Hyper-V的,我这里看网上教程配环境的时候一直出现错误,安装好像不需要这个,所以不管.
出现其他版本不是配的问题,可以自行在网上找教程,或者call me主页
安装完成之后。docker环境也就有了:
3.docker--命令
3.1.帮助命令
#查看概要信息
docker info
#查看docker整体帮助文档
docker --help
#查看docker命令帮助文档
docker run/pull/…… --help
3.2.镜像命令
docker images
1.列出本地主机上已有的镜像
2.搜索某个镜像是否在镜像仓库
docker search xxx
3.下载镜像
从 Docker Registry(默认 Docker Hub)拉取(下载)指定的镜像到本地,存储到 /var/lib/docker
(由 Graph Driver
管理)。
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
-
NAME
:镜像名称(格式:[仓库地址/]用户名/镜像名
,如nginx
或alpine
)。-
TAG
:镜像标签(版本),默认为latest
。-
DIGEST
:镜像内容的哈希值(唯一标识,优先级高于TAG
)。
选项 说明 --all-tags
/-a
下载镜像的所有标签版本(慎用,可能拉取大量数据)。 --quiet
/-q
静默模式,仅输出镜像 ID。 --platform
指定平台(如 linux/amd64
或windows/arm64
),多平台镜像时使用。
4.查看镜像/容器/数据卷所占的空间;盘点下鲸鱼装了多少东西了。
docker system df
#查看每个镜像占用了多cpu、内存、网络。
docker stats
#删除某个镜像,"rmi"即remove image。
docker rmi xxx_imagename/image_id
#将Docker镜像保存成tar包(镜像归档);docker load为其反操作。
docker save/load
3.3.容器命令
以下是 Docker 容器核心命令总结,涵盖容器生命周期管理、操作、调试及资源控制等常用场景,按功能分类整理为表格和示例:
1. 容器生命周期管理
命令 | 作用 | 常用参数 | 示例 |
---|---|---|---|
docker create |
创建容器但不启动(需手动启动) | --name , -it , -p , -v |
docker create --name my-nginx nginx:latest |
docker run |
创建并启动容器 | -d (后台运行), -it (交互式), --rm (退出后删除), -p (端口映射) |
docker run -d -p 80:80 --name web nginx |
docker start |
启动已停止的容器 | -a (附加输出) |
docker start web |
docker stop |
停止运行中的容器(发送 SIGTERM) | -t (超时时间,默认 10s) |
docker stop web |
docker restart |
重启容器 | 同 stop |
docker restart web |
docker kill |
强制停止容器(发送 SIGKILL) | -s (指定信号) |
docker kill -s SIGKILL web |
docker rm |
删除已停止的容器 | -f (强制删除运行中的容器), -v (同时删除卷) |
docker rm -f web |
docker pause/unpause |
暂停/恢复容器内所有进程 |
2. 容器操作与交互
命令 | 作用 | 常用参数 | 示例 |
---|---|---|---|
docker exec |
在运行中的容器内执行命令 | -it (交互式), -e (环境变量) |
docker exec -it web bash |
docker attach |
附加到容器的标准输入/输出(退出可能导致容器停止) | --sig-proxy (信号代理) |
docker attach web |
docker cp |
在容器和主机之间复制文件 | -L (跟随符号链接) |
docker cp web:/etc/nginx/nginx.conf ./ |
docker logs |
查看容器日志 | -f (实时跟踪), --tail N (显示最后 N 行), -t (时间戳) |
docker logs -f web |
3. 容器监控与资源管理
命令 | 作用 | 常用参数 | 示例 |
---|---|---|---|
docker ps |
列出容器 | -a (显示所有容器), -q (仅显示 ID), --filter (过滤) |
docker ps -a --filter "status=exited" |
docker stats |
实时监控容器资源使用(CPU/内存/网络等) | --no-stream (单次输出) |
docker stats web |
docker top |
查看容器内运行的进程 | - | docker top web |
docker inspect |
查看容器详细信息(配置、网络、卷等) | --format (格式化输出) |
docker inspect --format='{{.NetworkSettings.IPAddress}}' web |
docker update |
动态更新容器资源限制(需容器支持) | --cpus , --memory , --restart |
docker update --memory 512M web |
4. 容器网络与端口
命令 | 作用 | 常用参数 | 示例 |
---|---|---|---|
docker port |
查看容器的端口映射 | - | docker port web |
docker network |
管理容器网络(子命令:create/connect/disconnect/inspect ) |
--driver (网络驱动) |
docker network create my-net |
5. 容器数据管理
命令 | 作用 | 常用参数 | 示例 |
---|---|---|---|
docker volume |
管理数据卷(子命令:create/ls/inspect/rm ) |
--driver (卷驱动) |
docker volume create my-vol |
绑定挂载(-v 或 --mount ) |
挂载主机目录到容器 | -v /host/path:/container/path |
常用命令:
#列出正在运行的容器
docker ps #另起一个终端在linux机器下执行,而不是在ubuntu中执行()。
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器(包括已停止的)
docker stats # 查看容器资源占用
docker start/stop/restart 容器名/ID # 启动/停止/重启
docker pause/unpause 容器名/ID # 暂停/恢复
docker exec -it 容器名/ID /bin/bash # 进入运行中的容器
docker logs -f 容器名/ID # 查看日志(实时)
docker rm 容器名/ID # 删除已停止的容器
docker rm -f 容器名/ID # 强制删除运行中的容器
docker images # 列出本地镜像
docker inspect 镜像名/ID # 查看镜像详细信息
docker history 镜像名/ID # 查看镜像构建历史
docker build -t 镜像名:标签 . # 根据当前目录的 Dockerfile 构建镜像
docker rmi 镜像名/ID # 删除镜像
docker prune # 清理未被使用的镜像
Docker Compose(需单独安装)
docker-compose up -d # 启动服务栈(根据 docker-compose.yml)
docker-compose down # 停止并删除服务栈