文章目录

  • Run的流程和Docker的原理
    • 一、回顾Hello Word的流程
    • 二、底层原理
  • Dockers的基本命令
    • 三、帮助命令
    • 帮助文档的地址:
    • 四、镜像命令
    • 五、容器命令
    • 常用其它命令

Run的流程和Docker的原理

一、回顾Hello Word的流程

run的流程运行图

二、底层原理

(1)、Docker是什么工作的?

Docker是一个 Client - Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!DockerServer接收到Docker-Client的指令,就会执行这个命令!

(2)、为什么Dockers比VM虚拟机快?

1、Docker有着比虚拟机更少的抽象层。
2、docker利用的是宿主机的内核,vm 需要是Guest Os.

所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统吗,省略了这个复杂的过程,秒级!

Dockers的基本命令

三、帮助命令

docker version  #显示Docker的版本信息
docker info     #显示Docker的系统信息,包括镜像和容器数量
docker 命令 --help #万能命令

帮助文档的地址:

https://docs.docker.com/engine/reference/commandline/build/

四、镜像命令

(1)、docker imagers 查看所有本地的主机镜像

#查看本地主机上所有的镜像
[root@localhost ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB#解释
repository 镜像的仓库源
TAG        镜像的标签
IMAGE ID   镜像的id
CREATED    镜像的创建时间
SIZE       镜像的大小#可选项
Options:-a, --all    #列出所有镜像         -q, --quiet  #只显示镜像的id

docker images

(2)、docker search 搜索镜像

[root@localhost ~]# docker search mysql
NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                            MySQL is a widely used, open-source relation…   12418     [OK]
mariadb                          MariaDB Server is a high performing open sou…   4784      [OK]
mysql/mysql-server               Optimized MySQL Server Docker images. Create…   918                  [OK]
percona                          Percona Server is a fork of the MySQL relati…   575       [OK]
phpmyadmin                       phpMyAdmin - A web interface for MySQL and M…   505       [OK]#可选项,通过搜藏来过滤
mysql --filter=stars=4000#查询STARS值大于4000的镜像
[root@localhost ~]# docker search mysql --filter=stars=4000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   12418     [OK]
mariadb   MariaDB Server is a high performing open sou…   4784      [OK]

docker search mysql

docker search mysql --filter=stars=4000

(3)、docker pull 下载镜像

#下载镜像 docker pull 镜像名【:tag】[root@localhost ~]# docker pull mysql
Using default tag: latest   #如果不写tag那么默认就是latest
latest: Pulling from library/mysql
72a69066d2fe: Pull complete #分层下载,docker images的核心 联合文件系统
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709  #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest  #真实地址#等价于它
docker pull mysql
docker pull docker.io /library/mysql:latest#指定版本下载
[root@localhost ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists
93619dbc5b36: Already exists
99da31dd6142: Already exists
626033c43d70: Already exists
37d5d7efb64e: Already exists
ac563158d721: Already exists
d2ba16033dad: Already exists
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

docker pull mysql

docker pull docker.io /library/mysql:latest

docker pull mysql:5.7

(4)、docker rmi删除镜像

[root@localhost ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
mysql         5.7       c20987f18b13   3 months ago   448MB
mysql         latest    3218b38490ce   3 months ago   516MB
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB#删除指定容器
[root@localhost ~]# docker rmi -f c20987f18b13 //容器ID
Untagged: mysql:5.7
Untagged: mysql@sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Deleted: sha256:c20987f18b130f9d144c9828df630417e2a9523148930dc3963e9d0dab302a76
Deleted: sha256:6567396b065ee734fb2dbb80c8923324a778426dfd01969f091f1ab2d52c7989
Deleted: sha256:0910f12649d514b471f1583a16f672ab67e3d29d9833a15dc2df50dd5536e40f
Deleted: sha256:6682af2fb40555c448b84711c7302d0f86fc716bbe9c7dc7dbd739ef9d757150
Deleted: sha256:5c062c3ac20f576d24454e74781511a5f96739f289edaadf2de934d06e910b92#删除所有之前启动过的容器
[root@localhost ~]# docker rm -f $(docker ps -aq)

docker rmi -f c20987f18b13

五、容器命令

说明:我们有了镜像才可以创建容器,Linux,下载一个CentOS镜像来测试学习

(1)、新建容器并启动

docker pull centos

(2)、新建容器并启动

docker run [可选参数] images#参数说明
--name=“name”  容器名字 tomcat01 tomcat02 ,用来区分容器
--d            后台方式运行
--it           使用交互方式运行,进入容器查看内容
--f            使用交互方式运行,进入容器查看内容
--P(这个p是大写的)            指定端口,-p 8080:8080-p ip:主机端口:容器端口-p主机端:容器端口(常用)-p容器端口容器端口--p            指定随机端口#测试,启动、、并进入容器
[root@localhost ~]# docker run -it centos /bin/bash#查看容器内的CentOS,基础版本,很多命令是不完善的
[root@c51cad0515c8 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var#退出容器,回到主机
[root@a59464d1b953 /]# exit
exit
[root@localhost ~]#

(3)、列出所有的运行的容器

docker ps
列出当前正在运行的容器

docker ps -a
列出当前正在运行的容器,带出历史运行过的容器

docker ps -a -n=1
显示最近创建的容器

docker ps -aq
只显示容器编号

#查看所有运行中的容器
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED              STATUS                          PORTS     NAMES
a59464d1b953   centos         "/bin/bash"   About a minute ago   Exited (0) About a minute ago             awesome_yonath
c51cad0515c8   centos         "/bin/bash"   6 minutes ago        Exited (130) 2 minutes ago                charming_cray
af8387ece97c   feb5d9fea6a5   "/hello"      About an hour ago    Exited (0) About an hour ago              happy_raman
056d36ae8336   feb5d9fea6a5   "/hello"      23 hours ago         Exited (0) 23 hours ago                   festive_satoshi[root@localhost ~]# docker ps -a -n=1
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
a59464d1b953   centos    "/bin/bash"   5 minutes ago   Exited (0) 5 minutes ago             awesome_yonath[root@localhost ~]# docker ps -aq
a59464d1b953
c51cad0515c8
af8387ece97c
056d36ae8336

docker ps

docker ps -a

docker ps -a -n=1

docker ps -aq

(4)、退出容器

exit  //直接退出
Ctrl + P + Q //容器不停止退出

(5)、删除容器

#删除所有的容器
[root@localhost ~]# docker rm -f $(docker ps -aq)
bae9036427e1
a59464d1b953
c51cad0515c8
af8387ece97c
056d36ae8336#删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -f
[root@localhost ~]# docker rm 容器id#删除所有的容器
[root@localhost ~]# docker ps -a -q |xargs docker rm

docker rm -f $(docker ps -aq)

docker rm 容器ID

docker ps -a -q |xargs docker rm

停止和启动容器

#启动容器
docker start 容器id#重启容器
docker restart 容器id# 停止当前正在运行的容器
docker stop 容器id#强制停止当前容器
docker kill 容器id

常用其它命令

(1)、docker启动容器

[root@localhost ~]# docker run -d centos
00e999c05bc91095a6de73ef908d5a207a4cb846c6e07941f14a8c3a7b11739e#发现docker ps centos停止了#常见的坑: docker容器使用后台运行,就必须要有要一个前台进程,
docker发现没有应用,就会自动停止# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了

docker run -d centos

(2)、查看容器日志

#可以发现这里面没有日志[root@localhost ~]# docker logs -f -t --tail d76188e7cf20
"docker logs" requires exactly 1 argument.
See 'docker logs --help'.Usage:  docker logs [OPTIONS] CONTAINERFetch the logs of a container#自己编写一个shell脚本
[root@localhost ~]# docker run -d centos /bin/sh -c "while true;do echo kuangsheng 1;sleep;done"
4f200a4d2729a815d5bc3a95c6842d9c64100768626e3c87efc87271014a47c4[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
4f200a4d2729   centos    "/bin/sh -c 'while t…"   6 seconds ago   Up 5 seconds             angry_wescoff# 显示日志# -tf 显示日志
# tail number 要是显示日志的条数[root@localhost ~]# docker logs -f -t --tail 4f200a4d2729
"docker logs" requires exactly 1 argument.
See 'docker logs --help'.Usage:  docker logs [OPTIONS] CONTAINERFetch the logs of a container

docker logs -f -t --tail d76188e7cf20

docker run -d centos /bin/sh -c “while true;do echo kuangsheng 1;sleep;done”

docker ps

docker logs -f -t --tail 4f200a4d2729

(3)、查看容器中的进程信息

[root@localhost ~]# docker top 4f200a4d2729
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                2786                2766                15                  16:48               ?                   00:01:08            /bin/sh -c while true;do echo kuangsheng 1;sleep;done

docker top 容器ID

查看镜像的元数据

# docker inspect 镜像ID[root@localhost ~]# docker inspect 4f200a4d2729
[{"Id": "4f200a4d2729a815d5bc3a95c6842d9c64100768626e3c87efc87271014a47c4","Created": "2022-04-18T08:48:39.847648119Z","Path": "/bin/sh","Args": ["-c","while true;do echo kuangsheng 1;sleep;done"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 2786,"ExitCode": 0,"Error": "","StartedAt": "2022-04-18T08:48:40.408308326Z","FinishedAt": "0001-01-01T00:00:00Z"},"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6","ResolvConfPath": "/var/lib/docker/containers/4f200a4d2729a815d5bc3a95c6842d9c64100768626e3c87efc87271014a47c4/resolv.conf","HostnamePath": "/var/lib/docker/containers/4f200a4d2729a815d5bc3a95c6842d9c64100768626e3c87efc87271014a47c4/hostname","HostsPath": "/var/lib/docker/containers/4f200a4d2729a815d5bc3a95c6842d9c64100768626e3c87efc87271014a47c4/hosts","LogPath": "/var/lib/docker/containers/4f200a4d2729a815d5bc3a95c6842d9c64100768626e3c87efc87271014a47c4/4f200a4d2729a815d5bc3a95c6842d9c64100768626e3c87efc87271014a47c4-json.log","Name": "/angry_wescoff","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "","ExecIDs": null,"HostConfig": {"Binds": null,"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "default","PortBindings": {},"RestartPolicy": {"Name": "no","MaximumRetryCount": 0},"AutoRemove": false,"VolumeDriver": "","VolumesFrom": null,"CapAdd": null,"CapDrop": null,"CgroupnsMode": "host","Dns": [],"DnsOptions": [],"DnsSearch": [],"ExtraHosts": null,"GroupAdd": null,"IpcMode": "private","Cgroup": "","Links": null,"OomScoreAdj": 0,"PidMode": "","Privileged": false,"PublishAllPorts": false,"ReadonlyRootfs": false,"SecurityOpt": null,"UTSMode": "","UsernsMode": "","ShmSize": 67108864,"Runtime": "runc","ConsoleSize": [0,0],"Isolation": "","CpuShares": 0,"Memory": 0,"NanoCpus": 0,"CgroupParent": "","BlkioWeight": 0,"BlkioWeightDevice": [],"BlkioDeviceReadBps": null,"BlkioDeviceWriteBps": null,"BlkioDeviceReadIOps": null,"BlkioDeviceWriteIOps": null,"CpuPeriod": 0,"CpuQuota": 0,"CpuRealtimePeriod": 0,"CpuRealtimeRuntime": 0,"CpusetCpus": "","CpusetMems": "","Devices": [],"DeviceCgroupRules": null,"DeviceRequests": null,"KernelMemory": 0,"KernelMemoryTCP": 0,"MemoryReservation": 0,"MemorySwap": 0,"MemorySwappiness": null,"OomKillDisable": false,"PidsLimit": null,"Ulimits": null,"CpuCount": 0,"CpuPercent": 0,"IOMaximumIOps": 0,"IOMaximumBandwidth": 0,"MaskedPaths": ["/proc/asound","/proc/acpi","/proc/kcore","/proc/keys","/proc/latency_stats","/proc/timer_list","/proc/timer_stats","/proc/sched_debug","/proc/scsi","/sys/firmware"],"ReadonlyPaths": ["/proc/bus","/proc/fs","/proc/irq","/proc/sys","/proc/sysrq-trigger"]},"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/898985e8d57b4c9018bff56ca88ee9e1763ba31341762057a2dd994e40ba7574-init/diff:/var/lib/docker/overlay2/ee73028b139e6b329c78786b9704b63adf2b4ce344929a2fb3020a404f12a8c2/diff","MergedDir": "/var/lib/docker/overlay2/898985e8d57b4c9018bff56ca88ee9e1763ba31341762057a2dd994e40ba7574/merged","UpperDir": "/var/lib/docker/overlay2/898985e8d57b4c9018bff56ca88ee9e1763ba31341762057a2dd994e40ba7574/diff","WorkDir": "/var/lib/docker/overlay2/898985e8d57b4c9018bff56ca88ee9e1763ba31341762057a2dd994e40ba7574/work"},"Name": "overlay2"},"Mounts": [],"Config": {"Hostname": "4f200a4d2729","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/sh","-c","while true;do echo kuangsheng 1;sleep;done"],"Image": "centos","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20210915","org.label-schema.license": "GPLv2","org.label-schema.name": "CentOS Base Image","org.label-schema.schema-version": "1.0","org.label-schema.vendor": "CentOS"}},"NetworkSettings": {"Bridge": "","SandboxID": "279fe030fdf5e8d8b185347e299e4fe98e8d1edbd6a74d5ceaa909f17e398395","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {},"SandboxKey": "/var/run/docker/netns/279fe030fdf5","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "e3824d8e3307569420148658c4d6af8ef10489e98177e82e8d65bcefffb26c22","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:11:00:02","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "ebd53639a63f6686efac0148b1459e339bd02575ba73b0686b497fda8813ca4b","EndpointID": "e3824d8e3307569420148658c4d6af8ef10489e98177e82e8d65bcefffb26c22","Gateway": "172.17.0.1","IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:02","DriverOpts": null}}}}
]

docker inspect 镜像ID

进入当前正在运行的容器

#通常使用后台方式运行的,需要进入一些容器,修改一些配置#docker exec -it 容器id shellbash#测试
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
4f200a4d2729   centos    "/bin/sh -c 'while t…"   26 minutes ago   Up 26 minutes             angry_wescoff
[root@localhost ~]# docker exec -it 4f200a4d2729 /bin/bash
[root@4f200a4d2729 /]#
[root@4f200a4d2729 /]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0 15 08:48 ?        00:04:10 /bin/sh -c while true;do echo kuangsheng 1;sleep;done
root      54643      0  4 09:15 pts/0    00:00:00 /bin/bash
root      58460  54643  0 09:15 pts/0    00:00:00 ps -ef#方法二#docker attach CONTAINER ID
[root@localhost ~]# docker attach 4f200a4d2729 # docker exec  #进入容器后开启一个新的终端(常用)
# docker attach #进入容器正在执行的终端,不开启新的进程!#进入容docker容器
[root@localhost ~]# docker run -it 5d0da3dc9764 /bin/bash
WARNING: IPv4 forwarding is disabled. Networking will not work.
[root@495037bf2a54 /]# cd /home
#在容器内新建文件
[root@495037bf2a54 home]# touch test.java
[root@495037bf2a54 home]# ls
test.java
[root@495037bf2a54 home]# exit
exit
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS                      PORTS     NAMES
495037bf2a54   5d0da3dc9764   "/bin/bash"   39 seconds ago   Exited (0) 16 seconds ago             vigorous_hellman
056d36ae8336   hello-world    "/hello"      3 days ago       Exited (0) 3 days ago                 festive_satoshi
#将docker容器内的文件拷贝出来到主机上
#使用运行中的容器ID(不是镜像ID)
[root@localhost ~]# docker cp 495037bf2a54:/home/test.java /home
[root@localhost ~]# ls /home |grep test.java
test.java#拷贝只是一个手动过程,未来我们使用-V卷技术,可以实现

【Docker基本原理和常用命令】相关推荐

  1. docker 安装与常用命令与常用容器(containers)环境

    注意区别 container 与 image 的关系,container 的建立需要 image 的承载,也即 container 依赖 image,停止并删除了 container 并不会删除 im ...

  2. Docker系列之常用命令操作手册

    Docker系列之常用命令操作手册 继上一篇博客Docker系列之原理简单介绍之后,本博客对常用的Docker命令进行实践 文章目录 1.安装虚拟机 2.安装Docker 3.Docker镜像操作 4 ...

  3. docker之容器常用命令及基本操作

    docker之容器常用命令及基本操作 文章目录 docker之容器常用命令及基本操作 一.查看容器 `docker ps`常用选项 二.查看容器日志 `docker logs`命令选项 三.运行容器 ...

  4. Docker理解及常用命令一

    doccker学习笔记二:docker理解及常用命令 docker run理解 docker工作原理 Docker的常用命令 帮助命令 镜像命令 容器命令 docker run理解 回顾刚刚安装doc ...

  5. Docker Compose搭建consul群集环境(了解Docker Compose及常用命令,Docker四种网络,Doker指定端口)

    文章目录 Docker Compose搭建consul群集环境 认识Docker Compose IConsul Docker Compose容器编排 Dasker Compose配置常用字段 Bos ...

  6. Docker架构、常用命令和示例

    文章内容参考了<Docker容器实战:原理.架构与应用>. 镜像和容器 容器:运行在操作系统上的一个进程,只不过加入了对资源的隔离和限制.在Docker中,其容器技术的三大核心功能:CGr ...

  7. docker 容器 exited_docker常用命令整理

    docker常用命令整理 代码狂魔 • 5 天前 • 技术积累 • 14 • 0 前面已经把docker是什么和 docker怎么安装已经写了,现在我将常用命令做一个整理,方便日后查阅 常用命令 do ...

  8. Docker入门之常用命令

    写在前面 细数当前最流行的技术莫过于容器化和人工智能了,而容器化技术能有今天的热度,Docker可谓功不可没. 让我们一起来回顾一下Docker 是什么? 是一种虚拟化技术 能够将应用程序自动部署到容 ...

  9. Docker(安装常用命令)

    前言 提示:CentOS Linux 8的yum源配置: 本人Linux镜像为CentOS 8所以需要配置yum源,其他版本可省略 yum源配置 一.Docker安装 1.安装gcc yum -y i ...

最新文章

  1. 人与机器——解析人工智能的三大类别以及哲学家的相关思想实验
  2. 修复efi引导的win7
  3. centos7 LNMP
  4. Redmine 数据库连接错误
  5. 通过pxe从网络启动安装Windows XP
  6. pandas 读写 excel
  7. linux主频限制服务,linux抵御DDOS攻击 通过iptables限制TCP连接和频率
  8. UI界面设计中的5个实用版面排版技巧
  9. python基础之字典、集合
  10. 更改自定义按钮显示值并对单元格赋值
  11. Kconfig语法详解--结合示例
  12. QQ大盗 - 巧用clientkey
  13. 工具武装的前端开发工程师
  14. 【数据库】Redis
  15. x.norm(p=2,dim=1,keepdim=True)
  16. 005 |《共同富裕背景下党支部领办新型农村集体经济发展路径研究—以X村合作社为例》 | 大学生创新训练项目申请书 | 极致技术工厂
  17. angular2跳转路由, 获取路由参数
  18. pcs+corosync+pacemaker+haproxy负载均衡环境部署
  19. 【芝麻IP代理】8大高效的Python爬虫框架,你用过几个?
  20. vnc 红帽linux版下载,redhat安装 vnc

热门文章

  1. UiAUtomator基础入门级学习
  2. A or B Equals C Gym - 101028C
  3. 对比不同主流存储格式(csv, feather, jay, h5, parquet, pickle)的读取效率
  4. 百度编辑器ueditor-在线图片管理,想修改下默认的排序管理
  5. 【自我解析】2020华为杯数学建模比赛C题
  6. Selenium-actions
  7. 数据结构最常用的排序算法一(冒泡、插入、选择)-Java实现
  8. Python中的BMI指数
  9. 2018 秋招 百度二轮面试---血淋淋的经历写实
  10. ffmpeg 多个音频合并 截取 拆分