[TOC]

0x00 docker 命令一览

Docker 命令有两大类,客户端命令和服务端命令。

  • 前者是主要的操作接口 :docker
  • 后者用来启动 Docker Daemon: dockerd
#Usage:
$docker [OPTIONS] COMMAND [arg...]
$docker daemon [ --help | ... ] #二级命令的帮助
$docker [ --help | -v | --version ]


1)docker –help 执行后的命令:

#选项
Options:
--config=~/.$docker Location of client config files #客户端配置文件的位置
-D, --debug=false Enable debug mode #启用Debug调试模式
-H, --host=[] Daemon socket(s) to connect to #守护进程的套接字(Socket)连接
-h, --help=false Print usage #打印使用帮助
-l, --log-level=info Set the logging level #设置日志级别
--tls=false Use TLS; implied by--tlsverify #
--tlscacert=~/.$docker/ca.pem Trust certs signed only by this CA #信任证书签名CA
--tlscert=~/.$docker/cert.pem Path to TLS certificate file #TLS证书文件路径
--tlskey=~/.$docker/key.pem Path to TLS key file #TLS密钥文件路径
--tlsverify=false Use TLS and verify the remote #使用TLS验证远程
-v, --version=false Print version information and quit #打印版本信息并退出


#命令
Commands:
attach Attach to a running container #当前shell下attach连接指定运行镜像
build Build an image from a $dockerfile #通过$dockerfile定制镜像
commit Create a new image from a container's changes #提交当前容器为新的镜像
cp Copy files/folders from a container to a HOSTDIR or to STDOUT #从容器中拷贝指定文件或者目录到宿主机中
create Create a new container #创建一个新的容器,同run 但不启动容器
diff Inspect changes on a container's filesystem #查看$docker容器变化
events Get real time events from the server#从$docker服务获取容器实时事件
exec Run a command in a running container#在已存在的容器上运行命令
export Export a containers filesystem as a tar archive #导出容器的内容流作为一个tar归档文件(对应import)
history Show the history of an image #展示一个镜像形成历史
images List images #列出系统当前镜像
import Import the contents from a tarball to create a filesystem image #从tar包中的内容创建一个新的文件系统映像(对应export)
info Display system-wide information #显示系统相关信息
inspect Return low-level information on a container or image #提取出容器或者镜像最顶层的元数据
kill Kill a running container #kill指定$docker容器
load Load an image from a tar archive or STDIN #从一个tar包中加载一个镜像(对应save)
login Register or log in to a $docker registry#注册或者登陆一个$docker源服务器
logout Log out from a $docker registry #从当前$docker registry退出
logs Fetch the logs of a container #输出当前容器日志信息
pause Pause all processes within a container#暂停容器
port List port mappings or a specific mapping for the CONTAINER #查看映射端口对应的容器内部源端口
ps List containers #列出容器列表
pull Pull an image or a repository from a registry #从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to a registry #推送指定镜像或者库镜像至$docker源服务器
rename Rename a container # rename 重命名一个容器
restart Restart a running container #重启运行的容器
rm Remove one or more containers #移除一个或者多个容器
rmi Remove one or more images #移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)
run Run a command in a new container #创建一个新的容器并运行一个命令
save Save an image(s) to a tar archive#保存一个镜像为一个tar包(对应load)
search Search the $docker Hub for images #在$docker
hub中搜索镜像
start Start one or more stopped containers#启动容器
stats Display a live stream of container(s) resource usage statistics #统计容器使用资源
stop Stop a running container #停止容器
tag Tag an image into a repository #给源中镜像打标签
top Display the running processes of a container #查看容器中运行的进程信息
unpause Unpause all processes within a container #取消暂停容器
version Show the $docker version information#查看容器版本号
wait Block until a container stops, then print its exit code #截取容器停止时的退出状态值
Run '$docker COMMAND --help' for more information on a command. #运行$docker命令在帮助可以获取更多信息

#后台运行
ctrl + p + ctrl + q


2)dockerd 命令选项

