docker的基本认识

容器

容器生态系统

一、容器生态与基础认知
核心概念
  • Docker 是轻量级容器技术,核心价值是可移植性环境一致性,解决 "开发环境能跑,生产环境报错" 的问题
  • 容器生态三大核心模块:核心技术 (容器规范、runtime、管理工具等)、平台技术 (编排引擎、管理平台、PaaS)、支持技术(网络、监控、日志等)
  • 核心对比:容器 vs 虚拟机(容器共享宿主机内核,启动秒级、资源占用低;虚拟机独立内核,隔离性强、资源消耗高)
关键组件
  • 容器规范:OCI 制定 runtime spec 和 image format spec,保证不同容器兼容性
  • 主流 runtime:runc(Docker 默认)、lxc、rkt
  • 仓库(Registry):Docker Hub(公共)、私有仓库(Harbor、Docker Registry)
容器核心技术:

指能够让 container 在 host os上运行起来的那些技术

容器规范

为了保证容器生态的健康发展,保证不同容器之间能够兼容

容器 runtime

runtime 是容器真正运行的地方

容器管理工具

光有 runtime 还不够,用户得有工具来管理容器啊。容器管理工具对内与 runtime 交互,对外为用户提

供 interface,比如 CLI。

容器定义工具

容器定义工具允许用户定义容器的内容和属性,这样容器就能够被保存,共享和重建。

docker image 是 docker 容器的模板,runtime 依据 docker image 创建容器。

dockerfile 是包含若干命令的文本文件,可以通过这些命令创建出 docker image。

ACI (App Container Image) 与 docker image 类似,只不过它是由 CoreOS 开发的 rkt 容器的 image 格

式。

Registry

容器是通过 image 创建的,需要有一个仓库来统一存放 image,这个仓库就叫做 Registry。

容器 OS

容器 OS 是专门运行容器的操作系统。

容器平台技术:

容器平台技术能够让容器作为集群在分布式环境中运

行。

安装docker

bash 复制代码
yun install -y docker-ce
镜像加速器华为
镜像加速器配置
  • 阿里云 / 华为云加速器:修改/etc/docker/daemon.json,添加registry-mirrors字段,重启 docker 服务
  • 验证:docker info查看 Registry Mirrors 字段
bash 复制代码
vi /etc/docker/daemon.json
{
"registry-mirrors": [ 
"https://054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com" ]
}
# 按"Esc",输入:wq保存并退出。
#重启容器引擎
 systemctl restart docker

#确认配置结果
 docker info
运行的第一个容器
bash 复制代码
docker run hello-world

其过程可以简单的描述为:

  1. 从本地查找hello-wrold镜像,没找到
  2. 从 Docker Hub 下载hello-world镜像。
  3. 启动hello-world容器。

容器镜像服务SWR

容器存储软件

镜像运行容器

架构

Docker 客户端

最常用的 Docker 客户端是 docker 命令。

Docker 服务器

Docker daemon 是服务器组件,以 Linux 后台服务的方式运行

Docker 镜像

可将 Docker 镜像看着只读模板,通过它可以创建 Docker 容器。

Registry

Registry 是存放 Docker 镜像的仓库,Registry 分私有和公有两种。

Docker 容器

Docker 容器就是 Docker 镜像的运行实例。

镜像

base镜像

base 镜像有两层含义:

  1. 不依赖其他镜像,从 scratch 构建。
  2. 其他镜像可以之为基础进行扩展。

所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。
只有容器层是可写的,容器层下面的所有镜像层都是只读的。

构造镜像

Docker 提供了两种构建镜像的方法:

  1. docker commit 命令
  • 运行容器

  • 修改容器

  • 将容器保存为新的镜像

bash 复制代码
#-it以交互模式进入容器
docker run -it ubuntu

#安装软件
apt-get update
apt-get install -y vim

#查看当前运行的容器
docker ps 

#保存为新的镜像
docker commit 原本镜像名 新的镜像名

#查看新的镜像属性
docker images

