Docker容器实践——docker的安装与加速器配置

一、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
相关推荐
小夏子_riotous2 小时前
Docker学习路径——1、简介
linux·运维·服务器·docker·容器·云计算
walkerLing3 小时前
Docker Day2
运维·docker·容器
牛奶咖啡133 小时前
Docker容器实践——docker中的镜像、容器与仓库
docker·容器·docker的镜像·docker的容器·docker的仓库·docker的容器操作命令·docker的镜像操作命令
从零开始学习人工智能3 小时前
Windows 下 Docker + WSL2 + NVIDIA GPU 完整配置指南(2026 最新实测)
windows·docker·容器
岳来3 小时前
网络小白docker network create时如何指定subnet 和gateway
网络·docker·gateway·subnet
marsh02064 小时前
32 openclaw容器化部署:Docker与Kubernetes集成指南
docker·ai·容器·kubernetes·编程·技术
一招定胜负4 小时前
docker基础知识
docker·容器·eureka
馨谙4 小时前
Docker常用命令
运维·docker·容器
虎头金猫4 小时前
GodoOS是一款轻量级云端办公系统,整合Word、Excel、PPT等常用工具,支持Docker 一键部署,随时随地远程办公
运维·服务器·网络·程序人生·docker·容器·职场和发展