当前位置: 首页 > news >正文

docker环境搭建与常用指令

一、docker环境准备

一、主机环境准备

1. 宿主机系统

  • 系统版本:Ubuntu 20.04.4 LTS 服务器版
  • 下载地址:https://mirrors.aliyun.com/ubuntu-releases/20.04.4/ubuntu-20.04.4-live-server-amd64.iso

2. 更换软件源(两种方式)

方式一:虚拟机安装时修改
  • 安装过程中选择软件源为:
    https://mirrors.tuna.tsinghua.edu.cn/ubuntu
方式二:已安装系统后修改
  1. 备份原软件源文件:
    sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
    
  2. 修改软件源文件:
    sudo vim /etc/apt/sources.list
    
    # 清华源 - 主仓库
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu xenial main restricted universe multiverse
    deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu xenial main restricted universe multiverse# 清华源 - 更新仓库
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu xenial-updates main restricted universe multiverse
    deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu xenial-updates main restricted universe multiverse# 清华源 - 安全更新仓库
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu xenial-security main restricted universe multiverse
    deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu xenial-security main restricted universe multiverse# 清华源 - 回溯更新仓库(可选)
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu xenial-backports main restricted universe multiverse
    deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu xenial-backports main restricted universe multiverse
  1. 更新软件包索引:
    sudo apt-get update
    

二、Docker 安装方法

方法一:基于系统 apt 包管理器安装

1. 安装 Docker(简易方式)
sudo apt install docker.io
2. 卸载 Docker(简易方式)
sudo apt-get purge docker.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

方法二:基于 Docker 官方文档安装

1. 使用官方存储库安装
步骤 1:准备系统环境
sudo apt-get update
sudo apt-get install \ca-certificates \curl \gnupg \lsb-release
步骤 2:添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
步骤 3:配置 Docker 软件源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
步骤 4:更新软件源并查看可用版本
sudo apt-get update
apt-cache madison docker-ce
步骤 5:安装指定版本(示例)
sudo apt-get install docker-ce=5:20.10.16~3-0~ubuntu-focal docker-ce-cli=5:20.10.16~3-0~ubuntu-focal containerd.io docker-compose-plugin
步骤 6:安装最新版本
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
步骤 7:验证安装
docker run hello-world
2. 使用阿里云存储库安装
步骤 1:安装必要工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
步骤 2:添加 GPG 证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
步骤 3:配置阿里云软件源
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
步骤 4:更新软件源并查看可用版本
sudo apt-get update
apt-cache madison docker-ce
步骤 5:安装指定版本(示例)
sudo apt-get install docker-ce=5:20.10.16~3-0~ubuntu-focal docker-ce-cli=5:20.10.16~3-0~ubuntu-focal containerd.io docker-compose-plugin
步骤 6:安装最新版本
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

三、配置 Docker 镜像加速

1. 添加镜像源配置

sudo mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json

添加以下内容:

 
{"registry-mirrors": ["https://hub.xdark.top","https://hub.littlediary.cn","https://dockerpull.org","https://hub.crdz.gq","https://docker.1panel.live","https://docker.unsee.tech","https://docker.udayun.com","https://docker.kejilion.pro","https://registry.dockermirror.com","https://docker.rainbond.cc","https://hub.geekery.cn","https://docker.1panelproxy.com","https://docker.linkedbus.com","https://docker.nastool.de"]
}

2. 重启 Docker 服务

sudo systemctl daemon-reload
sudo systemctl restart docker

四、Docker 完全卸载

1. 卸载 Docker 软件包

sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin

2. 删除数据目录

sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
sudo rm -rf /etc/docker/

五、用户权限配置

1. 将用户添加到 docker 组

# 添加用户到 docker 组(替换 <username> 为实际用户名)
sudo addgroup -a <username> docker# 查看用户信息确认组添加结果
id <username>

2. 生效配置

  • 退出当前终端并重新连接,或执行以下命令刷新权限:
    newgrp docker

二、docker介绍

 1.docker定义

        根据官方的定义,Docker是以Docker容器为资源分割和调度的基本单位,封装整个软件运行时环境,为 开发者和系统管理员设计的,用于构建、发布和运行分布式应用的平台。

2. docker解决了什么问题

1. 解决了应用程序本地运行环境与生产运行环境不一致的问题

2. 解决了应用程序资源使用的问题,docker会一开始就为每个程序指定内存分配和CPU分配

3. 让快速扩展、弹性伸缩变得简单

3. docker给我们带来了哪些改变

        1. 软件交付方式发生了变化

        2. 替代了虚拟机

        3. 改变了我们体验软件的模式

        4. 降低了企业成本

        5. 促进了持续集成、持续部署的发展

        6. 促进了微服务的发展

4. docker和虚拟机的区别

1. 架构差异
  • 虚拟机(VM)

    • 硬件级虚拟化,通过 Hypervisor(如 VMware、VirtualBox)模拟虚拟硬件,每个 VM 包含完整的 Guest OS(内核、系统库、驱动),与宿主机和其他 VM 完全隔离。
    • 结构:Server → Host OS → Hypervisor → 多个VM(各含Guest OS + 应用 + 依赖)
  • Docker(容器)

    • 操作系统级虚拟化共享宿主机内核,通过 Linux 内核的 **Namespace(进程、网络、文件系统隔离)Cgroup(资源限制)** 实现轻量级隔离。
    • 容器仅包含应用及依赖(无独立内核),由 Docker 引擎直接管理。
    • 结构:Server → Host OS → Docker引擎 → 多个容器(共享内核,各含应用 + 依赖)