#可以直接使用新的镜像,新的容器含有vim
  1. Dockerfile 构建文件
bash 复制代码
docker build -f [Dockerfile路径] [构建上下文路径]

#默认为Dockerfile
vim Dockerfile
#
FROM ubuntu
RUN  apt-get update && apt-get install -y vim
#
docker build -t ubuntu-with-vim-dockerfile

① 当前目录为 /root。

② Dockerfile 准备就绪。

③ 运行 docker build 命令,-t 将新镜像命名为

ubuntu-with-vim-dockerfile ,命令末尾的 . 指明

build context 为当前目录。Docker 默认会从 build context 中查找 Dockerfile 文件,我们也可以通过

f 参数指定 Dockerfile 的位置。

④ 从这步开始就是镜像真正的构建过程。 首先 Docker 将 build context 中的所有文件发送给 Docker

daemon。build context 为镜像构建提供所需要的文件或目录。

Dockerfile 中的 ADD、COPY 等命令可以将 build context 中的文件添加到镜像。此例中,build context

为当前目录

/root ,该目录下的所有文件和子目录都会被发送给 Docker daemon。

所以,使用 build context 就得小心了,不要将多余文件放到 build context,特别不要把 /、

为 build context,否则构建过程会相当缓慢甚至失败。

⑤ Step 1:执行

FROM ,将 ubuntu 作为 base 镜像。

⑥ Step 2:执行

RUN ,安装 vim

/usr 作

⑦ 镜像构建成功。

⑧ 镜像重命名为ubuntu-with-vim-dockerfile

bash 复制代码
#会显示镜像的构建历史,也就是 Dockerfile 的执行过程
docker history
镜像的缓存特性

Docker 会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经存在,就直接使用,无需重新创建

**重点:**之前已经运行过相同的 RUN 指令,这次直接使用缓存中的镜像层。

==注意:==在构建镜像时不使用缓存,可以在 docker build 命令中加上 --no-cache 参数。

Dockerfile 中每一个指令都会创建一个镜像层,上层是依赖于下层的。无论什么时候,只要某一层发生变化,其上面所有层的缓存都会失效。也就是说,如果我们改变 Dockerfile 指令的执行顺序,或者修改或添加指令,都会使缓存失效。

==注意:==busybox 镜像中没有 bash,busybox中用的是sh;Ubuntu中是bash。

Dockerfile常用指令

FROM

指定 base 镜像。第一条必须是FROM
MAINTAINER

设置镜像的作者,可以是任意字符串。
COPY

将文件从 build context 复制到镜像。

COPY 支持两种形式:

  1. COPY src dest
  2. COPY ["src", "dest"]
    注意:src 只能指定 build context 中的文件或目录。

ADD

与 COPY 类似,从 build context 复制文件到镜像。不同的是,如果 src 是归档文件(tar, zip, tgz, xz 等),文件会被自动解压到 dest。
ENV

设置环境变量,环境变量可被后面的指令使用。

EXPOSE

指定容器中的进程会监听某个端口,Docker 可以将该端口暴露。
VOLUME

将文件或目录声明为 volume。
WORKDIR

为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录。
RUN

在容器中运行指定的命令。
CMD

容器启动时运行指定的命令。

Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效。CMD 可以被 docker run 之后的参数替换。
ENTRYPOINT

设置容器启动时运行的命令。

Dockerfile 中可以有多个 ENTRYPOINT 指令,但只有最后一个生效。CMD 或 docker run 之后的参数会被当做参数传递给 ENTRYPOINT

RUN vs CMD vs ENTRYPOINT
  1. RUN 执行命令并创建新的镜像层,RUN 经常用于安装软件包。
  2. CMD 设置容器启动后默认执行的命令及其参数,但 CMD 能够被
    数替换。
  3. ENTRYPOINT 配置容器启动时运行的命令。
shell和exec格式

Shell 格式

bash 复制代码
<instruction> <command>

#
RUN apt-get update && apt-get install -y 

exec格式

