一、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方式二:已安装系统后修改
备份原软件源文件:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
修改软件源文件:
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
更新软件包索引:
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解决了什么问题
-
解决了应用程序本地运行环境与生产运行环境不一致的问题
-
解决了应用程序资源使用的问题,docker会一开始就为每个程序指定内存分配和CPU分配
-
让快速扩展、弹性伸缩变得简单
3. docker给我们带来了哪些改变
-
软件交付方式发生了变化
-
替代了虚拟机
-
改变了我们体验软件的模式
-
降低了企业成本
-
促进了持续集成、持续部署的发展
-
促进了微服务的发展
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基本架构
涉及概念:
-
镜像(Image):Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统
-
容器(Container):容器是独立运行的一个或一组应用,是镜像运行时的实体
-
客户端(client):Docker 客户端通过命令行或者其他工具使用 Docker SDK ( https://docs.docker.com/develop/sdk/)) 与 Docker 的守护进程通信
-
主机(host):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器
-
注册中心(Registry):Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub( https://hub.docker.com)) 提供了庞大的镜像集合供使用。
-
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)
bashsudo 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 核心使用时间(纳秒) 示例
25% CPU 占用(单核心)
echo 25000 > cpu.cfs_quota_us # 25ms/100ms周期 echo 100000 > cpu.cfs_period_us
使用 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 使用流程示例
挂载 cgroups 文件系统
mkdir -p /cgroup/cpu mount -t cgroup -o cpu cpu /cgroup/cpu
创建 cgroup
mkdir /cgroup/cpu/app1
设置资源限制
echo 25000 > /cgroup/cpu/app1/cpu.cfs_quota_us # 25% CPU echo 100000 > /cgroup/cpu/app1/cpu.cfs_period_us
添加进程到 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 详解 :
--add-host
:在容器的/etc/hosts
中添加主机映射。
docker run --rm -it --add-host db:192.168.1.100 ubuntu cat /etc/hosts
-a, --attach
:附加到容器的标准输入、输出或错误流。
docker run --rm -a stdin -a stdout -i -t ubuntu /bin/bash
--cidfile
:将容器 ID 写入指定文件。
docker run --rm --cidfile /tmp/container_id ubuntu
-d, --detach
:后台运行容器,打印容器 ID。
--detach-keys
:指定切回后台的快捷键(默认CTRL-p+CTRL-q
)。
--entrypoint
:覆盖镜像的默认入口程序。
docker run --rm -it --entrypoint /bin/bash nginx
-e, --env
:设置环境变量。
docker run --rm -e MY_ENV=value ubuntu env
--expose
:暴露容器端口(不映射到主机)。
-h, --hostname
:设置容器主机名。
--init
:在容器内运行 init 进程,处理信号转发。
# 对比有无 --init 的进程树 docker run --rm -it ubuntu bash # 父进程为 PID 1(bash) docker run --rm -it --init ubuntu bash # 父进程为 init(PID 1)
-i, --interactive
:保持标准输入打开(常用于交互式容器)。
-l, --label
:设置容器元数据标签(如--label app=web
)。
--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
--name
:指定容器名称(唯一标识)。
--privileged
:授予容器超级权限(慎用,可能突破隔离)。
-p, --publish
:映射容器端口到主机(如--publish 8080:80
)。
-P, --publish-all
:自动映射所有暴露端口到主机随机端口。
--restart
:容器退出时的重启策略。
no
:不重启(默认)。on-failure[:max-retries]
:非零退出时重启(可指定最大重试次数)。always
:始终重启(包括 Docker 守护进程重启后)。unless-stopped
:始终重启,除非容器被手动停止。
--rm
:容器退出时自动删除(常用于临时任务)。
--stop-signal
:停止容器的信号(默认SIGTERM
)。
-t, --tty
:分配伪终端(常用于交互式命令)。
-u, --user
:指定容器内运行命令的用户(如--user root
或--user 1001
)。
-v, --volume
:绑定数据卷(如-v /host/path:/container/path
)。
--volumes-from
:从其他容器挂载数据卷(如--volumes-from db-container
)。
-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 限制
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% 单核心)
实时 CPU 调度(
--cpu-rt-period
,--cpu-rt-runtime
)
限制实时任务的 CPU 占用。
docker run --rm -dit --cpu-rt-period=100000 --cpu-rt-runtime=50000 ubuntu
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 绑定
--cpuset-cpus
:指定容器运行的 CPU 核心(如0-2
、1,3
)。
docker run --rm -dit --cpuset-cpus="1,3" ubuntu # 仅在 CPU 1 和 3 上运行
--cpuset-mems
:指定容器使用的内存节点(适用于 NUMA 架构)。
docker run --rm -dit --cpuset-mems="0-1" ubuntu # 使用内存节点 0 和 1
设备限制
--device
:添加主机设备到容器(可指定权限)。
docker run --rm -dit --device=/dev/sda:/dev/sda:r --device=/dev/snd:/dev/snd ubuntu
设备 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。GPU 设备(
--gpus
)
指定容器使用的 GPU(如
--gpus all
或--gpus 0,1
)。docker run --gpus all nvidia/cuda:11.8-base nvidia-smi
内存限制
Ubuntu 内核配置(开启内存限制支持)
修改
/etc/default/grub
:
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
重启生效:
update-grub && reboot
。内存限制参数
-m, --memory
:内存硬限制(如-m 512M
)。
--memory-reservation
:内存软限制(资源竞争时优先释放)。docker run --rm -dit -m 500M --memory-reservation 200M ubuntu
交换区与 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
vsstop
区别 :
命令 默认信号 进程响应 适用场景 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
vsattach
核心区别
特性 docker exec
docker attach
命令执行 新建进程执行命令 附着到容器已有主进程 交互性 完全支持(推荐交互式操作) 依赖容器主进程是否为交互终端 信号处理 独立处理信号 继承主进程信号处理 3.
docker ps
- 功能:列出容器(支持过滤和格式化输出)。
- OPTIONS :
-a
:显示所有容器(包括停止的)。
-f
:过滤条件(如status=running
)。
-q
:仅显示容器 ID。docker ps -a # 显示所有容器
docker ps -q -f status=exited # 仅显示已退出容器的 ID4.
docker inspect
- 功能:获取容器 / 镜像的详细元数据(JSON 格式)。
- OPTIONS :
-f
:使用模板提取特定字段(如{``{.NetworkSettings.IPAddress}}
)。docker inspect mynginx # 查看容器完整信息
docker inspect -f '{{.ID}}' mynginx # 仅显示容器 ID5.
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