--api-cors-header="":CORS 头部域,默认不允许 CORS,要允许任意的跨域访问,可以指定为 "*"
--authorization-plugin="":载入认证的插件;
-b="":将容器挂载到一个已存在的网桥上。指定为 none 时则禁用容器的网络,与 --bip 选项互斥;
--bip="":让动态创建的 docker0 网桥采用给定的 CIDR 地址; 与 -b 选项互斥;
--cgroup-parent="":指定 cgroup 的父组,默认 fs cgroup 驱动为 /docker,systemd cgroup 驱动为 system.slice;
--cluster-store="":构成集群(如 Swarm)时,集群键值数据库服务地址;
--cluster-advertise="":构成集群时,自身的被访问地址,可以为 host:port 或 interface:port;
--cluster-store-opt="":构成集群时,键值数据库的配置选项;
--config-file="/etc/docker/daemon.json":daemon 配置文件路径;
--containerd="":containerd 文件的路径;
-D, --debug=true|false:是否使用 Debug 模式。缺省为 false
--default-gateway="":容器的 IPv4 网关地址,必须在网桥的子网段内;
--default-gateway-v6="":容器的 IPv6 网关地址;
--default-ulimit=[]:默认的 ulimit 值;
--disable-legacy-registry=true|false:是否允许访问旧版本的镜像仓库服务器;
--dns="":指定容器使用的 DNS 服务器地址;
--dns-opt="":DNS 选项;
--dns-search=[]:DNS 搜索域;
--exec-opt=[]:运行时的执行选项;
--exec-root="":容器执行状态文件的根路径,默认为 /var/run/docker;
--fixed-cidr="":限定分配 IPv4 地址范围;
--fixed-cidr-v6="":限定分配 IPv6 地址范围;
-G, --group="":分配给 unix 套接字的组,默认为 docker;
-g, --graph="":Docker 运行时的根路径,默认为 /var/lib/docker;
-H, --host=[]:指定命令对应 Docker daemon 的监听接口,可以为 unix 套接字 unix:///path/to/socket,文件句柄 fd://socketfd 或 tcp 套接字 tcp://[host[:port]],默认为 unix:///var/run/docker.sock;
--icc=true|false:是否启用容器间以及跟 daemon 所在主机的通信。默认为 true
--insecure-registry=[]:允许访问给定的非安全仓库服务;
--ip="":绑定容器端口时候的默认 IP 地址。缺省为 0.0.0.0;
--ip-forward=true|false:是否检查启动在 Docker 主机上的启用 IP 转发服务,默认开启。注意关闭该选项将不对系统转发能力进行任何检查修改;
--ip-masq=true|false:是否进行地址伪装,用于容器访问外部网络,默认开启;
--iptables=true|false:是否允许 Docker 添加 iptables 规则。缺省为 true
--ipv6=true|false:是否启用 IPv6 支持,默认关闭;
-l, --log-level="debug|info|warn|error|fatal":指定日志输出级别;
--label="[]":添加指定的键值对标注;
--log-driver="json-file|syslog|journald|gelf|fluentd|awslogs|splunk|etwlogs|gcplogs|none":指定日志后端驱动,默认为 json-file;
--log-opt=[]:日志后端的选项;
--mtu=VALUE:指定容器网络的 mtu;
-p="":指定 daemon 的 PID 文件路径。缺省为 /var/run/docker.pid;
--raw-logs:输出原始,未加色彩的日志信息;
--registry-mirror=<scheme>://<host>:指定 docker pull 时使用的注册服务器镜像地址;
-s, --storage-driver="":指定使用给定的存储后端;
--selinux-enabled=true|false:是否启用 SELinux 支持。缺省值为 false。SELinux 目前尚不支持 overlay 存储驱动;
--storage-opt=[]:驱动后端选项;
--tls=true|false:是否对 Docker daemon 启用 TLS 安全机制,默认为否;
--tlscacert=/.docker/ca.pem:TLS CA 签名的可信证书文件路径;
--tlscert=/.docker/cert.pem:TLS 可信证书文件路径;
--tlscert=/.docker/key.pem:TLS 密钥文件路径;
--tlsverify=true|false:启用 TLS 校验,默认为否;
--userland-proxy=true|false:是否使用用户态代理来实现容器间和出容器的回环通信,默认为 true
--userns-remap=default|uid:gid|user:group|user|uid:指定容器的用户命名空间,默认是创建新的 UID 和 GID 映射到容器内进程。

