Docker开篇

6487 字
32 分钟
Docker开篇

Docker开篇#

[TOC]


云服务概述#

云计算的定义是分布式计算的一种,将各种资源(计算,网络,服务器,存储)整合到一个共享池中,按需分配给租户


云计算的特点

优点可扩展性,超大规模,分布式,虚拟化,按需服务,高可用性,极其廉价

缺点安全性不能够得到保障,还有就是网络,必须联网


云计算的分类:

  1. 依据==运营模式==分:
    1. **公有云:**企业、机构,将云服务==外包==给公共云的提供商
    2. **私有云:**通常企业、机构自己拥有
    3. **混合云:**包含私有云和公有云的混合应用
  2. 依据==服务模式==分:
    1. IaaS
    2. PaaS
    3. SaaS

服务模式#

image-20260416112208643
image-20260416112208643

🔹 IaaS#

  • 基础设施即服务
    • 买来的毛坯房,可以自己装修水电、家电等等,俗称硬装

image-20260416105343513
image-20260416105343513

✅ 厂商提供服务器存储网络等“硬件底座”

包括 CPU内存、等…其它基本的计算资源

  • 你自装操作系统、部署中间件、运行环境、应用

==VMware 是典型的 IaaS 技术==

但严格来说,VMware 本身是虚拟化平台

  • 我们可以租用这些硬件,节省了维护成本和办公场地

  • 公司可以在任何时候利用这些硬件来运行其应用

  • 用户不需要再采购价格昂贵的服务器和磁盘阵列了,所有的硬件都由==IaaS==提供

🔹 PaaS#

  • 平台即服务
    • 买的精装修房,可以布置一些家电、墙上挂一些装饰等等,俗称软装

image-20260416110426212
image-20260416110426212

✅ 厂商连操作系统中间件运行环境都配好了

  • 底层平台3/4帮你铺建好了
  • 你只管写代码、部署应用、控制数据
    • 开发更加便捷

🔹 SaaS#

  • 软件即服务
    • 租的房子,直接拎包入住

image-20260416111505305
image-20260416111505305

✅ 打开APP就能用(如钉钉、企业微信),所有东西云厂商搞定

虚拟机 vs 容器#

从操作系统上看:

  • 虚拟机要模拟出一整套完整的操作系统

    • 所以它很笨重,冗余步骤多,存在开机启动流程
  • 容器只需要把它的==核心部分==给模拟出来就行

    • 轻量,秒级启动
    • 高效部署

从硬件上来看

  • 虚拟机要模拟出完整的硬件

  • 容器不需要模拟硬件,更没有自己内核

    • 直接运行在物理机内核上
    • 不同容器之间共享一个物理机内核

image-20260416121158353
image-20260416121158353

从故障影响来看:

  • 虚拟机的==中间件==和==运行环境==是错综复杂的揉合在一起的

    • 某一点出错,可能所有的程序都跑不成了
  • 容器只需要一个==docker引擎==,上面跑着各种容器

    • 容器之间相互隔离,所以安全性极高
    • 一个挂掉不影响其他容器

从资源效率来看:

  • 虚拟机资源开销大,利用率低

    • CPU,内存都是虚拟的
      • 存在性能消耗
  • 容器直接使用宿主机的CPU和内存,服务器利用率更高

    • 服务器性能可以被压榨到极致

从部署方式来看:

  • 虚拟机需要手动部署

    • 或者借助自动化脚本或工具进行部署
  • 容器可以免去部署过程

    • 直接基于镜像启动

从兼容性来看:

  • 各种虚拟化产品互不兼容,虚拟机==迁移困难==

    • 虚拟化整个硬件,包含完整的操作系统
  • 容器==移植性强==

    • 只打包应用及其依赖

进化之路#

image-20260416133530300
image-20260416133530300

Terminal window
1.会有端口冲突问题
2.资源环境,应用没有做到隔离
3.利用率低
4.部署繁琐
5.跨平台迁移非常头疼
===================================
什么是Docker?
1. docker是一个开源的容器引擎,基于go语言开发;
2. 也是一个轻量级,可移植的容器,容器之间相互隔离,安全性高,秒级启动;
3. 各个容器之间相互隔离,所以相互之间不会有接口,并且容器开销极其低
文档地址:
https://docs.docker.com/manuals/

核心组件#

image-20260416144708986
image-20260416144708986

想要运行一个Docker服务,包括==五大组件==


🚢 ①Docker Client (客户端)

通俗解释:这是你和 Docker 打交道的“遥控器”

动作图解:当你敲下 docker rundocker builddocker pull 这些命令时

  • 相当于你在这个“遥控器”上按下了按钮

  • 你不需要知道后台怎么干活的,你只需要发号施令


