目录
一、 Docker概述
Docker简介
Docker,翻译过来就是码头工人
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器完全使用沙盒机制,相互之间不会存在任何接口。几乎没有性能开销,可以很容易的在机器和数据中心运行。最重要的是,他们不依赖于任何语言、框架或者包装系统。
Docker是dotCloud公司开源的一个基于LXC的高级容器引擎,源码托管在Github上,基于go语言并且遵从Apache2.0协议开源。 GitHub地址:https://github.com/moby/moby
LXC主要通过Kernel的namespace实现每个用户实例之间的项目隔离,通过cgroup实现对资源的配额和调度。
名词解释
沙盒:沙盒也叫沙箱(sandbox)。在计算机领域指一种虚拟技术,而且多用于计算机安全技术。安全软件可以让它在沙盒中运行,如果含有恶意行为,则禁止程序的进一步运行,而这不会对系统造成任何危害。
LXC:Linux Container的简写。Linux Container 容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。
cgroup:控制组,Control Groups,是一种内核功能,用于限制、统计和隔离一个进程组(process groups)所使用的物理资源,如CPU、内存、磁盘输入输出等。从2.6.24内核引入,它将进程管理从cpuset中剥离出来,并非全新创造的。cgroup提供了一个虚拟文件系统,作为分组管理和各子系统设置的接口。因此,使用cgroup时,必须挂载cgroup文件系统。
cgroup的主要目的是实现资源限制和进程管理。通过将进程分组,可以对各个组内的进程进行资源限制,例如CPU、内存和磁盘输入输出等。这有助于确保系统资源得到合理分配,同时也可以避免单个进程过度消耗资源,导致系统性能下降。
docker官网: https://www.docker.com
docker中文库: https://www.docker.org.cn/
Docker版本演化与技术特征更新
1、Docker发展历程概述
Docker自2013年诞生以来,经历了从简单的容器工具到完整的容器生态系统的演变过程。其版本演化可以分为四个主要阶段:
1. 初创期(2013-2014)
-
2013年3月:Docker 0.1.0发布,基于LXC技术
-
2014年6月:Docker 1.0发布,标志着生产就绪
2. 成长期(2015-2016)
-
引入Swarm集群管理
-
建立开放容器倡议(OCI)标准
3. 成熟期(2017-2019)
-
采用新的版本命名方案(YY.MM)
-
分化为CE(社区版)和EE(企业版)
4. 现代期(2020至今)
-
深度集成Kubernetes
-
专注于开发者体验和安全增强
2、重大版本技术特征更新
Docker 1.0 (2014年6月)
-
核心技术:从LXC转向libcontainer
-
镜像格式:建立分层存储体系
-
网络模型:基础桥接网络支持
Docker 1.12 (2016年7月)
-
Swarm模式:内置容器编排功能
-
服务发现:内置DNS服务
-
安全增强:TLS加密通信
Docker 17.03 (2017年3月)
-
版本改革:采用YY.MM版本号
-
多架构支持:ARM平台正式支持
-
插件系统:卷和网络插件标准化
Docker 18.09 (2018年11月)
-
BuildKit:实验性下一代构建引擎
-
Rootless模式:非root用户运行容器
-
cgroups v2:初步支持新控制组系统
Docker 19.03 (2019年7月)
-
GPU支持:NVIDIA GPU容器化
-
性能优化:containerd集成改进
-
Windows容器:完善WSL2支持
Docker 20.10 (2020年12月)
-
BuildKit默认:取代经典构建引擎
-
Compose V2:重写为Go版本
-
检查点/恢复:实验性容器状态保存
Docker 23.0 (2023年1月)
-
构建革新:完全移除经典构建引擎
-
镜像管理:改进垃圾回收机制
-
安全扫描:内置漏洞扫描工具
3、关键技术演进路线
1. 容器运行时演进
-
libcontainer → runc → containerd
-
符合OCI运行时规范
-
gVisor、Kata Containers等安全容器支持
2. 构建系统革新
-
传统构建 → BuildKit
-
多阶段构建支持
-
构建缓存优化和并行构建
3. 网络模型发展
-
基础桥接网络 → overlay网络
-
Macvlan/IPvlan支持
-
服务网格集成能力
4. 存储驱动优化
-
AUFS → overlay2
-
快照和存储配额管理
-
卷插件生态系统
5. 安全增强路径
-
用户命名空间隔离
-
Rootless容器模式
-
内容信任和镜像签名
4、当前技术趋势
-
云原生集成:与Kubernetes深度整合
-
开发者体验:简化本地开发工作流
-
安全强化:默认安全配置和策略
-
性能优化:资源利用率和启动速度
-
多平台支持:ARM、RISC-V等架构
Docker容器技术与虚拟机的区别
相同点:docker容器技术和虚拟机技术,都是虚拟化技术。
不同点:
-
虚拟机技术:
-
docker容器技术:
通过图片,我们很明显的看到docker有着比虚拟机更少的抽象层。 由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。所以docker效率比虚拟机效率高。达到了秒级启动的地步。
Docker相较于VM的优点
-
比VM小、快,Docker容器的尺寸减小相比于整个虚拟机大大简化了分布到云和分发时间的开销。Docker启动一个容器实例时间仅仅需要几秒钟。
-
Docker是一个开放的平台,构建、发布和运行分布式应用程序。
-
开发人员不需要关注具体是哪个Linux操作系统。
-
Google、微软(azure)、亚马逊(AWS)、IBM等都支持docker。
-
Docker支持Unix/Linux操作系统,也支持Windows和Mac。
-
一次封装,到处运行
Docker局限性
Docker用于应用程序时是最有用的,但并不包含数据。日志、数据库等通常放在Docker容器外。一个容器的镜像通常都很小,不用存储大量数据,存储可以通过外部挂载等方式使用,比如:NFS、ipsan、MFS、ceph等 ,或者docker -v 命令进行映射磁盘。 总之,docker只用于计算,存储交给别人。
Docker通常用于如下场景
-
web应用的自动化打包和发布;
-
自动化测试和持续集成、发布;
-
在服务型环境中部署和调整数据库或其他的后台应用;
-
从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
二、 Docker 架构
Docker 包括三个基本概念
-
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
-
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
-
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
概念 | 说明 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 CentOS 系统。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (SDK | Docker Docs) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
三、 Docker安装
1、使用官方安装脚本自动安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
2、手动安装
#rocky8 安装
yum remove runc -y
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce
3、启动 Docker
[root@localhost ~]# systemctl start docker
##通过运行 hello-world 镜像来验证是否正确安装了 Docker Engine-Community 。
[root@localhost ~]# docker run hello-world
4、卸载 Docker
##删除安装包
[root@localhost ~]# yum remove docker-ce
##删除镜像、容器、配置文件等内容
[root@localhost ~]# rm -rf /var/lib/docker
四、 Docker 镜像加速
国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,
##编辑配置文件
[root@localhost ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": [
"https://0vmzj3q6.mirror.aliyuncs.com",
"https://docker.m.daocloud.io",
"https://mirror.baidubce.com",
"https://dockerproxy.com",
"https://mirror.iscas.ac.cn",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://noohub.ru",
"https://vlgh0kqj.mirror.aliyuncs.com"
]
}
##重新启动服务
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
五、/etc/docker/daemon.json配置文件
1、核心配置
-
debug
布尔值(true
/false
),启用调试模式,输出更详细的日志(默认false
)。 -
log-level
日志级别,可选值:debug
、info
、warn
、error
、fatal
(默认info
)。 -
hosts
指定 Docker 守护进程监听的地址(如 TCP 端口或 Unix 套接字),例如:json
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
⚠️ 注意:若通过
systemd
管理 Docker,需配合服务配置文件修改,避免冲突。 -
pidfile
指定守护进程 PID 文件的路径(默认/var/run/docker.pid
)。 -
root
Docker 数据根目录(默认/var/lib/docker
),存储镜像、容器等数据。 -
exec-root
容器执行状态的根目录(默认/var/run/docker
)。 -
max-concurrent-downloads
同时下载镜像的最大并发数(默认 3)。 -
max-concurrent-uploads
同时上传镜像的最大并发数(默认 5)。
2、网络配置
-
bridge
指定默认桥接网络使用的 Linux 网桥(默认docker0
),若设为none
则禁用默认桥接。 -
default-address-pools
为自动创建的网络分配子网的地址池,例如:json
"default-address-pools": [ {"base": "172.80.0.0/16", "size": 24}, {"base": "172.90.0.0/16", "size": 24} ]
-
dns
容器默认使用的 DNS 服务器列表,例如:["8.8.8.8", "8.8.4.4"]
。 -
dns-opts
DNS 选项(如ndots:2
、timeout:3
),格式:["ndots:2"]
。 -
dns-search
DNS 搜索域列表,例如:["example.com", "sub.example.com"]
。 -
fixed-cidr
默认桥接网络的子网掩码(如192.168.1.0/24
),限制容器 IP 范围。 -
fixed-cidr-v6
IPv6 子网掩码(如2001:db8::/64
)。 -
ipv6
布尔值,启用 IPv6 支持(默认false
)。 -
ip-forward
布尔值,启用内核 IP 转发(默认true
,建议保持开启)。 -
ip-masq
布尔值,对容器出站流量启用 IP 伪装(NAT,默认true
)。 -
userland-proxy
布尔值,启用用户态代理处理容器端口映射(默认true
),禁用可能提升性能但需注意防火墙配置。 -
userland-proxy-path
用户态代理程序的路径(默认docker-proxy
)。
3、存储配置
-
storage-driver
指定默认存储驱动(如overlay2
、devicemapper
、btrfs
等,推荐overlay2
)。 -
storage-opts
存储驱动的额外选项,例如overlay2
的配置:json
"storage-opts": ["overlay2.override_kernel_check=true"]
-
graph
(已过时,推荐用root
)数据根目录的旧称,与root
功能相同。
4、镜像与仓库配置
-
registry-mirrors
镜像仓库加速器列表(加速拉取国外镜像),例如:json
"registry-mirrors": [ "https://mirror.aliyuncs.com", "https://hub-mirror.c.163.com" ]
-
insecure-registries
允许非 HTTPS 访问的镜像仓库(如私有仓库),例如:json
"insecure-registries": ["192.168.1.100:5000"]
-
blocked-registries
禁止访问的镜像仓库列表,例如:["example.com/forbidden"]
。 -
allowed-registries
仅允许访问的镜像仓库列表(白名单),例如:["docker.io", "gcr.io"]
。
5、安全配置
-
tls
布尔值,启用 TLS 加密(默认false
)。 -
tlscacert
CA 证书路径(如/etc/docker/ca.pem
)。 -
tlscert
服务器证书路径(如/etc/docker/server.pem
)。 -
tlskey
服务器私钥路径(如/etc/docker/server-key.pem
)。 -
tlsverify
布尔值,启用客户端证书验证(默认false
,需配合tls
开启)。 -
authorization-plugins
授权插件列表,用于自定义容器访问控制。 -
seccomp-profile
默认 seccomp 安全配置文件路径(限制容器系统调用),默认使用内置配置。 -
default-ulimits
容器默认的资源限制(ulimits),例如:json
"default-ulimits": { "nofile": {"Name": "nofile", "Hard": 65536, "Soft": 1024} }
6、容器与资源限制
-
default-shm-size
容器默认的/dev/shm
共享内存大小(如64m
、1g
,默认64m
)。 -
oom-score-adjust
Docker 守护进程的 OOM 优先级调整值(范围 -1000 至 1000,默认 -500),值越低越不容易被 OOM 杀死。 -
live-restore
布尔值,启用live-restore
模式:Docker 守护进程重启时,已运行的容器不停止(默认false
)。 -
init
布尔值,默认在容器中启动init
进程(处理僵尸进程,默认false
)。
7、其他配置
-
labels
为 Docker 守护进程添加元数据标签(键值对),例如:["com.example.environment=production"]
。 -
experimental
布尔值,启用实验性特性(默认false
,不建议生产环境使用)。 -
features
启用特定功能(如buildkit
构建工具),例如:json
"features": {"buildkit": true}
查看当前启动的容器
查看当前启动的镜像
下载nginx镜像(应用镜像)
下载alpine镜像(系统镜像,做镜像优化用)
运行alpine,并更新安装源
安装软件