WeiyiGeek.命令一张图表示


3)docker 命令详细

基础命令:

#容器基础命令#
$docker info #查看 docker 全局状态
$docker login #连接并初始化hub仓库 需要输入用户名和密码认证,然后存放于/root/.docker/config.json 文件中

$docker search [镜像名称] #搜索关于Archlinux镜像
#支持的参数:
# --automated=false #仅仅显示自动创建的镜像(官方)
# --no-trunc=false #输出信息不截断显示
# -s,--stars=0 #指定仅显示评价为指定星级以上的镜像
$docker search -s 10 ubuntu #搜索那些被收藏10次以上的ubuntu镜像
$docker pull name/[repository[:tag]] #获取Hub镜像如果不指定TAG将默认选择仓库中最新颁布的镜像


#数据资源共享#
$docker cp #(类似于SCP可以双向拷贝)
$docker cp containerID[names]:/home/1.php /opt/php/ #把容器的1.php拷贝到宿主机opt目录
$docker cp opt/php/config.php ontainerID[names]:/home/ #把宿主机的config.php拷贝到容器

$docker volume create my-vol #创建一个数据卷
$docker volume ls #查看数据线卷
$docker volume inspect 5be64caf #数据卷信息


#镜像容器信息#
$docker history docker.io/mysql:5.7 #查看镜像修改记录
$docker container ls -a #查看列出运行的容器
$docker image ls #列出本机已有镜像
$docker images -f [过滤] #列出本机已有镜像
# -f,--filter 过滤器参数
#--format 以特定的格式显示 "table {{.ID}}}"

$docker inspect [image id] #获取镜像的详细信息
$docker inspect -f {{".Architecture"}} 550(images Id 前面3位) #-f 获取单个属性 返回JSON
$docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID or NAME>

$docker ps -aq --no-trunc #显示本机上的所有容器ID运行的容器ID信息
#ps参数如下:#
# -a 可以列出所有容器
# -l 可以列出最后一次运行的容器-历史运行
# -q 可以列出容器ID
#--no-trunc #显示完整的容器ID
docker ps -q -f status=exited
docker images -q -f "dangling=true"


#容器操作#
$docker run [组织名称]/<镜像名称>:[镜像标签]
$docker run hello-world #运行一个$docker镜像,产生一个容器实例(也可以通过镜像id前三位运行)
$docker run -d repository[:tag] /bin/sh -C "echo hello word" –restart always #守护态运行
$docker run --entrypoint htpasswd registry -Bbn testuser testpassword #在registry中执行htpasswd且-Bbn为参数;
$docker run -it --rm -name stress/stress-ng stress help #镜像中的使用帮助

#run参数使用解析如下:#
# -e 参数指定环境变量 VARIABLE=VALUE 也可采用 -env-file=FILE 设置文件
# -d 参数即可后台运行,用户无法看到容器中的信息
# -c 运行一段shell命令 "while true;do echo 正在运行; sleep 1;done"
# --rm 添加这个标记,容器会在停止后立即删除自身 (注意:与-d不能同时使用)
# --name 使用--name web 标记可以为容器重新命名
# -i 让容器的标准输入保持打开
# -t 让$docker分配一个伪终端ptty,并绑定到容器的标准输入上
#–restart always 容器出错自动重启
#-m 128m 指定容器运行内存为128m
# "while true;do echo 正在运行; sleep 1;done" 在linux后台,每秒中打印一次正在运行
#--entrypoint 在容器中执行指定的应用
#--mount #挂载数据卷到容器之中 type=bind,source=/src/webapp,target=/opt/webapp,readonly
#-h HOSTNAME 或者 --hostname=HOSTNAME 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。
#--dns=IP_ADDRESS 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
#--dns-search=DOMAIN 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。
#--link=CONTAINER_NAME:ALIAS 添加到另一个容器的连接
#--network | --net=bridge|none|container:NAME_or_ID|host 配置容器的桥接模式
#--volumes-from [数据卷名称] 挂载的数据卷
# -c|--cpu-shares[=0] 调整容器使用 CPU 的权重
# -m|--memory[=MEMORY] 调整容器使用内存的大小