⚙️ ②Docker Daemon (守护进程)

通俗解释:这是真正的“码头工头”

动作图解:客户端发来的命令(箭头指向),全都被它接收了

  • 它负责在后台默默干活,比如去拉取镜像、创建容器、管理网络等
  • 你平时看不见它,但它一直在运行

📦 ③Docker Image (镜像)

通俗解释:这是“软件安装包”

动作图解它里面包含了程序运行需要的一切(代码、环境、库)

  • 注意它是只读

🏭 ④Docker Registry (镜像仓库)

通俗解释:这是“应用商店”

动作图解:当你本地没有需要的镜像时,Daemon 会去这里下载

  • 这里存放着各种现成的镜像
    • Docker 官方的公共仓库
    • 第三方仓库(阿里云)
    • 企业私有仓库

📦 ⑤Docker Container (容器)

通俗解释:这是真正“跑起来的程序”

动作图解镜像是死的(静态文件),容器是活的(动态进程)

  • Images 变成了 Containers

    • 这意味着,Docker 给镜像加了一个“可写层”,让它真正运行了起来
  • 你可以基于同一个镜像,启动好几个容器,它们互不干扰

工作原理#

新对话
新对话

Docker 是一个 Client-Server(客户端-服务器)架构

  1. 发送指令:用户通过 Docker Client(如命令行终端)发出操作请求
  2. 通信传输:Client 通过 Socket 接口将指令发送给 Docker Daemon(服务端守护进程)
    1. Socket(一种通信管道/约定)
    2. 计算机之间进行通信的一种约定
  3. 执行操作Docker Daemon 接收指令后,负责具体的容器管理工作(如创建、运行、停止容器等),并将结果返回给 Client

安装部署#

版本选择?

  • Docker CE(社区版):免费、开源,适合个人和中小团队开发/测试用
    • 功能完整但无官方支持
  • Docker EE(企业版):商业版,由 Docker 公司提供
    • 适合企业生产环境,有安全、管理、支持保障

RHEL | Docker 下载

  • 👆红帽下载Docker的官方文档

1️⃣下载yum仓库#

我们直接用 Docker 官方源服务器下载核心组件时

  • download.docker.com
    • 网络阻断,会导致 docker-ce 未能下载

我们可以更换为国内镜像源, 如阿里云