bash 复制代码
<instruction> ["executable", "param1", "param2", ...]

#
ENTRYPOINT ["/bin/echo","Hello, $name"]

注意:CMD 和 ENTRYPOINT 推荐使用 Exec 格式,因为指令可读性更强,更容易理解。RUN 则两种格式都可

以。

镜像命名

tag

一个高效的版本命名方案可以让用户清楚地知道当前使用的是哪个镜像,同时还可以保持足够的灵活性。

每个 repository 可以有多个 tag,而多个 tag 可能对应的是同一个镜像

自定义镜像
bash 复制代码
 #启动registry容器
 docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:2
#-d 是后台启动容器。
#-p 将容器的 5000 端口映射到 Host 的 5000 端口。5000 是 registry 服务端口。
#-v 将容器 /var/lib/registry 目录映射到 Host 的 /myregistry,用于存放镜像数据。

#通过docker tag 重命名镜像,使之与 registry 匹配
docker tag httpd:latest localhost:5000/httpd:v1

#通过docker push 上传镜像
 docker push localhost:5000/httpd:v1
 
 #可以通过docker pull 下载刚才上传的镜像
 docker pull localhost:5000/httpd:v1
企业级私有仓库Harbor
私有仓库搭建
  • Docker Registry:docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:2
  • Harbor:支持用户权限管理、镜像扫描,企业级首选
总结

下面是镜像的常用操作子命令:
images 显示镜像列表
history 显示镜像构建历史
commit 从容器创建新镜像
build 从 Dockerfile 构建镜像
tag 给镜像打 tag
pull 从 registry 下载镜像
push 将 镜像 上传到 registry
rmi 删除 Docker host 中的镜像
search 搜索 Docker Hub 中的镜像
rm 删除容器

save 保存本地镜像为文件

load 将本地镜像文件导入本地

容器

运行容器:docker run=docker create + docker start

查看容器:docker ps 或者docker ps -a

容器核心操作
容器生命周期
  • 状态转换:创建(created)→启动(running)→暂停(paused)→停止(exited)→删除(removed)

  • 核心命令:

    • 创建启动:docker run -d(后台)-p(端口映射)--name(命名)--restart(自动重启)
    • 进入容器:docker exec -it 容器名 bash(推荐)、docker attach 容器名
    • 停止删除:docker stop 容器名docker rm -f 容器名(强制删除)
    • 查看信息:docker ps(运行容器)、docker inspect 容器名(详细信息)
资源限制
  • 内存限制:-m 200M --memory-swap=300M(内存 200M+swap100M)
  • CPU 限制:--cpu-shares 512(权重,默认 1024,资源紧张时生效)

网络

none, host, bridge 三个自动创建的网络

容器网络配置
网络类型
  1. none 网络:仅 lo 接口,无外网访问,适用于安全隔离场景
  2. host 网络:共享宿主机网络栈,性能好,无端口映射,需注意端口冲突
  3. bridge 网络(默认):docker0 网桥,容器通过 veth pair 连接,自动分配 172.17.0.0/16 网段 IP
自定义网络
  • 创建:docker network create --driver bridge --subnet 网段 --gateway 网关 网络名
  • 容器连接网络:docker run --network 网络名docker network connect 网络名 容器名
