一、docker基础
1.1、docker与传统虚拟机性能对比
| 对比项 | 虚拟机 | docker容器 |
|---|---|---|
| 启动速度 | 龟速 | 秒速 |
| 镜像大小 | ubuntu:1GB以上 | ubuntu:195MB |
| 集成方便度 | 软件都是手动安装 | dockerfile配置自动化安装 |
| 内存访问效率 | 慢,需要先访问虚拟地址 | 基本等同于宿主机 |
| cpu损耗率 | 50%上下 | 接近0损耗 |
1.2、docker与传统虚拟机架构对比
云计算核心技术之虚拟化技术
https://blog.csdn.net/xiaochenXIHUA/article/details/150452780
云计算核心技术之容器技术
https://blog.csdn.net/xiaochenXIHUA/article/details/150481966
docker相比传统虚拟机少了一层管理程序,且是没有 GuestOS 的轻量级虚拟机,多个容器共享一个 OS 内核,容器中包含需要部署的应用和它依赖的系统环境,容器大小通常只有几十到几百 MB。

1.3、如何理解docker
**Docker的基础理念是:**打包应用以及依赖环境到一个可移植的容器中,然后发布到任何平台的主机(Linux、windows、MacOS)上都能正常运行。
想要搞懂Docker,只用记住它的两句口号就行:
第一句,是"Build, Ship and Run",即【搭建、发送、运行】,三板斧。
第二句口号是:"Build once,Run anywhere" 即【一次构建,到处运行】。
1.4、容器技术的发展方向

| 概念 | 简介 | 场景 | 特点 | 工具 | 缺点 |
|---|---|---|---|---|---|
| 单机容器 | 单台机器跑单个容器 | 测试、简单服务 | 轻量、隔离 | Docker、Podman | 功能单一、无高可用 |
| 单机多容器 | 单机跑多个关联容器 | 开发环境、小项目 | 依赖管理、一键启动 | Docker Compose | 单机瓶颈、无分布式 |
| 容器集群 | 多机组成资源池 | 生产多服务部署 | 资源共享、跨机调度 | K8s 集群、Swarm | 需编排工具才能自动化 |
| 容器编排 | 集群自动化管理 | 微服务、大规模系统 | 自愈、扩缩容、高可用 | Kubernetes | 复杂、学习成本高 |
| 容器技术发展方向 | 简单理解 | 典型工具 | 说明 |
|---|---|---|---|
| 单机容器 | 一个容器 | docker run | 简介 在单台物理机 / 虚拟机上运行单个独立容器,是容器最基础的使用方式。 使用场景 * 简单应用测试、开发环境 * 单个微服务、小工具运行 * 学习 Docker 基础 特点 * 轻量、启动快 * 环境隔离,不影响宿主机 * 部署简单 工具 * Docker * Podman 缺点 * 只能跑单个服务,复杂应用无法支撑 * 无高可用、无自愈 * 手动管理,效率低 |
| 多容器控制(单机) | 一台机器上多个容器互相配合 | docker-compose | 简介 在同一台机器上运行多个相互关联的容器,并统一管理它们的启动顺序、网络、依赖。 使用场景 * 本地开发环境:前端 + 后端 + 数据库 * 小型项目,一台服务器足够 * 测试多服务联动 特点 * 多个容器共享同一台主机 * 可配置依赖、网络互通 * 部署和启动一键完成 工具 * Docker Compose * Docker Stack(单机模式) 缺点 * 仍局限在单机,无法跨机器 * 无负载均衡、无自动扩缩容 * 机器宕机则全部服务不可用 |
| 容器集群 | 多台机器拼成一个大池子 | K8s 集群、Swarm | 简介 将多台服务器(节点) 组合成一个统一的资源池,容器可在集群内任意节点运行。 使用场景 * 生产环境多服务部署 * 高并发、高可用业务 * 需要多机器分担压力 特点 * 多节点统一管理 * 资源池化,可弹性调度 * 具备分布式基础能力 工具 * Kubernetes 集群 * Docker Swarm 集群 * K3s、K0s 等轻量集群 缺点 * 仅提供集群基础能力,不包含完整自动化管理 * 仍需人工或上层工具控制容器调度 * 搭建和维护成本比单机高 |
| 容器编排 | 自动调度、自愈、扩缩容 | Kubernetes | 简介 对容器集群进行自动化管理,包括调度、扩缩容、自愈、更新、服务发现等,是容器化的高级形态。 使用场景 * 企业级生产环境 * 微服务架构大规模部署 * 需要高可用、自动运维的系统 特点 * 自动调度容器到合适节点 * 故障自愈、自动重启 * 滚动更新、灰度发布 * 自动扩缩容、负载均衡 工具 * Kubernetes(K8s)主流 * Docker Swarm * Nomad * OpenShift 缺点 * 架构复杂,学习成本高 * 部署、维护、排错难度大 * 小项目使用会 "过重" |
二、Docker的安装与加速器配置
2.1、使用yum命令在线安装Docker
bash
#使用yum在线安装docker------以AlmaLinux9为例
#1-安装docker-ce的依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
#2-国内直接添加阿里云的docker-ce的yum源
yum-config-manager --add-repo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#3-安装docker-ce
yum makecache
yum install docker-ce -y
#4-启动docker-ce并设置开机自启
systemctl start docker
systemctl enable docker
#5-查看版本
docker -v