$docker create -it repository[:tag] #创建容器但处于停止状态
$docker start -a -i <container id>
# -a 参数 连接容器并打印输出或错误 -
# -i 参数 启动容器并进入交互模式
$docker exec -it <Container-id> /bin/bash #$docker exec 至1.3版本起可以在容器中运行命令
$docker attach [names] #采用ps -a NAMES 进入容器
$docker restart <container id> #重启容器
$docker pause <container id> #暂停容器
$docker unpause <container id> #恢复容器
$docker stop <container id>  #停止容器
$docker kill <cantainer id> #强行终止容器 可以直接发送SIGKILL信号来终止容器
$docker rename my-nginx new-nginx

$docker build --target=builder -t weiyigeek/repo:version . #dockerfile编译,非常注意上下文
#-t 指定仓库名和版本号
#-f 指定docker文件
#--target 指定构建xxx阶段
#--no-cache=true 构建阶段不使用缓存,即映像层不复用


#容器修改提交#
$docker commit [option-选项] ContainerId [Repository[:Tag]]
$docker commit -m "xx" -a "oo" ContainerID(被修改过的ID) [Repository[:Tag]]
# -a,--author="作者"
# -m,--message="更改信息"
# -p,--pause=ture 提交时暂停容器Container运行

$docker tag 原仓库[:标签] 新仓库名[:标签] #为本地镜像添加一个新标签 [注意仓库名称必须小写]
$docker tag <image id> username/name:devel #修改镜像的标签
$docker push $dockerHubUser用户/test:latest #上传到$docker仓库


