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 命名空间类型(mnt、net、pid 等 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 用户无法查看敏感命名空间(如 user、net),需 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 :使用自定义运行时(如 runc、kata)。

    复制代码
    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)
  • 将容器加入指定网络(bridge、host、none 或自定义网络)。

    复制代码
    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-2、1,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 退出而不终止容器。

    • 仅 -t:Ctrl+C 会终止容器进程。

    • 带 --sig-proxy=false:Ctrl+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

相关推荐
@兽血沸腾1 小时前
Windows系统安装Jenkins部署应用至远程Windows服务器操作指南
运维·服务器·jenkins
闲云自留地6 小时前
K8s 的记忆大脑!ETCD 集群部署、etcdctl 命令与备份恢复全通关
容器·kubernetes·etcd
讯捷蓝达6 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
爱和冰阔落9 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
lisanmengmeng9 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮10 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
上火的金鱼妹10 小时前
k8s生产实际问题排查(网关,数据库读写等)
运维·服务器
孙克旭_10 小时前
k8s基础组件与创建资源
运维·docker·容器·kubernetes
孙克旭_11 小时前
云原生基础之Containerd容器运行时
运维·云原生
分布式存储与RustFS11 小时前
RustFS 自建对象存储实战目录:110 篇按场景分类(持续更新)
运维·云原生·开源·对象存储·分布式存储·s3·性能基准