Terminal window
[root@Docker ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
'我这里操作系统是Rocky10'
[root@Docker ~]# ll /etc/yum.repos.d/docker*
-rw-r--r-- 1 root root 2081 Apr 16 17:31 /etc/yum.repos.d/docker-ce.repo
[root@Docker ~]# dnf makecache
[root@Docker ~]# dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
[root@Docker ~]# systemctl enable --now docker
Created symlink '/etc/systemd/system/multi-user.target.wants/docker.service' '/usr/lib/systemd/system/docker.service'.
[root@Docker ~]# docker --version
Docker version 29.4.0, build 9d7ad9f
[root@Docker ~]# systemctl is-active docker
active

2️⃣下载RPM包安装#

image-20260416174933272
image-20260416174933272

Index of linux/rhel/10/x86_64/stable/Packages/

  • 👆链接

image-20260416180154055
image-20260416180154055

Terminal window
[root@Client01 ~]# cd /server/tmp/
[root@Client01 tmp]# ll
total 0

image-20260416180407892
image-20260416180407892

Terminal window
[root@Client01 tmp]# ls
containerd.io-2.2.3-1.el10.x86_64.rpm docker-ce-cli-29.4.0-1.el10.x86_64.rpm
docker-buildx-plugin-0.30.1-1.el10.x86_64.rpm docker-compose-plugin-5.1.0-1.el10.x86_64.rpm
docker-ce-29.4.0-1.el10.x86_64.rpm
[root@Client01 tmp]# dnf -y install \
./containerd.io-2.2.3-1.el10.x86_64.rpm \
./docker-ce-29.4.0-1.el10.x86_64.rpm \
./docker-ce-cli-29.4.0-1.el10.x86_64.rpm \
./docker-buildx-plugin-0.30.1-1.el10.x86_64.rpm \
./docker-compose-plugin-5.1.0-1.el10.x86_64.rpm
[root@Client01 tmp]# docker --version
Docker version 29.4.0, build 9d7ad9f
[root@Client01 tmp]# systemctl enable --now docker
Created symlink '/etc/systemd/system/multi-user.target.wants/docker.service' '/usr/lib/systemd/system/docker.service'.
[root@Client01 tmp]# systemctl is-active docker
active

3️⃣二进制包安装#

💡 这种方式“更通用”

  • 无视系统差异

    • 不管你是 RHEL 10、CentOS 7 还是 Ubuntu,只要内核支持,解压即用
  • 干净

    • 卸载时只需停止服务,删除 /usr/bin/ 下的文件和 service 文件即可
Terminal window
1)下载二进制包
[root@Client02 ~]# export DOCKER_VERSION="29.1.4"
# 设置版本号变量 (你也可以改成 27.1.1 或其他稳定版)
[root@Client02 ~]# curl -fsSL \
"https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz" \
-o docker-${DOCKER_VERSION}.tgz
# 下载 Docker 二进制包
[root@Client02 ~]# curl -fsSL \
"https://github.com/docker/compose/releases/download/v2.29.2/docker-compose-linux-x86_64" \
-o docker-compose
# 下载 Docker Compose 插件
'下载到当前目录下 && 并 -o 改了名字(curl)'
[root@Client02 ~]# chmod +x docker-compose
# 赋予 Compose 执行权限
"不是tar包,不保留x权限" --> 直接下载的二进制文件(默认644)
2)解压与安装
[root@Client02 ~]# tar tf docker-${DOCKER_VERSION}.tgz
docker/
docker/docker-init
docker/docker-proxy
docker/docker
docker/containerd-shim-runc-v2
docker/runc
docker/ctr
docker/dockerd
docker/containerd
[root@Client02 ~]# tar -xvzf docker-${DOCKER_VERSION}.tgz
[root@Client02 ~]# cp docker/* /usr/bin/
'既然是全部复制过来了,那么解压出来的docker目录就什么都没有了'
[root@Client02 ~]# cp docker-compose /usr/bin/
# 将二进制文件(命令)都复制到系统 PATH 路径下
# 这样我们就能在任何目录下直接使用 docker 命令了
3)配置系统服务
[root@Client02 ~]# vim /etc/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# 核心:指定 dockerd 的路径
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=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
4)启动与验证
[root@Client02 ~]# systemctl daemon-reload
# 重新加载 systemd 配置
[root@Client02 ~]# systemctl enable --now docker
Created symlink '/etc/systemd/system/multi-user.target.wants/docker.service' '/etc/systemd/system/docker.service'.
[root@Client02 ~]# docker --version
Docker version 24.0.9, build 2936816

脚本安装#