#镜像仓库删除#
$docker rm <container id> #删除容器删除依赖该镜像的容器ID,前3位即可
$docker rm -vf [<image id>|<repository> #删除容器以及数据卷
# -f,--force=false 强制终止并删除一个运行中的容器[默认会发生SIGKILL信号]
# -l,--link=false 删除容器连接但保留容器
# -v,--volumes=false 同时删除容器挂载的数据卷

$docker rmi [<image id>|<repository> ] #删除镜像 镜像id|仓库名称
$docker rmi -f <images id>   #不建议强行删除正在容器中运行的镜像文件


#镜像仓库导入导出#
$docker save -o 保存文件名.tar [repository[:tag]] #将镜像文件打包存出到磁盘
$docker save [repository[:tag]] > 保存文件名 #将镜像文件打包存出到磁盘
$docker load --input 保存文件名.tar #将打包的镜像文件进行载人
$docker load -i保存文件名.tar
$docker load < 保存文件名.tar
$docker export <container id> >导出文件.tar #导出容器
$docker import - repository[:tag] #导入容器


#容器资源信息查看#
$docker logs -f <Container-id>   #获取容器的输出信息 -f 不间断的显示容器日志
$docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID #查看指定时间后的日志,只显示最后100行
$docker logs --since 30m CONTAINER_ID #查看最近30分钟的日志
$docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID #查看某时间段日志
# --details 显示更多的信息
# -f, --follow 跟踪实时日志
# --since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
# --tail string 从日志末尾显示多少行日志, 默认是all
# -t, --timestamps 显示时间戳
# --until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)


$docker stats #查看容器监控资源信息(cpu 内存 网络流量等)
# CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
# 89bc1cc2018b nostalgic_easley 0.02% 64KiB / 1.795GiB 0.00% 1.31kB / 0B 0B / 0B 1
$docker top <container id> #查看容器进程信息
# UID PID PPID C STIME TTY TIME CMD
# root 15890 15873 0 09:36 pts/0 00:00:00 top


#网络建设#
$docker port [容器名称] [内部端口] #查看映射端口
$docker network create -d bridge [网络名称] #创建网络
#-d 参数指定 Docker 网络类型,有 bridge 、 overlay(用于Swarm mode)
$docker network connect #命令会在所连接的容器中创建新的网卡,以完成其与所指定网络的连接。
$docker network connect frontend c2


#系统清理#
$docker system prune #清除容器缓存(包括停止的容器)
$docker container prune # 删除所有退出状态的容器
$docker volume prune # 删除未被使用的数据卷(#无主的数据卷可能会占据很多空间,要清理请使用以下命令)
$docker image prune # 删除 dangling 或所有未被使用的镜像 <none> 这样的镜像文件

实际案例:

$docker image ls  # 查看本地所有镜像
$docker images # 查看$docker镜像
$docker images -f since=mongo:3.2 #看到在mongo:3.2 之后建立的镜像
$docker images -f before=mongo:3.2 #看到在mongo:3.2 之前建立的镜像
$docker images -f label=com.example.version=0.1 #如果镜像构建时,定义了 LABEL ,还可以通过 LABEL 来过滤。
$docker images --format "{{.ID}}: {{.Repository}}" #直接列出镜像结果,并且只包含镜像ID和仓库名


$docker image rmi hello-docker # 删除centos镜像
$docker container ls 当前正在运行的容器
$docker ps #列出正在运行的容器(如果创建容器中没有进程正在运行,容器就会立即停止)
$docker ps -a # 列出所有运行过的容器记录
$docker save centos > /opt/centos.tar.gz # 导出$docker镜像至本地
$docker load < /opt/centos.tar.gz #导入本地镜像到$docker镜像库
$docker stop `$docker ps -aq` # 停止所有正在运行的容器
$docker rm `$docker ps -aq` # 一次性删除所有容器记录
$docker rm $(docker ps -q -f status=exited) #删除已退出的镜像
$docker rmi `$docker images -aq` # 一次性删除所有本地的镜像记录
$docker rmi $(docker images --filter "dangling=true" -q --no-trunc) #
$docker rmi $(docker images -q -f "dangling=true") #删除没有运行的虚悬镜像(<none>)

#数据卷
$docker volume ls #列出数据卷。
$docker volume rm $(docker volume ls -qf dangling=true)

$docker network ls #网络连接类型以及ID

删除容器:docker container rm $(docker container ls -a -q)
删除镜像:docker image rm $(docker image ls -a -q)
删除数据卷:docker volume rm $(docker volume ls -q)
删除网络:network rm $(docker network ls -q)

#执行这个命令前系统中所有的容器都已停止,那么这个命令就会移除所有的资源
$ docker system prune --all --force --volumns
#首先使用最简单的方法,清理当前未运行的所有$docker容器:
alias docker-clean-unused='docker system prune --all --force --volumes'
alias docker-clean-all='docker stop $(docker container ls -a -q) && docker system prune --all --force --volumes'
#把上面的命令写入到用户的 ~/.bashrc 文件中就可以了!


0x02 docker配置文件说明

配置文件一览表:

  • /etc/docker/key.json #Docker认证
  • /root/.docker/config.json #Docker认证+启动配置(注意系统版本)

1.config.jsonvim /root/.$docker/config.json

{
"auths": {
"https://index.$docker.io/v1/": {
"auth": "********" //账号:密码
}
},
"HttpHeaders": {
"User-Agent": "$docker-Client/18.09.5 (linux)"
}
}


2.daemon.json

  • 新版的 $docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon
    请在该配置文件中加入(没有该文件的话,请先建一个):

    "registry-mirrors": ["https://$docker.mirrors.ustc.edu.cn"], //指定仓库地址
    "insecure-registries": ["192.168.11.37:5000"] //仓库不效验https
    "dns" : [
    "114.114.114.114",
    "8.8.8.8"
    ],
    "ip": "0.0.0.0", //永久绑定到某个固定的 IP 地址
    "icc": false, //禁止访问所有端口(来关闭容器之间的通信)
    "iptables":true, //启动防火墙
    "bridge": "bridge0", //设置默认桥接到新建立的桥接网卡
    "data-root": "/storage/", //更改 Docker 的默认存储位置
    "debug": true //此时 dockerd 会在日志中输入更多信息供分析。
    }


