docker环境搭建与常用指令

一、docker环境准备

一、主机环境准备

1. 宿主机系统

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

方式一:虚拟机安装时修改
方式二:已安装系统后修改
  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)和域名(domainname clone(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 命名空间内最小 PID 1(容器内 init 进程)
PPID 最小 PID 的父 PID(宿主机视角) 1000(宿主机上容器进程的父进程)
COMMAND 最小 PID 进程的命令 nginx: master process(容器内主进程)
UID 进程 UID(可能通过 User 命名空间映射) 0(容器内 root,映射到宿主机非特权 UID)
USER 进程用户名 root(容器内用户,实际映射到宿主机用户)
NETNSID 网络命名空间 ID(仅网络类型有效) 1(容器独立网络命名空间 ID)
NSFS nsfs 挂载点(网络命名空间相关) /proc/1234/ns/net 对应的挂载点
三、常用操作示例
1. 查看系统所有命名空间(需 root)
bash 复制代码
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~1s 100000(100ms)
cpu.cfs_quota_us 周期内可使用的 CPU 时间(微秒),-1表示无限制 25000(25ms/100ms 周期)
cpu.shares CPU 时间分配权重(相对比例) 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,16 0-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_control OOM 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 区别

    命令 默认信号 进程响应 适用场景
    stop TERM 允许进程清理资源 正常关闭服务
    kill KILL 强制终止(无法捕获信号) 服务无响应时强制终止
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 exec docker 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); do
  echo "===== 容器 $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 myapp
    
    FROM 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

相关推荐
deeper_wind几秒前
Linux进程管理
linux·运维·服务器
奈斯ing21 分钟前
【prometheus+Grafana篇】基于Prometheus+Grafana实现MySQL数据库的监控与可视化
linux·运维·数据库·mysql·grafana·prometheus
努力的小T26 分钟前
Ubuntu 系统grub日志级别设置
linux·运维·服务器·ubuntu·云计算
wanhengidc44 分钟前
如何解决网站服务器的异常问题?
运维·服务器
不倒翁玩偶1 小时前
服务器开机自启动服务
linux·运维·服务器
破刺不会编程1 小时前
Linux中基础IO(下)
linux·运维·服务器·开发语言
乐维_lwops1 小时前
案例解读 | 某外资在华汽车系统企业综合运维平台建设实践
运维·网络
大刘讲IT1 小时前
WMS系统选型与实施避坑手册
运维·人工智能·经验分享·程序人生·能源·制造
腾讯蓝鲸智云1 小时前
【运维自动化-标准运维】如何实现在不同步骤间传递参数
运维·经验分享·自动化·sass·paas
无聊的烤苕皮1 小时前
Docker运维-5.3 配置私有仓库(Harbor)
linux·运维·docker·容器·云计算