容器通信
  • 同一网络:直接通过 IP 或容器名(user-defined 网络支持 DNS 解析)通信

  • 跨网络:容器连接多个网络(docker network connect

  • 内外通信:

    • 容器访问外网:NAT 转发(iptables MASQUERADE 规则)
    • 外网访问容器:端口映射(-p 宿主机端口:容器端口

容器存储配置

存储类型
  1. storage driver:管理镜像层和容器层,默认 overlay2(CentOS)、aufs(Ubuntu)

  2. Data Volume

    (持久化存储):

    • bind mount:宿主机目录 / 文件直接挂载(-v 宿主机路径:容器路径),支持只读(:ro
    • docker managed volume:docker 自动创建/var/lib/docker/volumes/下的目录,移植性强
数据共享
  • 容器与宿主机:bind mount 或docker cp命令

  • 容器间共享:

    • 共享 bind mount 目录
    • volume container:专门提供 volume 的容器,通过--volumes-from复用
    • data-packed volume container:数据打包到镜像,移植性极强
生命周期管理
  • 备份:复制 volume 目录(如/myregistry
  • 恢复:覆盖 volume 目录
  • 销毁:docker rm -v 容器名(删除容器同时删除关联 volume),孤儿 volume 通过docker volume rm删除

Docker Compose

核心作用
  • 定义和运行多容器应用,通过docker-compose.yml统一管理服务、网络、存储
  • 核心概念:服务(service)、项目(project)
基础使用
  • 配置文件:yaml 格式,定义 services(镜像、端口、环境变量、依赖等)

  • 核心命令:

    • 启动:docker compose up -d
    • 停止:docker compose down(删除容器、网络)
    • 查看状态:docker compose ps
    • 语法检测:docker compose config -q

图形界面管理

  • DockerUI:轻量易用,docker run -d -p 8999:8999 -v /var/run/docker.sock:/var/run/docker.sock joinsunsoft/docker.ui

  • Portainer:功能全面,支持集群管理,docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

container

一、核心定位与生态地位
  1. 核心角色:独立于 Docker 的容器运行时,负责单机容器镜像管理、容器启停、网络 / 存储配置,兼容 OCI 规范,可对接 runC、kata 等运行时。
  2. 生态演进:从 Docker 核心组件剥离后捐给 CNCF,因无缝适配 Kubernetes CRI 接口,替代 Docker 成为 K8s 1.20+ 推荐运行时。
  3. 性能优势:相比 Docker、CRI-O,在容器启动、停止、删除等操作上性能更优,资源占用更轻量。
二、架构设计
  1. 架构模式:标准 C/S 架构,服务端通过 gRPC 暴露 API,客户端(ctr、nerdctl 等)通过 API 操作。

  2. 核心子系统:

    • Bundle 子系统:处理容器文件系统(配置、元数据、根文件系统)。
    • Runtime 子系统:执行容器(创建、启动等)。
  3. 关键插件:Content Plugin(镜像内容存储)、Snapshot Plugin(文件系统快照)、Metrics(监控指标暴露)等,插件间相互依赖。

  4. 核心模块:Storage(镜像 / 快照存储)、Metadata(元数据管理)、Runtime(容器运行)。

三、安装部署
1. 安装方式
安装方式 适用场景 关键步骤
YUM 安装 单机测试 配置阿里云 Docker YUM 源 → 安装 containerd.io → 启动服务 → 验证 ctr 命令
二进制安装 K8s 集群 下载 cri-containerd-cni 包(含 runC、CNI 插件)→ 复制二进制文件和服务配置 → 生成 config.toml 配置
2. 依赖说明
  • 二进制安装需单独安装 seccomp(安全计算模式),runc 需匹配版本。
  • K8s 场景需配置 CNI 插件(如 bridge、host-local)。
四、核心操作(ctr 命令)
1. 镜像管理
  • 拉取:ctr images pull [镜像地址](需指定完整仓库地址,支持华为云、Harbor 等)。
  • 查看:ctr images ls(支持简写 ctr i ls)。
  • 导出 / 导入:ctr images export [文件] [镜像] / ctr images import [文件]
  • 标签修改:ctr images tag [原镜像] [新标签]
  • 删除:ctr images rm [镜像]
  • 挂载:ctr images mount [镜像] [目录](查看镜像内部文件)。
2. 容器管理
  • 核心概念:静态容器(container)+ 动态任务(task),容器需通过 task 启动。
  • 创建静态容器:ctr container create [镜像] [容器名]
  • 启动动态任务:ctr task start -d [容器名](-d 后台运行)。
  • 进入容器:ctr task exec --exec-id $RANDOM -t [容器名] /bin/sh
  • 直接运行容器:ctr run -d [镜像] [容器名](一步完成创建 + 启动)。
  • 生命周期操作:暂停(ctr tasks pause)、恢复(ctr tasks resume)、停止(ctr tasks kill)、删除(先删 task 再删 container)。
3. 命名空间(Namespace)
  • 作用:隔离容器资源(镜像、容器),默认命名空间为 default(Docker 环境默认 moby)。
  • 核心命令:创建(ctr namespace create)、查看(ctr namespace ls)、删除(ctr namespace rm)、指定命名空间操作(ctr -n [命名空间] [命令])。
4. 私有仓库对接
  • 对接 Harbor:需指定 --plain-http 支持 HTTP 协议,推送时需携带用户名密码(--user "用户名:密码")。
  • 配置 hosts 解析:私有仓库域名需在宿主机 /etc/hosts 中配置 IP 映射。
五、关键工具对比与使用
1. nerdctl(推荐单机使用)
  • 核心优势:完全兼容 Docker CLI 语法,降低 Docker 用户迁移成本。
  • 核心功能:支持镜像 / 容器 / 网络 / 存储管理,命令与 Docker 一致(如 nerdctl runnerdctl images)。
  • 额外配置:需安装 CNI 插件,配置镜像加速(修改 /etc/containerd/certs.d)。
2. crictl(K8s CRI 调试专用)
  • 定位:Kubernetes CRI 接口专用工具,用于调试 K8s 节点上的容器运行时。
  • 核心配置:通过 /etc/crictl.yaml 指定 runtime-endpoint(unix:///run/containerd/containerd.sock)。
  • 关键命令:查看容器(crictl ps)、拉取镜像(crictl pull)、执行命令(crictl exec)。
3. 命令对照(与 Docker 兼容)
功能 Docker 命令 Containerd 工具命令
查看镜像 docker images ctr i ls / nerdctl images / crictl images
运行容器 docker run ctr run / nerdctl run
进入容器 docker exec ctr task exec / nerdctl exec / crictl exec
拉取镜像 docker pull ctr i pull / nerdctl pull / crictl pull
删除容器 docker rm ctr c rm / nerdctl rm / crictl rm
六、存储与网络
  1. 存储 :支持 bind mount 和容器卷(volume),卷存储路径为 /var/lib/nerdctl/[命名空间]/volumes
  2. 网络 :默认创建 nerdctl0 网桥(类似 Docker 的 docker0),容器通过 veth pair 连接网桥,默认网段 10.4.0.0/24
  3. 网络模式 :支持 host(共享宿主机网络)、bridge(默认)、none(隔离网络)。
七、核心特性与使用场景
  1. 核心特性:OCI 兼容(支持 Docker 镜像)、轻量级(无多余功能)、K8s 无缝集成、命名空间隔离。
  2. 适用场景:
    • 单机容器管理:用 nerdctl 替代 Docker,兼容原有命令。
    • K8s 集群:作为容器运行时,通过 CRI 接口对接 kubelet。
    • 企业级部署:搭配 Harbor 私有仓库,实现镜像安全分发。
相关推荐
FatHonor2 小时前
Nginx作用以及应用场景
运维·nginx
Du_chong_huan2 小时前
《Linux 是怎样工作的》第 2 章:用户模式实现的功能
linux·运维·服务器
H_老邪2 小时前
Docker 学习之路-从入门到放弃-Jenkins:4
容器·jenkins
sugar15692 小时前
Trae 添加项目规则,快速完成crmeb项目本地开发环境搭建
docker·容器·trae
学电子她就能回来吗2 小时前
【无标题】
linux·运维·服务器
yeflx2 小时前
Ubuntu22.04安装Openclaw
运维
H_老邪2 小时前
Docker 学习之路-从入门到放弃:3
学习·docker·容器
F1FJJ2 小时前
Shield CLI v0.3.3 新增 PostgreSQL 插件:浏览器里管理 PG 数据库
网络·网络协议·docker·postgresql·容器·go
技术栈壳2 小时前
搭建docker hub私有仓库
运维·docker·容器