3.docker.service

  • 基于Docker-CE17.12版本以及之后, build 481bc77156
    docker服务配置文件路径:/lib/systemd/system/docker.service
    ExecStart=/usr/bin/dockerd --registry-mirror=https://xlx9erfu.mirror.aliyuncs.com


服务重启

#修改配置文件后进行平滑重启
$sudo kill -SIGHUP $(pidof dockerd)

#通用启动
$sudo systemctl daemon-reload #重载守护
$sudo systemctl restart docker

补充说明:

#Docker Server/Client:
Version: 1.12.6
API version: 1.24
- /etc/systemd/system/docker.service.requires/flanneld.service
- /etc/docker/


0x03 Docker入坑

问题1.本地的镜像文件都存放在哪里?
答:与 Docker 相关的本地资源默认存放在 /var/lib/docker/ 目录下,默认以 overlay2 文件系统为例
其中 container 目录存放容器信息,graph 目录存放镜像信息,aufs 目录下存放具体的镜像层文件。

$ll /var/lib/docker/image/overlay2/distribution/diffid-by-digest/sha256/
总用量 16
-rw-r--r-- 1 root root 71 6月 4 15:15 3c78d525c5d6e0101e4f53d5e4ee827c838b9d346f44e40db49c66638040d980
-rw-r--r-- 1 root root 71 6月 4 15:15 44559339aea968e196d4930b3d79068926964f415c0fccd3e1b197a5dd928ee7


问题2.如何给容器指定一个固定 IP 地址,而不是每次重启容器 IP 地址都会变?
答:自定义建立网络

$ docker network create -d bridge --subnet 172.25.0.0/16 my-net
$ docker run --network=my-net --ip=172.25.3.3 -itd --name=my-container busybox


问题3.如何临时退出一个正在交互的容器的终端,而不终止它?
答:按 Ctrl-p Ctrl-q。如果按 Ctrl-c 往往会让容器内应用进程终止,进而会终止容器。



问题4.使用 docker port 命令映射容器的端口时,系统报错“Error: No public port ‘80’ published for xxx”?

  • 创建镜像时 Dockerfile 要通过 EXPOSE 指定正确的开放端口;
  • 容器启动时指定 PublishAllPort = true。


面试问答5.仓库(Repository)、注册服务器(Registry)、注册索引(Index) 有何关系?

  • 仓库是存放一组关联镜像的集合,比如同一个应用的不同版本的镜像。
  • 注册服务器是存放实际的镜像文件的地方。
  • 注册索引则负责维护用户的账号、权限、搜索、标签等的管理。
    因此,注册服务器利用注册索引来实现认证等管理。


问题5.使用内存和 swap 限制启动容器时候报警告:”WARNING: Your kernel does not support cgroup swap limit. WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.”?
答:这是因为系统默认没有开启对内存和 swap 使用的统计功能,引入该功能会带来性能的下降。要开启该功能,可以采取如下操作:

  • 编辑 /etc/default/grub 文件(Ubuntu 系统为例),配置 GRUB_CMDLINE_LINUX=”cgroup_enable=memory swapaccount=1”

  • 更新 grub:$ sudo update-grub 重启系统,即可。


问题6.如何进入 Docker 容器的网络命名空间?
Docker 在创建容器后,删除了宿主主机上 /var/run/netns 目录中的相关的网络命名空间文件。
因此,在宿主主机上是无法看到或访问容器的网络命名空间的。

#以下操作可以查看并设置网络命名空间
$ docker inspect --format='{{. State.Pid}} ' $container_id #获取容器进程ID
1234
$ sudo ln -s /proc/1234/ns/net /var/run/netns/ #在proc目录下把对应的网络命名空间文件链接到 /var/run/netns 目录。
#然后,在宿主主机上就可以看到容器的网络命名空间信息。例如**
$ sudo ip netns show
1234

#设置操作容器的命名空间
$ sudo ip netns exec 1234 ifconfig eth0 172.17.0.100/16


问题7.如何重置 Docker 本地数据
$ sudo rm -rf /var/lib/docker #注意本操作会移除所有的 Docker 本地数据,包括镜像和容器等。