2. 性能与资源利用
  • 启动速度

    • 容器:秒级启动(直接调用宿主机内核,无需加载 OS)。
    • 虚拟机:分钟级启动(需加载 Guest OS 及服务)。
  • 资源开销

    • 容器:几乎无额外开销,镜像MB 级(分层存储,共享基础层),内存 / 存储占用少。
    • 虚拟机:每个 VM 需独立资源,镜像GB 级(含完整 OS),Hypervisor 层有开销,资源利用率低。
  • 性能表现

    • 容器:接近原生性能(I/O、CPU 开销极小)。
    • 虚拟机:因虚拟化层存在轻微性能损失(现代硬件辅助虚拟化可优化,但仍有 Hypervisor 开销)。
3. 隔离性与安全性
  • 隔离性

    • 虚拟机:强隔离(独立 OS 和硬件,可运行不同 OS,漏洞局限于单个 VM)。
    • 容器:进程级隔离(依赖内核特性,隔离性弱于 VM。可通过 Seccomp、AppArmor 增强,或使用 Kata Containers 实现 VM 级隔离)。
  • 安全性

    • 虚拟机:适合高安全场景(如金融、多租户云服务,硬件级隔离保障安全边界)。
    • 容器:需通过安全配置(如最小权限、资源限制)降低风险,默认隔离性较弱,但合理配置可满足多数场景。
4. 使用场景
  • 虚拟机适用

    • 完全隔离(如多租户云服务、不同 OS 混合部署)。
    • 高安全需求(如银行系统,依赖 VM 的强隔离性)。
    • 运行传统企业应用(如 ERP、数据库,需完整 OS 支持)。
  • Docker 适用

    • 微服务架构(快速部署、弹性伸缩,如 Kubernetes 集群)。
    • CI/CD 流水线(轻量级构建 / 测试环境,镜像确保环境一致)。
    • 高密度部署(单主机运行数百容器,资源利用率高)。
    • 开发环境一致性(镜像共享,避免 “环境不一致” 问题)。
5. 镜像与部署
  • 镜像特性

    • 虚拟机镜像:庞大(含完整 OS,GB 级),分发慢(OVA、VMDK 格式)。
    • Docker 镜像:轻量(MB 级),分层存储(共享基础层),支持快速推送 / 拉取(Docker Hub / 私有仓库)。
  • 部署灵活性

    • 虚拟机:部署需配置虚拟硬件和 Guest OS,迁移成本高(依赖 Hypervisor)。
    • 容器:一次构建,多平台运行,结合编排工具(如 Kubernetes)实现自动化管理,跨环境无缝迁移。
6. 关键对比表格
特性Docker(容器)虚拟机(VM)
跨平台依赖宿主机内核(Linux/Windows 容器)完全跨平台(x86、ARM,支持多 OS 混合)
持久化存储挂载卷(Volume)管理数据虚拟磁盘直接持久化(VMDK 等)
网络模型灵活(桥接、Host 等,基于 Linux 网络命名空间)模拟物理网络(NAT、桥接,依赖 Hypervisor)
监控日志集成 Docker 日志驱动(json-file、syslog 等)需监控 Guest OS(查看 VM 内系统日志)
运维复杂度轻量级,镜像 + 编排工具简化部署需管理 Guest OS(补丁、更新、安全配置)

 5. docker基本架构