2.2、国内的docker镜像加速器配置
由于国内直接从 Docker Hub 拉取镜像有时会遇到网络问题,因此需要配置镜像加速器,配置方法如下:
bash
#国内的docker镜像加速器配置
mkdir /etc/docker
vim /etc/docker/daemon.json
#【daemon.json】文件的完整内容
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://proxy.1panel.live",
"https://docker.xuanyuan.me",
"https://docker.m.daocloud.io",
"https://docker.rainbond.cc",
"https://docker.1panel.live"
]
}
#重载docker-ce的配置与服务
systemctl daemon-reload
systemctl restart docker
#查看docker的信息(若底部能够正常显示我们配置的【/etc/docker/daemon.json】文件的镜像加速地址则表示配置成功)
docker info
#测试拉取镜像是否正常(能正常拉取镜像下来则表示正常,若长时间等待没有反应或者拉取失败报错,则可考虑将DNS设置为:223.5.5.5、8.8.8.8)
docker pull nginx:1.28.3





**注意:**即便配置了好了国内的docker镜像加速器,可以正常拉取到镜像;但还是无法查找docker镜像,会提示"Error response from daemon: Get "https://index.docker.io/v1/search?q=nginx\&n=25": dial tcp [2a03:2880:f131:83:face:b00c:0:25de]:443: i/o timeout"错误(这是因为配置的docker镜像加速器只针对下载,无法实现查找镜像)。

2.3、使用二进制文件手动安装Docker
bash
#使用二进制文件手动安装docker
#1-下载对应设备cpu架构的docker二进制文件(如:我这里是x86_64架构)
wget https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/docker-29.4.0.tgz -c -P /data
#2-解压下载好的二进制docker文件
cd /data
tar -zxvf docker-29.4.0.tgz
#3-将解压好的docker文件都复制到执行目录(/usr/local/bin)
cd docker/
mkdir -p /usr/local/bin
cp * /usr/local/bin
#4-编写docker服务
#5-国内的docker镜像加速器配置
mkdir /etc/docker
vim /etc/docker/daemon.json
#【daemon.json】文件的完整内容
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://proxy.1panel.live",
"https://docker.xuanyuan.me",
"https://docker.m.daocloud.io",
"https://docker.rainbond.cc",
"https://docker.1panel.live"
]
}
#6-启动docker-ce服务并设置开机自启
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
#7-查看docker的信息(若底部能够正常显示我们配置的【/etc/docker/daemon.json】文件的镜像加速地址则表示配置成功)
docker info
#8-测试拉取镜像是否正常(能正常拉取镜像下来则表示正常,若长时间等待没有反应或者拉取失败报错,则可考虑将DNS设置为:223.5.5.5、8.8.8.8)
docker pull nginx:1.28.3
#9-查看版本
docker -v
bash
#4-编写docker服务
vi /usr/lib/systemd/system/docker.service
#【docker.service】的文件的完整内容
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service time-set.target
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/local/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
OOMScoreAdjust=-500
[Install]
WantedBy=multi-user.target






三、建立docker用户组及其风险
默认情况下,docker命令会使用Unix socket与Docker引擎通讯。而只有root用户和docker组的用户才可以访问Docker引擎的Unix socket。出于安全考虑,一般Linux系统上不会直接使用root用户。因此,更好地做法是将需要使用docker的用户加入docker用户组。
注意:把用户加入 docker 用户组,能解决「每次用 docker 都要 sudo」的麻烦,但 并不能消除安全隐患,反而引入了新的、更隐蔽的权限风险( 任何能访问 /var/run/docker.sock 的用户,等价于拥有宿主机 root 权限)。
拥有了宿主机权限就等于拥有以下权限( 普通用户就可以提取到root用户权限,因此不能轻易给普通用户添加到docker用户组):
- 可以启动容器,挂载宿主机根目录
/ - 在容器内以 root 操作宿主机文件
- 随意创建特权容器、修改系统配置
bash
#典型提权命令(只要在 docker 组就能执行):
docker run -it --rm -v /:/host alpine chroot /host
#提权命令解析:
#启动一个临时 Alpine 容器,把宿主机整个系统挂载到容器的/host,用chroot切换根目录到/host,现在就等于直接登录了宿主机
#-v /:/host:把宿主机全盘挂载进容器
#chroot /host:切换根目录,直接操作宿主机
bash
#实现普通用户也能够使用docker操作
#1-创建docker用户组
groupadd docker
#2-将需要使用docker的用户添加到【docker】用户组中(如:将coffeemilk用户添加到docker用户组)
usermod -aG docker coffeemilk
#3-退出当前终端或切换到普通用户执行docker命令测试(如:切换到普通用户coffeemilk)
su - coffeemilk
docker ps
docker images
bash
#解决普通用户添加到docker用户组后,使用docker报错"permission denied while trying to connect to the docker API at unix:///var/run/docker.sock"方法(也就是说【/var/run/docker.sock】文件的属主必须是root,属组是docker才正确)
#1-创建docker.sock文件目录
mkdir -p /etc/systemd/system/docker.socket.d/
#2-配置docker.sock文件的权限
cat > /etc/systemd/system/docker.socket.d/override.conf << EOF
[Socket]
SocketMode=0660
SocketUser=root
SocketGroup=docker
EOF
#3-重启docker让配置生效
systemctl restart docker




