docker学习
查询docker信息
1 | docker info #显示docker的系统信息,包括镜像和容器和仓库信息 |
查询docker版本
1 | docker -v |
镜像images命令
Docker 镜像是一个只读模板,包含了运行容器所需要的文件系统和内容(如代码、运行时、库等)。
镜像由一系列只读层(layers)叠加而成,每一层是对底层文件系统的一个增量快照(通常是文件的增删改),每条指令都会生成一个新的只读层(RUN、COPY、ADD 都会触发新层),镜像本身没有可写的文件系统。
镜像构建时是以分层式构建,多层叠加组合而成一个镜像。
分层的好处:
- 缓存复用(不同镜像共享相同的层)
- 构建加速(修改中间层不会重建所有层)
- 节省空间(同一层只存一次)
工作原理:
LowerDir:只读层,是镜像构建后建立的层。
UpperDir:可写层,初始会和LowerDir合并挂载在MergedDir,由MergedDir挂载到容器的根目录,容器修改时也会在可写层修改并记录,展示给MergedDir。
WorkDir:Overlay2存储驱动的临时工作目录,用帮助合并。
MergedDir:是 LowerDir + UpperDir 合并的结果,也就是容器看到的文件系统。
对镜像内容删除时,并不会真的删除,只是该层被遮盖了,并不是真正意义上的删除,所以镜像会越来越大。
查询所有镜像
1 | docker images |
查询镜像详细信息
1 | docker image inspect 容器ID/容器名字 |
从仓库里搜索镜像
1 | docker search 容器名 |
拉取镜像
1 | docker pull 容器名:版本号 #版本号省略则默认使用latest版本 |
删除镜像
1 | docker rmi 容器ID/容器名 |
import从本地导入镜像
1 | docker import [OPTIONS] tar路径 镜像名:版本 #使用示例 |
参数名 | 简写 | 类型 | 说明 |
---|---|---|---|
--change |
-c |
字符串,可以重复使用 | 设置镜像的元数据(相当于 Dockerfile 中的命令,如 CMD , ENV , EXPOSE , ENTRYPOINT 等) |
--message |
-m |
字符串 | 添加导入镜像的说明信息,用于记录镜像变更备注 |
1 | #示例 |
build构建镜像
build命令需要搭配dockerfile文件来构建镜像。
Dockerfile指令详解
指令 | 描述 |
---|---|
ADD |
添加本地或远程文件和目录。 |
ARG |
使用构建时变量。 |
CMD |
指定 default 命令。 |
COPY |
复制文件和目录。 |
ENTRYPOINT |
指定默认可执行文件。 |
ENV |
设置环境变量。 |
EXPOSE |
描述您的应用程序正在侦听的端口。 |
FROM |
从基础映像创建新的构建阶段。 |
HEALTHCHECK |
在启动时检查容器的运行状况。 |
LABEL |
将元数据添加到图像中。 |
MAINTAINER |
镜像维护作者。 |
ONBUILD |
指定何时在构建中使用映像的说明。 |
RUN |
执行生成命令。 |
SHELL |
设置镜像的默认 shell。 |
STOPSIGNAL |
指定退出容器的系统调用信号。 |
USER |
设置用户和组 ID。 |
VOLUME |
创建卷挂载。 |
WORKDIR |
更改工作目录。 |
1 | # 使用官方 centos 作为基础镜像 |
build相关指令
1 | docker build [OPTIONS] PATH #使用示例 |
OPTIONS参数
参数 | 说明 | 示例 |
---|---|---|
-t, --tag | 为构建的镜像指定名称和标签(可多次使用) | -t myimage:1.0 |
-f, --file | 指定 Dockerfile 路径 | -f Dockerfile.dev |
--build-arg | 构建时传递变量(Dockerfile 中 ARG 使用) | --build-arg VERSION=1.2.3 |
--no-cache | 构建时不使用缓存 | --no-cache |
--pull | 始终尝试从远程拉取最新基础镜像 | --pull |
--target | 指定构建多阶段 Dockerfile 中的某个阶段 | --target builder |
--platform | 指定构建平台(如 amd64、arm64) | --platform linux/amd64 |
--progress | 构建时输出样式(plain 或 tty) | --progress=plain |
--output | 指定构建产出位置,如本地目录或类型 | --output type=local,dest=./out |
1 | #使用指定 Dockerfile |
cp宿主机与容器文件复制
1 | docker cp [OPTIONS] <源路径> <目标路径> #使用示例 |
commit从容器创建新镜像
1 | docker commit [OPTIONS] 容器ID或名字 新镜像的名称:标签(tag) #使用示例 |
OPTIONS参数
选项 | 含义 |
---|---|
-a, --author | 镜像作者 |
-m, --message | 提交时的说明(类似 Git commit message) |
-p, --pause | 提交时是否暂停容器(默认是 true ,安全性更高) |
1 | docker commit -a "treeman" -m "a demo app" -p false mycontainer myapp:v1 |
save导出 load导入镜像
常用在没有公网的时候离线导入导出镜像。
导出镜像
1 | docker save [OPTIONS] IMAGE [IMAGE...] |
导入镜像
1 | docker load [OPTIONS] |
容器container命令
容器资源限制与隔离
容器通过基于Linux底层的Namespace技术来实现资源隔离,cgroups技术实现资源限制。
Namespace(命名空间)将内核的全局资源进行封装,使得每个namespace都有一份独立资源,因此不同的进程在各自的namespace内对同一种资源的使用不会相互干扰。
Namespace类型 | 系统调用参数 | 隔离内容 |
---|---|---|
PID namespace | CLONE_NEWPID | 进程空间(进程ID) |
Mount namespace | CLONE_NEWNS | 文件系统挂载点 |
Network namespace | CLONE_NEWNET | 网络资源:网络设备、端口等 |
User namespace | CLONE NEWUSER | 用户ID和用户组ID |
UTS namespace | CLONE NEWUTS | 主机名和域名 |
IPC namespace | CLONE_NEWIP | 信号量、消息队列和共享内存 |
cgroups
是 Linux 内核的一个子系统,主要作用是:
- 限制资源:限制某个进程组最多可以使用多少资源。
- 监控资源:监控某个进程组当前使用了多少资源。
- 优先级控制:例如通过
cpu.shares
来设置容器的 CPU 调度优先级。 - 进程分组:将进程组织在一起,进行统一管理
cgroups内存限制参数
参数 | 说明 | 示例 |
---|---|---|
--memory 或 -m | 限制容器使用的最大内存 | -m 512m (512MB) |
--memory-swap | 设置总的 swap + memory 限制,必须 ≥ memory,-1 表示无限制 | --memory-swap 1g |
--memory-reservation | 设置软限制(低于 memory 的值) | --memory-reservation 256m |
--kernel-memory (不推荐) | 限制内核内存使用(已弃用) | --kernel-memory 50m (已被移除) |
--oom-kill-disable | 禁用 OOM Killer | --oom-kill-disable=true |
CPU 限制参数
参数 | 说明 | 示例 |
---|---|---|
--cpus | 限制使用的 CPU 数量(可为小数) | --cpus=1.5 (最多使用 1.5 核) |
--cpu-shares | 设置 CPU 权重(相对值,默认 1024) | --cpu-shares=512 (权重为默认的一半) |
--cpuset-cpus | 限制容器只能运行在哪些 CPU 核上 | --cpuset-cpus="0,2" |
--cpu-period | 设置 CPU 周期(单位:微秒,默认 100000) | --cpu-period=50000 |
--cpu-quota | 设置 CPU 配额(必须与 period 配合) | --cpu-quota=25000 |
--cpuset-mems | 设置容器可用的内存节点(NUMA 系统使用) | --cpuset-mems="0,1" |
块设备 I/O 限制参数
参数 | 说明 | 示例 |
---|---|---|
--blkio-weight | 设置整体 I/O 权重(范围:10~1000) | --blkio-weight=300 |
--device-read-bps | 限制读取速率(按字节) | --device-read-bps /dev/sda:1mb |
--device-write-bps | 限制写入速率 | --device-write-bps /dev/sda:2mb |
--device-read-iops | 限制读取 IOPS | --device-read-iops /dev/sda:100 |
--device-write-iops | 限制写入 IOPS | --device-write-iops /dev/sda:200 |
1 | #样例 |
列出所有运行的容器
1 | docker ps [OPTIONS] |
OPTIONS参数
参数 | 描述 |
---|---|
-a | 查看所有容器的运行记录 |
-n=? | 显示最近创建的n个容器 |
-q | 只显示容器的id |
删除指定容器
1 | docker rm 容器id/容器名 #删除指定容器 |
启动容器
1 | docker start 容器id/容器名 |
重启容器
1 | docker restart 容器id/容器名 |
停止容器
1 | docker stop 容器id/容器名 |
强制停止容器
1 | docker kill 容器id/容器名 |
容器暂停和恢复
1 | docker pause #暂停容器中所有的进程,后面可指定容器 |
等待容器退出返回码
1 | docker wait 容器 #阻塞运行直到容器停止,然后打印出它的退出代码 |
exec和attach进入容器内部命令
exec与attach的比较:
比较项 | docker attach |
docker exec |
---|---|---|
连接的是 | 容器主进程 | 容器中任意新命令 |
是否新开终端 | ❌ 否 | ✅ 是 |
多人同时使用 | ❌ 一般不推荐 | ✅ 支持多个并发 |
退出容器会关闭吗 | ✅ 有风险(看主进程) | ❌ 不会影响主进程 |
exec命令
1 | docker exec [OPTIONS] CONTAINER COMMAND [ARG...] #使用示例 |
OPTIONS参数
选项 | 含义 | 应用示例 | 场景解释 |
---|---|---|---|
-d, --detach | 后台运行命令 | docker exec -d mycontainer sh -c "sleep 30" | 在容器中异步执行脚本,不阻塞主终端 |
--detach-keys | 自定义退出快捷键 | docker exec --detach-keys="ctrl-e,e" mycontainer bash | 默认是 ctrl-p + ctrl-q ,可以改为你喜欢的组合 |
-e, --env | 设置环境变量 | docker exec -e ENV_MODE=debug mycontainer bash | 临时在容器中注入变量(如调试模式) |
--env-file | 从文件加载环境变量 | docker exec --env-file ./env.list mycontainer bash | 一次性设置多个变量,方便管理配置 |
-i, --interactive | 保持标准输入打开 | 常与 -t 搭配使用 | docker exec -it mycontainer bash |
--privileged | 提供更高权限 | docker exec --privileged mycontainer bash | 访问内核、挂载设备等高级操作(一般不常用) |
-t, --tty | 分配伪终端 | docker exec -t mycontainer bash | 用于格式良好的输出(如颜色、界面) |
-u, --user | 指定运行用户 | docker exec -u root mycontainer bash | 指定以 root 或其它用户身份运行 |
-w, --workdir | 指定容器内工作目录 | docker exec -w /usr/local mycontainer ls | 控制命令在哪个目录执行 |
attach命令
1 | docker attach [OPTIONS] 容器ID/容器名 #使用示例 |
attch进入容器后,可以使用默认退出方式:Ctrl + P
,然后 Ctrl + Q
(注意,不是 Ctrl+C)
重命名容器
1 | docker rename 容器 新的容器名字 |
run运行容器
1 | docker run [OPTIONS] 镜像 [COMMAND] [ARG...] #使用示例 |
OPTIONS参数
选项 | 含义 | 示例 |
---|---|---|
-d | 后台运行容器(Detached) | -d |
-it | 交互模式 + 伪终端 | -it |
--name | 为容器命名 | --name myweb |
-p | 端口映射(主机:容器) | -p 8080:80 |
-e | 设置环境变量 | -e ENV=prod |
-v | 挂载卷(宿主机:容器) | -v /data:/data |
--rm | 容器退出后自动删除 | --rm |
--restart | 容器异常重启策略 no,默认策略,在容器退出时不重启容器 on-failure,在容器非正常退出时(退出状态非0),才会重启容器 on-failure:3,在容器非正常退出时重启容器,最多重启3次 always,在容器退出时总是重启容器 unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器 | --restart=always |
--network | 加入指定网络,默认网络类型有host、bridge、none | --network=my_net |
-u | 指定用户 | -u 1000:1000 |
-w | 设置工作目录 | -w /app |
1 | --dns:指定容器使用的自定义 DNS 服务器。 |
网络network命令
1 | docker常见的网络类型 |
网络类型对比
网络类型 | 适用场景 | 是否跨主机 | 是否分配独立 IP | 是否需端口映射 |
---|---|---|---|---|
bridge | 单机容器通信 | 否 | 是(内部私网) | 是 |
host | 性能要求高、需与主机同网络 | 否 | 否 | 否 |
none | 网络隔离、安全测试 | 否 | 否 | 否 |
overlay | 集群容器通信(Swarm/K8s) | 是 | 是 | 是 |
macvlan | 容器模拟物理主机,连入真实网络 | 否 | 是(物理网段) | 否 |
创建docker自定义网络
1 | docker network create [OPTIONS] NETWORK_NAME #创建示例 |
OPTIONS参数类型
参数 | 类型 | 作用说明 |
---|---|---|
--driver , -d | 字符串 | 指定网络驱动类型,如 bridge 、overlay 、macvlan 、host ,默认是 bridge 。 |
--subnet | 字符串 | 指定自定义子网(如 192.168.100.0/24 ),仅部分网络类型支持(如 bridge 、macvlan )。 |
--gateway | 字符串 | 指定网关 IP(如 192.168.100.1 ),需与 --subnet 搭配使用。 |
--ip-range | 字符串 | 指定 IP 分配范围,容器 IP 将从这个范围中选取。 |
--ipam-driver | 字符串 | 指定 IP 地址管理(IPAM)驱动,默认是 default 。 |
--ipam-opt | 多个键值对 | 为 IPAM 驱动指定自定义选项。 |
--aux-address | 多个键值对 | 为某些保留地址指定名称(如为特殊设备保留地址)。 |
--internal | 无 | 创建一个内部网络,不允许外部访问(常用于安全隔离)。 |
--attachable | 无 | 允许非 swarm 服务的容器手动连接 overlay 网络(仅 overlay 类型有效)。 |
--ingress | 无 | 标记该 overlay 网络为 ingress 网络(Swarm 路由负载均衡使用)。 |
--config-from | 字符串 | 从已有网络复制配置。 |
--config-only | 无 | 创建仅供配置使用的网络。 |
--label | 多个键值对 | 给网络加标签(方便识别和管理)。 |
--opt , -o | 多个键值对 | 网络驱动的自定义选项(如 macvlan 的 parent=eth0 )。 |
1 | #创建带 IP 子网的 bridge 网络 |
查询docker网络详细信息
docker network inspect 是一个用于查看 Docker 网络详细信息的命令,常用于排查网络问题、验证容器连接、查看 IP 配置、网桥名等信息。
1 | docker network inspect [OPTIONS] NETWORK_NAME | NETWORK_ID #查询示例 |
1 | [ |
查询信息的相关字段
字段名 | 含义 |
---|---|
Name | 网络名称 |
Id | 网络的唯一标识符(UUID) |
Driver | 网络驱动类型(如 bridge , overlay , macvlan ) |
Scope | 网络的作用范围(local 表示本地,global 表示集群) |
IPAM | IP 地址分配信息(包括子网和网关) |
Containers | 当前连接到此网络的容器列表及其网络信息 |
Options | 网络创建时的自定义选项 |
Labels | 用户设置的标签 |
容器连接多网络
docker network connect
是一个非常实用的命令,用于将已存在的容器连接到另一个网络,从而实现容器跨网络通信。它通常用于容器同时加入多个网络的场景。
1 | docker network connect [OPTIONS] NETWORK CONTAINER #使用示例 |
也可以自定义加入的网络IP地址
参数 | 作用 |
---|---|
--ip |
手动指定容器在该网络下的 IPv4 地址(需要配合网络的 --subnet 使用) |
--ip6 |
指定 IPv6 地址(如果网络支持) |
--link |
已废弃,不推荐使用 |
--alias |
指定容器在该网络中的别名,其他容器可以用这个别名访问它 |
1 | #创建自定义网络custom-net |
希望容器的网络退出,可以使用disconnect,容器多网卡通信完毕后移除不需要的网络
1 | docker network disconnect [OPTIONS] NETWORK CONTAINER #断开容器的网络 |
列出docker所有网络
1 | docker network ls [OPTIONS] #使用示例 |
OPTIONS相关参数
参数 | 含义 | 示例 |
---|---|---|
-f, --filter | 使用条件过滤网络(可以使用多个) | --filter driver=bridge |
--format | 自定义输出格式(Go 模板语法) | --format "{ {Name}}: { {Driver}}" |
--no-trunc | 不截断输出(完整显示 ID 等字段) | --no-trunc |
-q, --quiet | 只列出网络 ID(适合脚本中使用) | --quiet 或 -q |
过滤支持的条件
字段 | 示例 | 含义 |
---|---|---|
driver | --filter driver=bridge | 根据网络类型过滤(如 bridge、overlay) |
name | --filter name=web | 按网络名称(支持模糊匹配) |
id | --filter id=b129f4e4b8d3 | 根据网络 ID 过滤 |
label | --filter label=env=prod | 根据标签过滤 |
scope | --filter scope=local | 根据作用范围过滤(local/global) |
type | --filter type=custom 或 --filter type=builtin | 自定义网络 or 系统内置网络 |
清理不需要的网络
docker network prune 是一个用于清理未被任何容器使用的网络的命令。它非常适合日常清理工作环境中产生的多余网络,保持系统整洁。
执行删除时会跳过docker默认就有的网络类型:
bridge
host
none
1 | docker network prune [OPTIONS] #使用示例 |
OPTIONS相关参数
参数 | 简写 | 说明 | 示例 |
---|---|---|---|
--force | -f | 跳过用户确认,直接执行删除操作 | docker network prune -f |
--filter | 无 | 添加过滤条件,仅清除匹配的网络 | --filter "label!=keep" |
过滤相关参数
条件名 | 示例 | 含义 |
---|---|---|
label=<key> | label=env=test | 只删除带有这个标签的网络 |
label!=<key> | label!=keep | 忽略带有该标签的网络 |
until=<时间> | until=24h | 仅删除 24 小时前创建的未使用网络。单位:s , m , h , d (秒/分/时/天) |
1 | docker network prune --filter "until=24h" #删除未使用并且创建超过一天的网络 |
docker指定删除网络
与prune不同,rm可以删除多个指定的网络,但是网络必须是用户自定义的,非内建(不能删除 bridge
、host
、none
)。网络不能有容器连接,否则删除会失败。
1 | docker network rm [NETWORK...] #使用实例 |
卷volume命令
Volume 是 Docker 推荐用于 持久化容器数据 的机制。与容器生命周期无关,容器删除时 Volume 不会消失,可复用、易于备份、可共享。具有以下特点:
特性 | 描述 |
---|---|
生命周期独立 | 容器删了,volume 不会删 |
跨容器共享 | 多个容器可挂载同一个 volume |
可备份易迁移 | 可复制到其他宿主机或存储中 |
性能好、权限安全 | 优于 bind mount(绑定宿主机路径) |
可用于命名挂载 | 如 /data , /var/lib/mysql 等 |
创建卷
1 | docker volume create [OPTIONS] [VOLUME_NAME] #使用示例 |
OPTIONS相关参数
参数名 | 说明 | 示例 |
---|---|---|
--driver , -d | 使用的存储驱动,默认为 local ,也可为 nfs , flocker , tmpfs 等 | --driver local |
--label | 为卷打标签 | --label env=prod |
--opt , -o | 为驱动传递选项参数 | --opt type=tmpfs |
默认使用 local
驱动,存储路径在:/var/lib/docker/volumes/卷名/_data
1 | #创建并打标签的 Volume |
卷相关命令
1 | docker volume inspect 卷名 #查看详细信息 |
其余命令
1 | docker top 容器id #查看容器中进程信息ps |