涉及概念:

         1. 镜像(Image):Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统

        2. 容器(Container):容器是独立运行的一个或一组应用,是镜像运行时的实体

        3. 客户端(client):Docker 客户端通过命令行或者其他工具使用 Docker SDK ( https://docs.docker.com/develop/sdk/)) 与 Docker 的守护进程通信

        4. 主机(host):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器

        5. 注册中心(Registry):Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub( https://hub.docker.com)) 提供了庞大的镜像集合供使用。

        6. Docker Machine:Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令 行即可在相应的平台上安装Docker。

三、docker容器隔离

1. RootFs

        rootfs 是Docker 容器在启动时内部进程可见的文件系统,即Docker容器的根目录。rootfs通常包含一 个操作系统运行所需的文件系统,例如可能包含经典的类Unix操作系统中的目录系统, 如/dev、/proc、/bin、/etc、/lib、/usr、/tmp及运行Docker容器所需的配置文件、工具等。

2. Linux Namespace

  • 定义:Linux 内核的 资源隔离机制,为进程创建独立的全局资源视图(如 PID、网络、文件系统),使进程认为自身拥有 “专属” 资源,与其他命名空间的进程互不干扰
  • 核心作用
    • 容器化基石:支撑 Docker 等容器技术,实现轻量级隔离(对比虚拟机的硬件虚拟化,命名空间是进程级隔离,开销极小,启动秒级,镜像 MB 级)。
    • 多租户支持:在同一宿主机上,为不同服务 / 用户提供独立资源环境(如容器 A 的 PID 100 与容器 B 的 PID 100 可共存,因 PID 命名空间隔离)。
类型隔离内容实现原理
Mount文件系统挂载点(/proc/mounts通过clone(CLONE_NEWNS)创建,结合chroot/pivot_root,使容器内/与宿主机/隔离(如容器内/etc独立)。
IPC进程间通信资源(System V 消息队列、POSIX 信号量)clone(CLONE_NEWIPC),每个命名空间有独立的 IPC 标识符(ipcs命令在容器内仅显示自身 IPC 资源)。
PID进程 ID(PID)clone(CLONE_NEWPID),容器内进程 PID 从 1 开始(如init进程 PID=1,宿主机看到的是容器进程的 “父 PID”)。
Network网络资源(IP、路由、端口、虚拟网卡)clone(CLONE_NEWNET),通过veth对连接到网桥(如 Docker 的docker0),容器内eth0有独立 IP(如172.17.0.2)。
UTS主机名(hostname)和域名(domainnameclone(CLONE_NEWUTS),容器可通过--hostname设置独立主机名(不影响宿主机/etc/hostname)。
User用户 / 用户组 ID(UID/GID)clone(CLONE_NEWUSER),容器内root(UID 0)可映射到宿主机非特权用户(如 UID 1000,增强安全)。

 3. 进程命名空间

lsns 命令详细说明

一、基本功能

lsns(List Namespaces)是 Linux 系统用于查看命名空间信息的工具,支持列出系统所有命名空间或指定进程的命名空间,是分析容器、多租户环境资源隔离的核心工具。

二、输出字段解析
字段描述示例(容器场景)
NS命名空间索引节点号(唯一标识)4026531840(宿主机 PID 命名空间)
TYPE命名空间类型(mntnetpid 等 8 种)net(网络命名空间)
PATH命名空间文件路径/proc/1234/ns/net(容器进程 1234 的网络命名空间)
NPROCS命名空间内进程数1(容器内仅主进程运行时)
PID命名空间内最小 PID1(容器内 init 进程)
PPID最小 PID 的父 PID(宿主机视角)1000(宿主机上容器进程的父进程)
COMMAND最小 PID 进程的命令nginx: master process(容器内主进程)
UID进程 UID(可能通过 User 命名空间映射)0(容器内 root,映射到宿主机非特权 UID)
USER进程用户名root(容器内用户,实际映射到宿主机用户)
NETNSID网络命名空间 ID(仅网络类型有效)1(容器独立网络命名空间 ID)
NSFSnsfs 挂载点(网络命名空间相关)/proc/1234/ns/net 对应的挂载点
三、常用操作示例
1. 查看系统所有命名空间(需 root)
sudo lsns --output-all  # 显示所有字段,含容器、宿主机命名空间
  • 元祖进程(PID=1):其命名空间为系统默认(如 systemd 进程,所有未隔离进程继承此命名空间)。
2. 查看容器进程的命名空间(以 Docker 为例)
# 启动容器并获取 PID
docker run -d --name mynginx nginx
pid=$(docker inspect -f '{{.State.Pid}}' mynginx)
# 查看该进程的命名空间
sudo lsns -p $pid --output-all
  • 输出分析:容器默认隔离 mnt(文件系统)、pid(进程 ID)、net(网络)等,user 可能继承宿主机(可通过 --userns 配置独立)。
3. 创建新命名空间(验证隔离)
# 使用 unshare 隔离多个命名空间(需 root 或 User 命名空间配置)
unshare --fork -m -u -i -n -p -U -C sleep 100
# 查看新进程的命名空间(TYPE 字段与系统默认不同,如 net 独立)
lsns --output-all | grep sleep
4. 网络命名空间操作(容器网络隔离)
# 启动容器并指定桥接网络(默认隔离 net 命名空间)
docker run -d --name mynginx-bridge nginx
# 查看容器网络命名空间的 NETNSID
sudo lsns -p $pid --output-all | grep net
四、命名空间与容器的关联
  • 容器隔离的命名空间
    • mnt:容器内 / 独立(通过 pivot_root,如 /var/lib/docker/overlay2 挂载)。
    • pid:容器内进程 PID 从 1 开始(如 nginx 主进程 PID=1,宿主机中为其他 PID)。
    • net:通过 veth 对连接到 Docker 网桥(如 docker0,容器 IP 为 172.17.0.x)。
  • User 命名空间安全增强
    配置 userns-remap/etc/docker/daemon.json),容器内 root 映射到宿主机非特权 UID(如 dockremap:165536:65536),防止容器特权操作影响宿主机。
五、高级用法与注意事项
  • 自定义输出
    lsns --output ns,type,pid,command  # 仅显示关键字段,适合脚本解析
    
  • 权限限制:非 root 用户无法查看敏感命名空间(如 usernet),需 sudo
  • 与 Cgroup 对比lsns 管资源隔离视图(命名空间),Cgroup 管资源限制(如 --cpus 配置),两者互补支撑容器管理。

4. cgroups

cgroups 核心概念
  • 定义:Linux 内核中用于资源控制和隔离的机制,将进程分组管理,对组设置资源限制。
  • 核心功能:资源限制、优先级分配、资源统计、任务控制。
  • 挂载方式:通过mount -t cgroup挂载到指定目录,各子系统独立管理。
主要子系统及功能

1. CPU 子系统(cpu/cpuacct)

CFS(完全公平调度)参数
参数名描述示例值
cpu.cfs_period_us资源分配周期(微秒),范围 1000μs~1s100000(100ms)
cpu.cfs_quota_us周期内可使用的 CPU 时间(微秒),-1表示无限制25000(25ms/100ms 周期)
cpu.sharesCPU 时间分配权重(相对比例)512(默认值)
cpu.stat统计信息:nr_periods(周期数)、nr_throttled(节流次数)等
RT(实时调度)参数
参数名描述示例值
cpu.rt_period_us实时调度周期(微秒)100000
cpu.rt_runtime_us周期内实时任务最大运行时间(微秒)95000
CPU 统计(cpuacct)
参数名描述
cpuacct.stat统计用户态(user)和内核态(system)CPU 时间
cpuacct.usage总 CPU 使用时间(纳秒)
cpuacct.usage_percpu各 CPU 核心使用时间(纳秒)
示例
  1. 25% CPU 占用(单核心)
    echo 25000 > cpu.cfs_quota_us  # 25ms/100ms周期
    echo 100000 > cpu.cfs_period_us
    
  2. 使用 2 个 CPU 核心
    echo 200000 > cpu.cfs_quota_us  # 200ms/100ms周期
    echo 100000 > cpu.cfs_period_us
    

2. CPU 集合子系统(cpuset)

参数名描述示例值
cpuset.cpus允许访问的 CPU 核心(格式:0-2,160-1(CPU 0 和 1)
cpuset.mems允许访问的内存节点(与 CPU 绑定)0-1(内存节点 0 和 1)
cpuset.cpu_exclusive是否独占 CPU(1 为独占)1
cpuset.mem_hardwall是否严格限制内存分配(1 为启用)1
cpuset.sched_load_balance是否启用 CPU 负载均衡(1 为启用)0(禁用负载均衡)
示例
  • 绑定进程到 CPU 0-3 和内存节点 0
    echo 0-3 > cpuset.cpus
    echo 0 > cpuset.mems
    

3. 内存子系统(memory)

基础参数
参数名描述示例值
memory.limit_in_bytes内存使用上限(字节),-1表示无限制1073741824(1GB)
memory.usage_in_bytes当前内存使用量(字节)
memory.max_usage_in_bytes历史最大内存使用量(字节)
memory.swappiness内存交换倾向(0-100,0 表示不交换)30
内核内存参数
参数名描述
memory.kmem.limit_in_bytes内核内存上限(字节)
memory.kmem.usage_in_bytes当前内核内存使用量(字节)
OOM 控制
参数名描述
memory.oom_controlOOM Killer 控制(0允许杀死进程,1禁止)
memory.failcnt内存超限次数统计
示例
  • 限制内存为 512MB
    echo 536870912 > memory.limit_in_bytes  # 512MB
    echo 0 > memory.oom_control  # 允许OOM Killer
    

4. 块 I/O 子系统(blkio)

参数名描述示例值
blkio.throttle.read_bps_device设备读带宽限制(字节 / 秒)8:0 10485760(sda 读 10MB/s)
blkio.throttle.read_iops_device设备读 IOPS 限制8:0 1000(sda 读 1000 次 / 秒)
blkio.throttle.write_bps_device设备写带宽限制8:0 5242880(sda 写 5MB/s)
blkio.throttle.io_service_bytes统计 I/O 字节数(按设备)
示例
  • 限制 sda 读带宽为 10MB/s
    echo "8:0 10485760" > blkio.throttle.read_bps_device
    

5. 设备访问子系统(devices)

参数名描述
devices.allow允许访问的设备(格式:类型 主设备号:次设备号 [rwm]
devices.deny拒绝访问的设备
devices.list设备访问限制列表
示例
  • 允许访问所有块设备(读 / 写)
    echo "b *:* rw" > devices.allow  # b表示块设备
    

6. 冻结子系统(freezer)

参数名描述取值
freezer.state进程状态控制THAWED(运行)、FROZEN(冻结)、FREEZING(冻结中)
示例
  • 冻结 cgroup 中的进程
    echo "FROZEN" > freezer.state
    

7. 网络分类子系统(net_cls)

参数名描述示例值
net_cls.classid网络流量分类 ID(格式:主类:次类,十六进制)0x1:0(类 ID 1:0)
示例
  • 设置流量分类 ID 为 1:0
    echo "0x10000" > net_cls.classid  # 0x10000=1:0
    

8. 网络优先级子系统(net_prio)

参数名描述
net_prio.ifpriomap网络接口优先级映射(格式:接口名 优先级
net_prio.prioidx优先级索引(内核内部使用)
示例
  • 设置 eth0 接口优先级为 5
    echo "eth0 5" > net_prio.ifpriomap
    

9. 其他子系统

hugetlb(大页内存)
  • hugetlb.limit_in_bytes:大页内存限制
  • hugetlb.nr_hugepages:分配的大页数量
perf_event(性能监控)
  • 允许使用perf工具监控 cgroup 内进程的性能事件。

cgroups 使用流程示例

  1. 挂载 cgroups 文件系统

    mkdir -p /cgroup/cpu
    mount -t cgroup -o cpu cpu /cgroup/cpu
    
  2. 创建 cgroup

    mkdir /cgroup/cpu/app1
    
  3. 设置资源限制

    echo 25000 > /cgroup/cpu/app1/cpu.cfs_quota_us    # 25% CPU
    echo 100000 > /cgroup/cpu/app1/cpu.cfs_period_us
    
  4. 添加进程到 cgroup

    echo <PID> > /cgroup/cpu/app1/tasks
    

 四、docker常用指令

一、Docker 环境信息命令
1. docker info
  • 功能:显示 Docker 系统信息,包括镜像和容器数量、存储驱动、运行时信息等。
  • 语法docker info [OPTIONS]
  • 示例
    docker info
    
2. docker version
  • 功能:显示 Docker 客户端和服务端的版本信息。
  • 语法docker version [OPTIONS]
  • OPTIONS
    • -f, --format string:指定返回值的模板文件(如 {{.Server.Version}})。
  • 示例
    docker version -f "{{.Client.Version}}"
    
二、系统日志信息常用命令
1. docker events
  • 功能:从 Docker 服务器获取实时事件(如容器启动、停止、镜像拉取等)。
  • 语法docker events [OPTIONS]
  • OPTIONS
    • -f, --filter filter:根据条件过滤事件(如 event=start)。
    • --since string:显示指定时间戳后的所有事件(如 --since 1h ago)。
    • --until string:显示到指定时间为止的事件(如 --until 2023-10-01T12:00:00)。
  • 示例
    # 第一个终端执行,监听事件
    docker events --filter container=mynginx# 第二个终端操作容器
    docker start mynginx
    
2. docker logs
  • 功能:获取容器的日志输出。
  • 语法docker logs [OPTIONS] CONTAINER
  • OPTIONS
    • -f, --follow:跟踪日志实时输出(类似 tail -f)。
    • --since string:显示从指定时间开始的日志(如 --since 24h)。
    • -t, --timestamps:显示日志时间戳。
    • --tail string:仅显示最新 N 条日志(如 --tail 100)。
  • 示例
    docker logs -f -t mynginx
    
3. docker history
  • 功能:查看指定镜像的创建历史(各层的操作记录)。
  • 语法docker history [OPTIONS] IMAGE
  • OPTIONS
    • -H, --human:以可读格式显示镜像大小和日期(默认启用)。
    • --no-trunc:显示完整的提交记录(不截断)。
    • -q, --quiet:仅列出提交记录的 ID。
  • 示例
    docker history --no-trunc mynginx:v1
    
三、容器的生命周期管理命令
1. docker create
  • 功能:创建一个新容器但不启动它(语法与 docker run 类似)。
  • 示例
    docker create --name mynginx -p 80:80 nginx
    
2. docker run
  • 功能:创建并启动一个新容器,执行指定命令。
  • 语法docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • 常用 OPTIONS 详解
    1. --add-host:在容器的 /etc/hosts 中添加主机映射。
      docker run --rm -it --add-host db:192.168.1.100 ubuntu cat /etc/hosts
      
    2. -a, --attach:附加到容器的标准输入、输出或错误流。
      docker run --rm -a stdin -a stdout -i -t ubuntu /bin/bash
      
    3. --cidfile:将容器 ID 写入指定文件。
      docker run --rm --cidfile /tmp/container_id ubuntu
      
    4. -d, --detach:后台运行容器,打印容器 ID。
    5. --detach-keys:指定切回后台的快捷键(默认 CTRL-p+CTRL-q)。
    6. --entrypoint:覆盖镜像的默认入口程序。
      docker run --rm -it --entrypoint /bin/bash nginx
      
    7. -e, --env:设置环境变量。
      docker run --rm -e MY_ENV=value ubuntu env
      
    8. --expose:暴露容器端口(不映射到主机)。
    9. -h, --hostname:设置容器主机名。
    10. --init:在容器内运行 init 进程,处理信号转发。
      # 对比有无 --init 的进程树
      docker run --rm -it ubuntu bash  # 父进程为 PID 1(bash)
      docker run --rm -it --init ubuntu bash  # 父进程为 init(PID 1)
      
    11. -i, --interactive:保持标准输入打开(常用于交互式容器)。
    12. -l, --label:设置容器元数据标签(如 --label app=web)。
    13. --mount:挂载文件系统到容器(替代 -v,更灵活)。
      # 挂载 Volume(推荐方式)
      docker run -t -i --rm --mount type=volume,target=/data ubuntu bash# 绑定主机目录(需提前创建)
      mkdir /tmp/data
      docker run -t -i --rm --mount type=bind,src=/tmp/data,dst=/data ubuntu bash
      
    14. --name:指定容器名称(唯一标识)。
    15. --privileged:授予容器超级权限(慎用,可能突破隔离)。
    16. -p, --publish:映射容器端口到主机(如 --publish 8080:80)。
    17. -P, --publish-all:自动映射所有暴露端口到主机随机端口。
    18. --restart:容器退出时的重启策略。
      • no:不重启(默认)。
      • on-failure[:max-retries]:非零退出时重启(可指定最大重试次数)。
      • always:始终重启(包括 Docker 守护进程重启后)。
      • unless-stopped:始终重启,除非容器被手动停止。
    19. --rm:容器退出时自动删除(常用于临时任务)。
    20. --stop-signal:停止容器的信号(默认 SIGTERM)。
    21. -t, --tty:分配伪终端(常用于交互式命令)。
    22. -u, --user:指定容器内运行命令的用户(如 --user root 或 --user 1001)。
    23. -v, --volume:绑定数据卷(如 -v /host/path:/container/path)。
    24. --volumes-from:从其他容器挂载数据卷(如 --volumes-from db-container)。
    25. -w, --workdir:设置容器内的工作目录。
四、系统相关选项
1. Linux 能力控制(Capabilities)
  • --cap-add:为容器添加 Linux 能力(如网络管理、设备访问等)。
  • --cap-drop:从容器中删除默认能力。
    # 添加所有能力,删除 MKNOD 能力(禁止创建设备节点)
    docker run --cap-add=ALL --cap-drop=MKNOD ubuntu sh -c "ls /dev"# 单独添加系统管理能力
    docker run --cap-add=SYS_ADMIN ubuntu mount -t tmpfs tmpfs /mnt
    
2. 隔离技术(--isolation
  • Linux 系统:仅支持 default(基于命名空间隔离)。
  • Windows 系统
    • default:使用 Docker 守护进程配置(默认 process)。
    • process:命名空间隔离。
    • hyperv:基于 Hyper-V 的分区隔离。
3. 平台与运行时(--platform--runtime
  • --platform:指定容器运行的平台(如 linux/amd64)。
  • --runtime:使用自定义运行时(如 runckata)。
    docker run --platform linux/arm64 --runtime runc nginx
    
4. 安全选项(--security-opt
  • 覆盖容器的安全标签(如 SELinux、AppArmor 配置)。
    docker run --security-opt apparmor=nginx-profile ubuntu
    
5. 共享内存(--shm-size
  • 设置容器内 /dev/shm 的大小(默认 64MB)。
    docker run --shm-size=256M nginx  # 设置为 256MB
    
6. 系统参数(--sysctl
  • 修改容器内的内核参数(如 net.ipv4.ip_forward)。
    docker run --sysctl net.ipv4.ip_forward=1 ubuntu
    
7. Ulimit 限制(--ulimit
  • 设置进程资源限制(如文件句柄数、栈大小)。
    docker run --ulimit nofile=1024:2048 ubuntu  # 最大文件句柄数 1024,软限制 2048
    
五、网络相关选项
1. IP 地址与 DNS(--ip--dns
  • --ip:指定容器 IPv4 地址(需配合自定义网络)。
  • --dns:设置容器的 DNS 服务器。
    docker run --ip 172.18.0.10 --dns 8.8.8.8 ubuntu
    
2. 网络模式(--network
  • 将容器加入指定网络(bridgehostnone 或自定义网络)。
    docker run --network my-network nginx  # 加入名为 my-network 的自定义网络
    
3. 网络别名(--network-alias
  • 为容器添加网络层别名(可通过别名访问容器)。
    docker run --network my-network --network-alias web-server nginx
    
六、健康检查选项
1. 健康检查配置
  • --health-cmd:健康检查命令(如 HTTP 请求、进程状态检查)。
  • --health-interval:检查频率(默认 30s)。
  • --health-retries:连续失败多少次后标记为不健康(默认 3 次)。
  • --health-start-period:启动初始化时间(期间检查不计入失败)。
  • --health-timeout:单次检查超时时间(默认 30s)。
  • --no-healthcheck:禁用健康检查。
    docker run --rm \--health-cmd "curl -f http://localhost || exit 1" \--health-interval 5s \--health-retries 3 \--health-start-period 10s \--health-timeout 2s \nginx
    
七、命名空间选项
1. Cgroup 命名空间(--cgroupns
  • host:使用主机的 cgroup 命名空间(容器与主机共享资源限制)。
  • private:使用容器私有 cgroup 命名空间(默认)。
    docker run --cgroupns host ubuntu  # 与主机共享 cgroup 限制
    
2. PID 命名空间(--pid
  • host:容器与主机共享 PID 命名空间(可看到主机所有进程)。
    docker run --pid host ubuntu ps -ef  # 查看主机进程
    
3. 用户命名空间(--userns
  • 隔离容器与主机的用户和组(需在 daemon.json 中配置)。
    docker run --userns=host ubuntu id  # 使用主机用户命名空间
    
八、cgroup 资源限制选项
CPU 限制
  1. CFS 调度参数(--cpu-period--cpu-quota

    • --cpu-period:CPU 分配周期(微秒,默认 100ms)。
    • --cpu-quota:周期内允许的 CPU 时间(微秒,-1 表示无限制)。
    docker run --rm -dit --cpu-period=50000 --cpu-quota=25000 ubuntu  # 25ms/50ms 周期(50% 单核心)
    
  2. 实时 CPU 调度(--cpu-rt-period--cpu-rt-runtime

    • 限制实时任务的 CPU 占用。
    docker run --rm -dit --cpu-rt-period=100000 --cpu-rt-runtime=50000 ubuntu
    
  3. CPU 权重与核心数(--cpu-shares--cpus

    • --cpu-shares:相对权重(默认 1024,2048 表示 2 倍权重)。
    • --cpus:指定 CPU 核心数(如 --cpus=2 表示最多使用 2 核)。
    docker run --rm -it --cpu-shares=2048 --cpus=1.5 ubuntu
    
CPUset 绑定
  1. --cpuset-cpus:指定容器运行的 CPU 核心(如 0-21,3)。

    docker run --rm -dit --cpuset-cpus="1,3" ubuntu  # 仅在 CPU 1 和 3 上运行
    
  2. --cpuset-mems:指定容器使用的内存节点(适用于 NUMA 架构)。

    docker run --rm -dit --cpuset-mems="0-1" ubuntu  # 使用内存节点 0 和 1
    
设备限制
  1. --device:添加主机设备到容器(可指定权限)。

    docker run --rm -dit --device=/dev/sda:/dev/sda:r --device=/dev/snd:/dev/snd ubuntu
    
  2. 设备 I/O 限速

    • --device-read-bps:限制设备读取带宽(如 --device-read-bps /dev/sda:1mb)。
    • --device-read-iops:限制设备读取 IOPS(如 --device-read-iops /dev/sda:1000)。
    • --device-write-bps 和 --device-write-iops:限制写入带宽和 IOPS。
  3. GPU 设备(--gpus

    • 指定容器使用的 GPU(如 --gpus all 或 --gpus 0,1)。
    docker run --gpus all nvidia/cuda:11.8-base nvidia-smi
    
内存限制
  1. Ubuntu 内核配置(开启内存限制支持)

    • 修改 /etc/default/grub
      GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
      
    • 重启生效:update-grub && reboot
  2. 内存限制参数

    • -m, --memory:内存硬限制(如 -m 512M)。
    • --memory-reservation:内存软限制(资源竞争时优先释放)。
    docker run --rm -dit -m 500M --memory-reservation 200M ubuntu
    
  3. 交换区与 OOM 控制

    • --memory-swap:交换区限制(需 ≥ 内存限制,-1 表示无限制)。
    • --memory-swappiness:内存交换倾向(0 表示尽量不交换)。
    • --oom-kill-disable:禁用 OOM Killer(内存超限时不杀死进程)。
    • --oom-score-adj:调整 OOM 优先级(-1000 表示最低优先级)。
    docker run --rm -dit -m 300M --memory-swap 1G --memory-swappiness=0 --oom-score-adj=-500 ubuntu
    
九、容器生命周期控制命令
1. docker start / stop / restart
  • docker start:启动一个或多个已停止的容器。
  • docker stop:停止运行中的容器(默认发送 TERM 信号)。
  • docker restart:重启容器(先停止再启动)。
    # 示例
    docker restart mynginx          # 重启容器
    docker stop mynginx            # 停止容器
    docker start mynginx           # 启动容器
    
2. docker kill
  • 功能:强制终止运行中的容器(默认发送 KILL 信号,进程无法捕获)。
  • OPTIONS-s 指定信号(如 -s TERM 等效于 docker stop)。
    docker kill -s KILL mynginx     # 发送 KILL 信号(强制终止)
    docker kill -s TERM mynginx     # 发送 TERM 信号(优雅终止)
    
  • kill vs stop 区别
    命令默认信号进程响应适用场景
    stopTERM允许进程清理资源正常关闭服务
    killKILL强制终止(无法捕获信号)服务无响应时强制终止
3. docker rm
  • 功能:删除容器(仅能删除已停止的容器,除非使用 -f)。
  • OPTIONS
    • -f:强制删除运行中的容器(等效于 kill + rm)。
    • -v:删除容器关联的数据卷。
    • -l:移除网络连接(不删除容器)。
    docker rm mynginx              # 删除已停止的容器
    docker rm -f running_container # 强制删除运行中的容器
    
4. docker pause / unpause
  • pause:暂停容器内所有进程(CPU 占用降至最低)。
  • unpause:恢复容器内进程运行。
    docker pause mynginx           # 暂停容器
    docker unpause mynginx         # 恢复容器
    
十、容器运维操作命令
1. docker exec
  • 功能:在运行的容器中执行命令(支持交互式操作)。
  • OPTIONS
    • -i:保持标准输入打开。
    • -t:分配伪终端(创建交互式 shell)。
    • -d:后台执行命令。
    docker exec -i -t mynginx /bin/bash  # 进入容器 shell
    docker exec mynginx ls /var/log      # 查看容器日志目录
    
2. docker attach
  • 功能:连接到容器的标准输入 / 输出(与 exec 不同,直接附着到容器主进程)。
  • 退出方式
    • 带 -i -t 启动的容器:Ctrl+P + Ctrl+Q 退出而不终止容器。
    • 仅 -tCtrl+C 会终止容器进程。
    • 带 --sig-proxy=falseCtrl+C 仅退出附着,不影响容器。
    docker attach mynginx  # 附着到容器(注意退出方式)
    
exec vs attach 核心区别
特性docker execdocker attach
命令执行新建进程执行命令附着到容器已有主进程
交互性完全支持(推荐交互式操作)依赖容器主进程是否为交互终端
信号处理独立处理信号继承主进程信号处理
3. docker ps
  • 功能:列出容器(支持过滤和格式化输出)。
  • OPTIONS
    • -a:显示所有容器(包括停止的)。
    • -f:过滤条件(如 status=running)。
    • -q:仅显示容器 ID。
    docker ps -a                     # 显示所有容器
    docker ps -q -f status=exited    # 仅显示已退出容器的 ID
    
4. docker inspect
  • 功能:获取容器 / 镜像的详细元数据(JSON 格式)。
  • OPTIONS
    • -f:使用模板提取特定字段(如 {{.NetworkSettings.IPAddress}})。
    docker inspect mynginx           # 查看容器完整信息
    docker inspect -f '{{.ID}}' mynginx  # 仅显示容器 ID
    
5. docker top
  • 功能:查看容器内运行的进程(类似 ps 命令)。
    docker top mynginx              # 查看容器内进程
    
十一、容器数据与状态操作
1. docker cp
  • 功能:在容器与主机间拷贝文件 / 目录。
  • 语法
    # 主机到容器
    docker cp /host/path container:/container/path# 容器到主机
    docker cp container:/container/path /host/path
    
    docker cp /www/html mynginx:/www/  # 主机目录拷贝到容器
    docker cp mynginx:/etc/nginx /tmp/  # 容器文件拷贝到主机
    
2. docker diff
  • 功能:查看容器文件系统的变更(A 添加,D 删除,C 修改)。
    docker diff mynginx              # 检查容器文件变更
    
3. docker export
  • 功能:将容器文件系统导出为 tar 包(不包含数据卷)。
  • OPTIONS-o 指定输出文件。
    docker export mynginx -o mynginx.tar  # 导出容器为 tar 包
    tar -tvf mynginx.tar                 # 查看归档内容
    
4. docker port
  • 功能:查看容器端口映射(主机端口 ↔ 容器端口)。
    docker port mynginx                 # 查看容器端口映射
    
十二、容器状态监控与配置
1. docker stats
  • 功能:实时监控容器资源使用情况(CPU、内存、网络、I/O)。
    docker stats mynginx              # 监控单个容器
    docker stats --all               # 监控所有运行中容器
    
2. docker wait
  • 功能:阻塞直到容器停止,返回退出码(用于脚本自动化)。
    docker wait mynginx              # 等待容器停止,返回退出码
    
3. docker update
  • 功能:动态修改运行中容器的配置(如资源限制、重启策略)。
    docker update --memory 512M mynginx    # 修改内存限制
    docker update --restart always mynginx # 设置容器始终重启
    
十三、实用脚本与最佳实践
1. 批量查看容器进程
for container in $(docker ps -q); doecho "===== 容器 $container 进程 ====="docker top $container
done
2. 容器停止与删除最佳实践
  • 优雅停止:docker stop container && docker rm container
  • 强制清理:docker kill -s KILL container && docker rm -f container
3. 数据备份与迁移

# 备份容器文件系统
docker export container | gzip > container_backup.tar.gz# 迁移数据卷
docker run --volumes-from source_container -v /backup:/backup alpine tar cvf /backup/volumes.tar /data
十四、镜像构建与管理命令
1. docker build
  • 功能:基于 Dockerfile 创建镜像。
  • 语法docker build [OPTIONS] PATH|URL
  • 关键 OPTIONS
    • -t, --tag:指定镜像名称和标签(如 name:tag)。
    • -f, --file:指定 Dockerfile 路径(默认当前目录下的 Dockerfile)。
    • --build-arg:设置构建时的环境变量。
    • --no-cache:禁用构建缓存(强制重新构建)。
    • --pull:拉取最新基础镜像。
  • 示例
    # 构建并标记镜像(当前目录的 Dockerfile)
    docker build -t myapp:v1.0 .# 使用指定 Dockerfile 并传递构建参数
    docker build -f Dockerfile.prod --build-arg ENV=prod -t myapp:prod .
    
2. docker images
  • 功能:列出本地镜像。
  • 语法docker images [OPTIONS] [REPOSITORY[:TAG]]
  • 关键 OPTIONS
    • -a:显示所有镜像(包括中间层)。
    • --filter dangling=true:仅显示无标签的悬空镜像。
    • -q:仅显示镜像 ID。
  • 示例
    docker images          # 列出所有带标签的镜像
    docker images -a       # 显示所有镜像(含中间层)
    docker image prune     # 清除所有悬空镜像
    
3. docker rmi
  • 功能:删除本地镜像。
  • 语法docker rmi [OPTIONS] IMAGE [IMAGE...]
  • OPTIONS
    • -f:强制删除(即使镜像被容器使用)。
    • --no-prune:不删除依赖的中间镜像。
  • 示例
    docker rmi myapp:v1    # 删除指定标签的镜像
    docker rmi $(docker images -q -f dangling=true)  # 批量删除悬空镜像
    
4. docker tag
  • 功能:为镜像添加标签(重命名或标记版本)。
  • 语法docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • 示例
    docker tag mynginx:v1 mynginx:1.0.0      # 添加版本号标签
    docker tag myapp:v1 registry.example.com/myapp:v1  # 标记为远程仓库镜像
    
5. docker save / load
  • docker save:将镜像保存为 tar 包(含所有层)。
    docker save -o mynginx.tar mynginx:v1    # 保存镜像到文件
    tar -tvf mynginx.tar                    # 查看归档内容
    
  • docker load:从 tar 包导入镜像。
    docker load -i mynginx.tar              # 从文件导入镜像
    
6. docker import / commit
  • docker import:从容器归档(如 docker export 的输出)创建镜像。
    docker export mycontainer | docker import - myimage:v1  # 导出并导入
    
  • docker commit:从运行中的容器创建镜像(不推荐,推荐使用 Dockerfile)。
    docker commit -a "author" -m "update nginx" mynginx mynginx:v2
    
  • 区别
    • import 基于文件系统归档,不保留容器状态;
    • commit 直接捕获容器当前状态,包含运行时配置。
二、镜像仓库操作命令
1. docker login / logout
  • 功能:登录 / 登出镜像仓库(默认 Docker Hub)。
  • 语法
    docker login -u username -p password registry.example.com  # 登录私有仓库
    docker logout registry.example.com                        # 登出
    
2. docker pull
  • 功能:从仓库拉取镜像。
  • 语法docker pull [OPTIONS] IMAGE[:TAG|@DIGEST]
  • OPTIONS
    • -a:拉取所有标签版本。
    • --platform:指定平台(如 linux/amd64)。
  • 示例
    docker pull nginx:latest       # 拉取最新版 nginx
    docker pull ubuntu@sha256:abc  # 按摘要拉取特定版本
    
3. docker push
  • 功能:将本地镜像推送到仓库。
  • 语法docker push [OPTIONS] IMAGE[:TAG]
  • 示例
    docker push myapp:v1           # 推送到默认仓库
    docker push registry.example.com/myapp:v1  # 推送到私有仓库
    
4. docker search
  • 功能:在 Docker Hub 搜索镜像。
  • 语法docker search [OPTIONS] TERM
  • 关键 OPTIONS
    • --filter stars=10:仅显示收藏数 ≥10 的镜像。
    • --automated:仅显示自动构建的镜像。
    • --official:仅显示官方镜像。
  • 示例
    docker search -f stars=50 -f official=true nginx  # 搜索高星官方 nginx 镜像
    
十五、镜像管理最佳实践
1. 镜像构建优化
  • 使用 --no-cache 强制更新基础镜像:
    docker build --no-cache -t myapp:v1 .
    
  • 多阶段构建减少镜像体积(Dockerfile):
    FROM golang:1.19 AS builder
    WORKDIR /app
    COPY . .
    RUN go build -o myappFROM alpine:latest
    COPY --from=builder /app/myapp /usr/bin/
    CMD ["myapp"]
    
2. 镜像版本管理
  • 遵循语义化版本(major.minor.patch):
    docker tag myapp:dev myapp:1.0.0-beta1
    
  • 使用 Git 提交哈希作为镜像标签(CI/CD 场景):
    docker tag myapp:latest myapp:${GIT_COMMIT::7}
    
3. 仓库操作规范
  • 私有仓库认证:
    # 登录私有仓库(避免明文密码)
    echo "password" | docker login -u username --password-stdin registry.example.com
    
  • 清理过时镜像:
    # 保留最近 5 个版本,删除旧版本
    docker images myapp | tail -n +2 | sort -r | awk 'NR>5 {print $3}' | xargs -r docker rmi

 0voice · GitHub 

相关文章:

  • docker 搭建php 开发环境 添加扩展redis、swoole、xdebug(1)
  • 如何用Spring Cache实现对Redis的抽象
  • Oracle 正则表达式匹配(Oracle 11g)
  • 威联通QNAP替换docker源
  • 高频面试--redis
  • Python打卡 DAY 38
  • Docker 挂载卷并保存为容器
  • LeetCode 2894.分类求和并作差:数学O(1)一行解决
  • 大语言模型 21 - MCP 自动操作 Figma+Cursor 实现自动原型开发!
  • 利用 MkDocs 和 GitHub 部署个人博客网页
  • 基于 SpringBoot 与 VueJS 的智慧就业服务平台构建:技术融合与实践创新
  • AI赋能引爆短剧全球化风潮,腾讯云媒体处理助力短剧平台出海吸金
  • proteus8.4 安装包下载地址与安装教程
  • Web通信协议全景解析:从HTTP到WebService的技术演进与对比
  • NGINX HTTP/2 全面指南开启、调优与实战
  • Windows版本的postgres安装插件http
  • 恶意npm与VS Code包窃取数据及加密货币资产
  • FastMoss 国际电商Tiktok数据分析 JS 逆向 | MD5加密
  • Pytorch
  • [25-cv-05718]BSF律所代理潮流品牌KAWS公仔(商标+版权)
  • 秦皇岛市 网站建设/各种推广平台
  • 建设一个会员积分网站/百度广告标识
  • btoc平台建站/seo在线培训
  • 如何做微信网站/关键词挖掘工具网站
  • wordpress 删除草稿/重庆网站seo公司
  • icp对网站内容/江西短视频seo搜索报价