install-docker.sh
#!/bin/bash
#================================
# 作者: 久棹
# 用途: 在 Linux 上自动安装/卸载 Docker 容器引擎(二进制方式)
# 适用系统: CentOS 7/8/9, Ubuntu 18.04+, Debian 10+ 等 systemd 系统
#================================
#================================
# 第一部分: 定义变量
# 把常用的路径、版本号、下载地址定义为变量,方便后续修改和维护
#================================
# --- Docker 相关配置 ---
# Docker 的版本号(要与 download 目录下的 tgz 文件名匹配)
DOCKER_VERSION=29.1.4
# Docker 压缩包的文件名
DOCKER_FILENAME=docker-${DOCKER_VERSION}.tgz
# Docker 二进制包在 docker.com 上的下载地址
DOCKER_URL=https://download.docker.com/linux/static/stable/x86_64/${DOCKER_FILENAME}
# --- Docker Compose 相关配置 ---
# Docker Compose 的版本号
DOCKER_COMPOSE_VERSION=2.29.2
# Docker Compose 在 GitHub 上的文件名(下载后的原始文件名)
DOCKER_COMPOSE_FILENAME=docker-compose-linux-x86_64
# Docker Compose 在 GitHub 上的下载地址
# 注意: GitHub 在国内可能访问不稳定,需要确保网络通畅(最好提前下载)
DOCKER_COMPOSE_URL=https://github.com/docker/compose/releases/download/v${DOCKER_COMPOSE_VERSION}/${DOCKER_COMPOSE_FILENAME}
# --- 安装路径配置 ---
# Docker 二进制文件解压后的安装目录
# /usr/local 常用于"本地安装软件"的目录
# 解压后二进制文件位于 /usr/local/docker/ 下
DOCKER_BASEDIR=/usr/local
# systemd 服务文件的存放路径(systemd 从这里读取服务配置)
SYSTEMD_DIR=/usr/lib/systemd/system
# Docker 配置文件目录
DOCKER_CONFIG=/etc/docker
# --- 本地目录 ---
# 预下载文件的存放目录
DOWNLOAD=./download
# 加载操作系统的 ID 变量(如 centos、ubuntu),用于判断系统类型
. /etc/os-release
OS_VERSION=$ID
#================================
# 第二部分: 工具函数
#================================
#----------------------------------------------------
# 函数名: prepare
# 作用: 下载指定的文件(如果本地已经有了就跳过下载,节省时间)
# 参数:
# $1 - 要下载的文件名
# $2 - 文件的下载地址(URL)
# 使用示例: prepare "docker-26.1.4.tgz" "https://..."
#----------------------------------------------------
function prepare(){
if [ ! -f ${DOWNLOAD}/$1 ]; then
echo "正在下载 $1 ..."
wget -T 10 -t 3 "$2" -O ${DOWNLOAD}/$1
if [ $? -ne 0 ]; then
rm -f ${DOWNLOAD}/$1
tput setaf 1
echo "错误: 无法下载 $1 ,请检查网络连接!"
echo "下载地址: $2"
tput sgr0
exit 100
fi
echo "下载完成: $1"
else
echo "文件已存在,跳过下载: $1"
fi
}
#================================
# 第三部分: 安装函数
#================================
function InstallDocker(){
# --- 第 1 步: 检查是否以 root 用户运行 ---
if [ "$(id -u)" -ne 0 ]; then
tput setaf 1
echo "错误: 请使用 root 用户或 sudo 运行此脚本!"
echo "用法: sudo bash $0 install"
tput sgr0
exit 1
fi
echo "========================================="
echo " 开始安装 Docker v${DOCKER_VERSION}"
echo "========================================="
# --- 第 2 步: 根据操作系统安装依赖(wget) ---
if [ "$OS_VERSION" == "centos" ] || [ "$OS_VERSION" == "rhel" ]; then
rpm -qa | grep -q wget || yum -y install wget
echo "已安装 CentOS/RHEL 系统依赖"
elif [ "$OS_VERSION" == "ubuntu" ] || [ "$OS_VERSION" == "debian" ]; then
dpkg -l | grep -q wget || apt -y install wget
echo "已安装 Ubuntu/Debian 系统依赖"
fi
# --- 第 3 步: 下载 Docker 二进制包 ---
prepare ${DOCKER_FILENAME} ${DOCKER_URL}
# --- 第 4 步: 下载 Docker Compose ---
prepare ${DOCKER_COMPOSE_FILENAME} ${DOCKER_COMPOSE_URL}
# --- 第 5 步: 解压 Docker 到安装目录 ---
# Docker 官方静态包解压后会生成 docker/ 目录
echo "正在解压 Docker 二进制包 ..."
# 如果目录不存在就创建它
if [ ! -d ${DOCKER_BASEDIR}/docker ]; then
install -d ${DOCKER_BASEDIR}/docker
fi
tar xf ${DOWNLOAD}/${DOCKER_FILENAME} -C ${DOCKER_BASEDIR}
echo "Docker 二进制文件已安装到: ${DOCKER_BASEDIR}/docker/"
# --- 第 6 步: 安装 Docker Compose ---
# Docker Compose 是一个独立的二进制文件,用于编排多容器应用
# 把它放到 docker 的 bin 目录下,统一管理
# 复制的同时改了名
cp ${DOWNLOAD}/${DOCKER_COMPOSE_FILENAME} ${DOCKER_BASEDIR}/docker/docker-compose
chmod +x ${DOCKER_BASEDIR}/docker/docker-compose
echo "Docker Compose 已安装到: ${DOCKER_BASEDIR}/docker/docker-compose"
# --- 第 7 步: 创建软链接到 /usr/bin/ ---
# /usr/bin/ 在系统的 PATH 中,创建软链接后可以直接在终端使用命令
# -s: 创建符号链接(软链接)
# -f: 如果链接已存在则覆盖
echo "正在创建软链接 ..."
ln -sf ${DOCKER_BASEDIR}/docker/* /usr/bin/
echo "已创建软链接,现在可直接使用 docker、dockerd 等命令"
# --- 第 8 步: 安装命令自动补全 ---
# Docker CLI 内置 completion 子命令,可生成 bash/zsh 补全脚本
# bash-completion 包提供动态加载补全的框架
echo "正在配置命令自动补全 ..."
if [ "$OS_VERSION" == "centos" ] || [ "$OS_VERSION" == "rhel" ]; then
rpm -qa | grep -q bash-completion || yum -y install bash-completion
elif [ "$OS_VERSION" == "ubuntu" ] || [ "$OS_VERSION" == "debian" ]; then
dpkg -l | grep -q bash-completion || apt -y install bash-completion
fi
# 生成 docker 命令补全(bash)
docker completion bash > /usr/share/bash-completion/completions/docker 2>/dev/null
# 生成 docker-compose 命令补全(bash)
${DOCKER_BASEDIR}/docker/docker-compose completion bash > /usr/share/bash-completion/completions/docker-compose 2>/dev/null
# /etc/bash_completion.d/ 只兼容旧版语法,新版 docker 补全写入会报错,已移除
echo "已安装 Docker / Docker Compose 命令自动补全"
echo "提示: 重新登录或执行 'source /etc/profile.d/bash_completion.sh' 使其生效"
# --- 第 9 步: 配置镜像加速 ---
# /etc/docker/daemon.json 是 Docker 守护进程的配置文件
# registry-mirrors 配置国内镜像加速源,解决从 Docker Hub 拉取镜像慢的问题
mkdir -p ${DOCKER_CONFIG}
cat > ${DOCKER_CONFIG}/daemon.json <<EOF
{
"registry-mirrors": ["https://docker.1ms.run"]
}
EOF
echo "已配置镜像加速: ${DOCKER_CONFIG}/daemon.json"
# --- 第 10 步: 生成 systemd 服务文件 ---
cat > ${SYSTEMD_DIR}/docker.service <<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP \$MAINPID
TimeoutSec=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
EOF
echo "systemd 服务文件已生成: ${SYSTEMD_DIR}/docker.service"
# --- 第 11 步: 启动 Docker 并设置开机自启 ---
systemctl daemon-reload
systemctl enable --now docker &> /dev/null
echo "Docker 服务已启动并设置为开机自启"
# ===== 新增:创建 Docker Compose 插件软链接(仅当不存在时) =====
mkdir -p /usr/libexec/docker/cli-plugins/
# 先判断软链接是否存在,已存在则跳过
if [ ! -L /usr/libexec/docker/cli-plugins/docker-compose ]; then
# 软链接不存在,再判断源文件是否存在,避免无效链接
if [ -f /usr/local/docker/docker-compose ]; then
# 源文件存在,且软链接不存在则,创建软链接
ln -s /usr/local/docker/docker-compose /usr/libexec/docker/cli-plugins/docker-compose
echo "软链接已创建:/usr/libexec/docker/cli-plugins/docker-compose -> /usr/local/docker/docker-compose"
else
echo "警告:源文件 /usr/local/docker/docker-compose 不存在,跳过软链接创建。"
fi
else
echo "软链接已存在,跳过。"
fi
# --- 第 12 步: 验证安装结果 ---
echo ""
echo "========================================="
tput setaf 2
echo " 安装完成!版本信息如下:"
tput sgr0
echo "========================================="
echo ""
docker version
echo ""
docker-compose version
echo ""
tput setaf 3
echo "安装成功!欢迎使用久棹 Docker 二进制安装脚本~"
tput sgr0
}
#==================
# 第四部分: 卸载函数
#==================
function UninstallDocker(){
# 检查 root 权限
if [ "$(id -u)" -ne 0 ]; then
tput setaf 1
echo "错误: 请使用 root 用户或 sudo 运行此脚本!"
tput sgr0
exit 1
fi
echo "========================================="
echo " 开始卸载 Docker"
echo "========================================="
# --- 第 1 步: 停止服务并禁用开机自启 ---
# disable --now: 同时完成 disable(取消开机自启)和 stop(停止服务)
systemctl disable --now docker &> /dev/null
echo "已停止 Docker 服务"
# --- 第 2 步: 删除 systemd 服务文件 ---
rm -f ${SYSTEMD_DIR}/docker.service
echo "已删除 systemd 服务文件"
# --- 第 3 步: 删除 Docker 程序文件 ---
# 递归删除整个 docker 二进制目录
rm -rf ${DOCKER_BASEDIR}/docker
echo "已删除 Docker 程序文件"
# --- 第 4 步: 删除 Docker 配置和数据目录 ---
# /var/lib/docker - Docker 的镜像、容器、卷等数据存储目录
# /var/lib/containerd - containerd 的持久化数据目录
rm -rf /var/lib/docker /var/lib/containerd
rm -rf ${DOCKER_CONFIG}
echo "已删除 Docker 数据和配置目录"
# --- 第 5 步: 删除软链接 ---
# 清理之前在 /usr/bin/ 下创建的软链接
# 这些是 Docker 静态包解压后包含的全部二进制文件
rm -f /usr/bin/{docker,dockerd,docker-init,docker-proxy,containerd,containerd-shim-runc-v2,ctr,runc,docker-compose}
echo "已删除软链接"
# --- 第 6 步: 删除命令补全文件 ---
rm -f /usr/share/bash-completion/completions/docker
rm -f /usr/share/bash-completion/completions/docker-compose
rm -f /etc/bash_completion.d/docker
rm -f /etc/bash_completion.d/docker-compose
echo "已删除命令自动补全文件"
# --- 第 7 步: 重新加载 systemd 配置 ---
systemctl daemon-reload
tput setaf 5
echo "卸载成功!欢迎再次使用久棹 Docker 二进制安装脚本~"
tput sgr0
}
#=============================
# 第五部分: 主函数 —— 脚本的入口
#=============================
function main(){
# $1 是运行脚本时传入的第一个参数
case $1 in
install|i)
InstallDocker
;;
remove|r)
UninstallDocker
;;
*)
echo "用法: $0 {install|i|remove|r}"
echo ""
echo " 示例:"
echo " 安装: $0 install"
echo " 卸载: $0 remove"
echo " 简写: $0 i (安装)"
echo " 简写: $0 r (卸载)"
;;
esac
}
# 调用 main 函数,把命令行的第一个参数传进去
main $1
Terminal window
[root@Docker ~]# tree ./
./
├── download
│   ├── docker-29.1.4.tgz
│   └── docker-compose-linux-x86_64
└── install-docker.sh
[root@Docker ~]# chmod +x install-docker.sh
[root@Docker ~]# ./install-docker.sh
用法: ./install-docker.sh {install|i|remove|r}
示例:
安装: ./install-docker.sh install
卸载: ./install-docker.sh remove
简写: ./install-docker.sh i (安装)
简写: ./install-docker.sh r (卸载)
1)安装
[root@Docker ~]# ./install-docker.sh i
=========================================
开始安装 Docker v29.1.4
=========================================
文件已存在,跳过下载: docker-29.1.4.tgz
文件已存在,跳过下载: docker-compose-linux-x86_64
正在解压 Docker 二进制包 ...
Docker 二进制文件已安装到: /usr/local/docker/
Docker Compose 已安装到: /usr/local/docker/docker-compose
正在创建软链接 ...
已创建软链接,现在可直接使用 docker、dockerd 等命令
正在配置命令自动补全 ...
已安装 Docker / Docker Compose 命令自动补全
提示: 重新登录或执行 'source /etc/profile.d/bash_completion.sh' 使其生效
已配置镜像加速: /etc/docker/daemon.json
systemd 服务文件已生成: /usr/lib/systemd/system/docker.service
Docker 服务已启动并设置为开机自启
=========================================
安装完成!版本信息如下:
=========================================
Client:
Version: 29.1.4
API version: 1.52
Go version: go1.25.5
Git commit: 0e6fee6
Built: Thu Jan 8 19:55:48 2026
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 29.1.4
API version: 1.52 (minimum version 1.44)
Go version: go1.25.5
Git commit: 08440b6e
Built: Thu Jan 8 19:58:07 2026
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v2.2.0
GitCommit: 1c4457e00facac03ce1d75f7b6777a7a851e5c41
runc:
Version: 1.3.4
GitCommit: v1.3.4-0-gd6d73eb
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Docker Compose version v2.29.2
安装成功!欢迎使用久棹 Docker 二进制安装脚本~
[root@Docker ~]# docker pull docker.1ms.run/nginx
[root@Docker ~]# docker images
docker.1ms.run/nginx:latest 1881968aff6f 237MB
2)卸载
[root@Docker ~]# ./install-docker.sh r
=========================================
开始卸载 Docker
=========================================
已停止 Docker 服务
已删除 systemd 服务文件
已删除 Docker 程序文件
已删除 Docker 数据和配置目录
已删除软链接
卸载成功!欢迎再次使用久棹 Docker 二进制安装脚本~

info VS inspect#

这两个命令是 Docker 运维中最常用的“侦察兵”

docker info:关注宏观环境,看的是 Docker 守护进程(Daemon)和宿主机的整体配置

docker inspect:关注微观个体,看的是具体的镜像或容器的底层元数据

特性docker infodocker inspect
查看对象Docker 系统本身 (全局信息)具体的容器 或 镜像 (个体信息)
输出格式易读的文本列表 (Key-Value)JSON 格式的详细数据结构
典型场景”Docker 装好了吗?存储驱动是 overlay2 吗?""这个容器的内网 IP 是多少?端口映射对了吗?“
Terminal window
1)系统本身
[root@Docker ~]# docker info
Client: Docker Engine - Community
Version: 29.4.0
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.33.0
Path: /usr/libexec/docker/cli-plugins/docker-buildx
...........
2)镜像详细信息
'后面跟的是镜像名称'
[root@Docker ~]# docker image inspect nginx:latest
[
{
"Id": "sha256:7f0adca1fc6c29c8dc49a2e90037a10ba20dc266baaed0988e9fb4d0d8b85ba0",
"RepoTags": [
"nginx:latest",
"docker.xuanyuan.run/nginx:latest"
],
"Comment": "buildkit.dockerfile.v0",
"Created": "2026-04-07T17:31:28.277378375Z",
"Config": {
"ExposedPorts": {
"80/tcp": {}
},
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.29.8",
"NJS_VERSION=0.9.6",
"NJS_RELEASE=1~trixie",
"ACME_VERSION=0.3.1",
"PKG_RELEASE=1~trixie",
"DYNPKG_RELEASE=1~trixie"
3)容器详细信息
"后面跟的是容器ID"
[root@Docker ~]# docker container inspect b9ed
[
{
"Id": "b9ed83fc06e4ce376b9fb89cbb4b736a1571b3258778dac24a486c1b60fda934",
"Created": "2026-04-16T11:56:59.766661548Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 2048,
"ExitCode": 0,
"Error": "",
"StartedAt": "2026-04-17T05:56:26.354132076Z",
"FinishedAt": "2026-04-16T14:23:30.25369705Z"
},

docker环境初体验#

image-20260416194424893
image-20260416194424893

Terminal window
1)拉取镜像
[root@Docker ~]# docker image pull registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
v1: Pulling from yinzhengjie-k8s/apps
'如果你不加这个版本号则默认拉取最新的:latest'
2)查看镜像列表
[root@Docker ~]# docker image ls
registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1...
[root@Docker ~]# docker images
'这个老版命令也是支持的!'
特性docker imagesdocker image ls
功能列出本地镜像列出本地镜像
命令类型早期版本的命令(快捷别名)新版标准命令结构
推荐度⭐⭐⭐⭐⭐ (更短,老用户习惯)⭐⭐⭐⭐⭐ (更规范,逻辑清晰)

你可以把 docker images 看作是 docker image ls快捷指令(别名)

新版规范

随着 Docker 功能越来越多,为了保持命令的逻辑一致性,Docker 引入了对象管理的语法结构(类似于 kubectl 的风格)

  • docker image:表示我要操作“镜像”这个对象
  • ls:表示我要执行“列出”这个动作
  • 同理还有 docker container ls (对应 docker ps)、docker volume ls
Terminal window
3)启动镜像
[root@Docker ~]# docker container run -d -p 81:80 --name xiuxian registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
b9ed83fc0...
-d: # 后台运行
-p: # 端口映射
--name: # 自己起的别名
'修仙xiuxian'
# 后面紧跟镜像名字
4)查看容器
'正在运行的容器'
[root@Docker ~]# docker container ls
b9ed83fc06e4 registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1 "/docker-entrypoint.…" 34 seconds ago Up 34 seconds 0.0.0.0:81->80/tcp, [::]:81->80/tcp xiuxian
1.容器id
2.镜像名称
3.描述信息
4.创建时间
5.运行了多长时间
6.端口映射,tcp协议
7.我们刚起的别名
[root@Docker ~]# docker ps
'老版命令'
# 可以实现和上面一样的功能
使用 docker ps (快捷写法)使用 docker container ls (规范写法)功能说明
docker psdocker container ls查看正在运行的容器
docker ps -adocker container ls -a查看所有容器(包括已停止的
docker ps -qadocker container ls -qa仅显示所有容器的ID
  • 不加 ==-q选项== 则默认显示完整表格信息(ID、镜像、状态、端口等)

  • 测试访问

image-20260416204259978
image-20260416204259978

镜像管理#

Terminal window
1)给镜像打标签
'就是起别名'
不复制数据
不占额外空间
# 修改名字、版本号,或者两者都改
[root@Docker ~]# docker tag registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1 xiuxian
# 把这个镜像打标签为 "xiuxian"
'后面没有加:v1版本号--->默认最新'

image-20260416211438634
image-20260416211438634

Terminal window
2)删除镜像
[root@Docker ~]# docker image rm registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
'-f强制删除'
===================================
🐴'玩个有趣的操作!'
# 删除完,我这里还有一个tag后的镜像
xiuxian:latest
[root@Docker ~]# docker rmi xiuxian:latest
# 试着删除一下!
Error报错了!
unable to delete xiuxian:latest (must be forced)
# 不能删除,除非-f强制删除!
container b9edxxx is using
# 容器b9e正在使用它
[root@Docker ~]# docker container ls
b9e
# 它正在运行
[root@Docker ~]# docker container stop b9e
# 把这个容器停止了
[root@Docker ~]# docker container ls
# 正在运行的就没有了
[root@Docker ~]# docker container ls -a
'但是可以通过-a查看历史运行过的镜像'
b9e
[root@Docker ~]# docker rmi xiuxian:latest
# 我把它停止之后--->接着删除
'还是不能删除'
[root@Docker ~]# docker rmi -f xiuxian:latest
'只有-f才能强制删除'
[root@Docker ~]# docker container ls -a
# 查看历史运行的容器,依旧查看到了
[root@Docker ~]# docker container start b9e
b9e
'试着启动一下'
[root@Docker ~]# docker container ls
# 运行起来了
'试着访问浏览器,也访问到了'
===================================
当我强制删除镜像后容器依然能启动❓️
是因为 Docker 的存储驱动为了保护已存在的容器,并不会真正删除那些正在被容器使用的底层数据
  • 镜像 (Image):是一个只读的模板,由多层文件系统组成
  • 容器 (Container):是镜像的一个运行实例
  • 当容器启动时,Docker 会在镜像的只读层之上,叠加一个可写层 (Writable Layer)
    • 你对容器的所有修改(如创建文件、修改配置)都发生在这个可写层
    • 容器的运行状态 = 镜像的只读层 + 容器独有的可写层

强制删除镜像时发生了什么?

  1. 删除了指向数据层的“标签”或“指针”(即镜像的==元数据==)

  2. 它会尝试清理那些不再被任何容器引用的数据层

关键点在于: 因为你还有一个基于该镜像创建的容器(即使是停止状态),这个容器依然“引用”着镜像的底层数据

为了保护容器的完整性,Docker 的存储驱动会保留这些底层数据,不会真正从磁盘上擦除

  • 虽然容器能启动,但这是一个不推荐的操作

  • 所以,在生产环境中,请务必确保在删除镜像前

    • 所有依赖它的容器都已被妥善处理

✅️轩辕镜像#

image-20260417085442596
image-20260417085442596

轩辕镜像 - Docker 镜像高效稳定拉取服务

  • 上面是官网, 你可以把它理解为第三方镜像仓库
    • 因为官方的镜像仓库需要翻墙才行
    • 当你配置了第三方镜像仓库, 就可以正常的拉取镜像了!
Terminal window
1)登录注册
2)充值流量
3)重置用户密码
4)本地客户端登录
[root@Docker /]# echo 镜像密码 | docker login -u 镜像账户 --password-stdin docker.xuanyuan.run
Login Succeeded
# 镜像密码就是刚才重置的密码
# 镜像账户是自己注册的手机号
Terminal window
5)搜索镜像
[root@Docker /]# docker search docker.xuanyuan.run/nginx
'前面需要带上第三方镜像仓库的地址'
NAME DESCRIPTION STARS
nginx Official build of Nginx 21252
# 有名字,描述信息,和⭐数
6)拉取镜像
[root@Docker /]# docker pull docker.xuanyuan.run/nginx
docker.xuanyuan.run/nginx:latest
# 拉取也是需要带上它的地址
7)打标签改名
[root@Docker /]# docker image ls
docker.xuanyuan.run/nginx:latest.....
[root@Docker /]# docker image tag docker.xuanyuan.run/nginx:latest nginx
nginx:latest
# 这样就变回来了!

image-20260417104644415
image-20260417104644415

image-20260417104840119
image-20260417104840119

镜像迁移#

Terminal window
✅️save和load配合使用
1)导出镜像"save"
[root@Docker /]# docker image save nginx:latest > server.tar.gz
# 导出为server.tar.gz
'名字随便起,后缀也可以不是.tar.gz'
✅️但我们为了规范,通常导出为tar包
docker image save nginx:latest -o server.tar.gz
-o # 和上面一致导出
'output-->输出'
[root@Docker /]# ls server.tar.gz
server.tar.gz
2)拷贝至另一台服务器
# 得装的有docker
'当然你也可以先把自己的nginx镜像删除了,然后再导入回去'
[root@Docker /]# scp server.tar.gz 10.0.0.128:~
# 拷贝至它的家目录
3)导入镜像"load"
[root@test ~]# ls server.tar.gz
server.tar.gz
[root@test ~]# docker image load -i server.tar.gz
Loaded image: nginx:latest
-i # input输入
✅️docker image load < server.tar.gz
'功能同上'更简便一点
[root@test ~]# docker images | grep nginx
nginx:latest

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Docker开篇
https://www.kpyun.fun/posts/docker/docker01/
作者
久棹
发布于
2026-02-15
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
久棹
只要胆子大,天天寒暑假!
公告
欢迎来到久棹的技术小站!本站专注 Linux 运维学习笔记分享,如有问题欢迎交流探讨 🎉
分类
标签
站点统计
文章
98
分类
11
标签
203
总字数
244,453
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录