5.Docker容器学习之新手进阶使用

@

原文地址:点击直达
学习参考:https://yeasy.gitbooks.io/docker_practice/repository/registry.html

0x00 前言简述

描述: 本章主要学习与记录了在进一步学习Docker容器中的一些基础名称解析与Docker与一些辅助软件配合使用来增加工作效率以及简化运维流程;

辅助工具比如: Docker Machine, Swarm(架构很小的时候推荐), Compose;


0x01 名词解析

描述: 随着近些年云计算的流行,容器从出现至今广泛使用特别是在Kubernetes容器编排发布后由于其能快速为分布式架构的应用部署以及收缩,Docker 已经站在容器工具的顶端;

随着K8s的大热docker、oci、runc、containerd等等名词也逐渐传播开来。这么多的名词,也容易让人混淆。
本章对相关名词和其之间的联系进行一下梳理和总结,方便大家更好地理解。

container - 容器

描述: 我们所知Docker设计理念是一次Build到处运行,其Logo也是非常经典图标一条鲸鱼拖着若干个集装箱的经典形象已经深入人心;

Q: 现在问题来了在docker中container的翻译是译为容器还是集装箱?

答: 由于Container是在Docker出现以前产生,而在此之前Linux Container 就已经被翻译为Linux容器并被大家接受;从含义来看一开始选定把"容器"作为container的翻译,也应该是准确的。而随着docker出现,container的概念深入人心,而其与原来的linux container中的container含义应该说是一致的。

Q: 那何为容器?

答: 容器本质上是受到资源限制,彼此间相互隔离的若干个linux进程的集合,这是有别于基于模拟的虚拟机的。对于容器和虚拟机的区别的理解可以参考我前面所写的Docker基础文章;
一般来说容器技术主要指代用于资源限制的cgroup(Linux control group),用于隔离的namespace,以及基础的linux kernel等。


OCI - 镜像容器运行时标准

描述: Docker 公司与 CoreOS 和 Google 共同创建了 OCI (Open Container Initial - 开放初始化容器),并由linux基金会进行管理致力于images spec 与 container runtime的标准的制定和runc的开发等工作。

Q: 何为container runtime?

答: 主要负责的是容器的生命周期的管理; oci的runtime spec标准中对于容器的状态描述,以及对于容器的创建、删除、查看等操作进行了定义。
其容器在运行时分为两类: Low-level Runtime 、 High-Level Runtime;

Docker容器镜像仓库存储原理(前世今身)与技巧文章中我们知道runc是Low-Level Runtime当然也当前应用最为广泛的;

下面针对于runc我们做一个简单描述, 它是对于OCI标准的一个参考实现,是一个可以用于创建和运行容器的CLI(command-line interface)工具;
简单的说 runc直接与容器所依赖的 cgroup/linux kernel等进行交互,负责为容器配置cgroup/namespace等启动容器所需的环境,创建启动容器的相关进程。


Docker-Engine - 容器引擎

描述: 容器引擎或者说容器平台,不仅包含对于容器的生命周期的管理,还包括了对于容器生态的管理,比如对于镜像等。现在的docker、rkt以及阿里推出的pouch均可属于此范畴。

从Docker开源发布至今笔者认为可以分为两个阶段来理解。在笔者接触docker之初,docker版本为1.2,当时的docker的主要作用是容器的生命周期管理和镜像管理,当时的docker在功能上更趋近于现在的container runtime。而后来,随着docker的发展,docker就不再局限于容器的管理,还囊括了存储(volume)、网络(net)等的管理,因此后来的docker更多的是一个容器及容器生态的管理平台。

在容器编排领域的两种架构技术Swarm集群与Kubernetes集群,最终以Google家的Kubernetes胜出并且在分布式架构中广泛应用;


containerd - 货箱

描述:为了兼容oci标准docker也做了架构调整。将容器运行时相关的程序从docker daemon剥离出来形成了containerd
Containerd向docker提供运行容器的API二者通过grpc进行交互, containerd最后会通过runc来实际运行容器。

Conatinerd 与 Docker 引擎以及 runC 关系图:
WeiyiGeek.container ship 集装箱运货船货柜船


0x02 常用工具

Docker-Machine

描述: 它是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机, 其便于在Mac或者Windows上(需要和Docker Desktop for Windows-下载联合使用)进行安装, 还能进行远程的机器上安装与管理Docker宿主机,与之前说的vagrant非常类似;

官方手册:http://docs.docker.com/machine/
项目地址:https://github.com/docker/machine/releases/

简述作用:

  • (1) 旧的桌面系统版本中运行在Windows或者MAC的Docker环境中;
  • (2) 简化Docker和远程管理多个Docker Host机器,比如快速的给 100 台服务器安装上 docker。;

WeiyiGeek.图示

安装依赖:

  • 1.安装 Docker Machine 之前你需要先安装 Docker。
  • 2.您需要在您的机器上安装Virtualbox(MAC)或者Hyper-V(Windows)

安装流程:

  • Step1.在GitHub的docker/machine发布页面上找到最新版本的二进制文件进行拉取。
# Linux
base=https://github.com/docker/machine/releases/download/v0.16.2 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
  sudo mv /tmp/docker-machine /usr/local/bin/docker-machine &&
  chmod +x /usr/local/bin/docker-machine

#Windows (需借用Git Bash)
if [[ ! -d "$HOME/bin" ]]; then mkdir -p "$HOME/bin"; fi && \
curl -L https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-Windows-x86_64.exe > "$HOME/bin/docker-machine.exe" && \
chmod +x "$HOME/bin/docker-machine.exe"
  • Step 2.Docker-Machine自动生成的配置文件~/.docker/machine/machines/
# 查看docker信息

# 查看docker-machine安装
./docker-machine-Windows-x86_64.exe version
docker-machine-Windows-x86_64.exe version 0.16.2, build bd45ab13
  • Step 3.Docker-Machine卸载Remove the executable: rm $(which docker-machine)

docker-machine 命令
描述:使用 docker-machine 命令,您可以启动,检查,停止和重新启动托管主机,也可以升级 Docker 客户端和守护程序,以及配置 Docker 客户端与您的主机进行通信。

基础语法和参数:

Usage: docker-machine-Windows-x86_64.exe [OPTIONS] COMMAND [arg...]
Options:
  --debug, -D                                                   Enable debug mode
  --storage-path, -s "C:\Users\WeiyiGeek\.docker\machine"       Configures storage path [$MACHINE_STORAGE_PATH]
  --tls-ca-cert                                                 CA to verify remotes against [$MACHINE_TLS_CA_CERT]
  --tls-ca-key                                                  Private key to generate certificates [$MACHINE_TLS_CA_KEY]
  --tls-client-cert                                             Client cert to use for TLS [$MACHINE_TLS_CLIENT_CERT]
  --tls-client-key                                              Private key used in client TLS auth [$MACHINE_TLS_CLIENT_KEY]
  --github-api-token                                            Token to use for requests to the Github API [$MACHINE_GITHUB_API_TOKEN]
  --native-ssh                                                  Use the native (Go-based) SSH implementation. [$MACHINE_NATIVE_SSH]
  --bugsnag-api-token                                           BugSnag API token for crash reporting [$MACHINE_BUGSNAG_API_TOKEN]
  --help, -h                                                    show help
  --version, -v                                                 print the version

Commands:
* config:查看当前激活状态 Docker 主机的连接信息。
* creat:创建 Docker 主机

* env:显示连接到某个主机需要的环境变量
* inspect: 以 json 格式输出指定Docker的详细信息
* ip: 获取指定 Docker 主机的地址
* kill: 直接杀死指定的 Docker 主机
* ls: 列出所有的管理主机
* provision: 重新配置指定主机
* regenerate-certs: 为某个主机重新生成 TLS 信息
* restart: 重启指定的主机
* rm: 删除某台 Docker 主机,对应的虚拟机也会被删除
* ssh: 通过 SSH 连接到主机上,执行命令
* scp: 在 Docker 主机之间以及 Docker 主机和本地主机之间通过 scp 远程复制数据
* mount: 使用 SSHFS 从计算机装载或卸载目录
* start: 启动一个指定的 Docker 主机,如果对象是个虚拟机,该虚拟机将被启动
* status: 获取指定 Docker 主机的状态(包括:Running、Paused、Saved、Stopped、Stopping、Starting、Error)等
* stop: 停止一个指定的 Docker 主机
* upgrade: 将一个指定主机的 Docker 版本更新为最新
* url: 获取指定 Docker 主机的监听 URL
* version: 显示 Docker Machine 的版本或者主机 Docker 版本
* help: 显示帮助信息

基础示例:

$DOCKER_HOST=tcp://10.10.107.245:2375
$MACHINE_DRIVER=swarm   # virtualbox | swarm | hyper-v

# 1.列出可用的机器,目前只有这里默认的 default 虚拟机。
docker-machine ls

# 2.在安装有Virutualbox的机器上创建机器
# --driver:指定用来创建机器的驱动类型这里是virtualbox。
docker-machine create --driver virtualbox test
docker-machine create -d hyperv --hyperv-virtual-switch "Primary Virtual Switch" worker2

# 3.查看机器的 ip
docker-machine ip test

# 4.停止机器
docker-machine stop test

# 5.启动机器
docker-machine start test

# 6.进入机器之中
docker-machine ssh test

# 7.查看当前激活状态的 Docker 主机
$ docker-machine active
$ docker-machine active
# staging

# 8.命令配置Shell
eval $(docker-machine env test)

WeiyiGeek.


实际案例:
在Win10开始菜单的“Windows管理工具”下看到Hyper-V管理器,打开后需要进行进一步的设置;

  • Step 1.确保Hyper-V是启用,可以正常打开Hyper-V管理器并可以看见虚拟机情况;
    WeiyiGeek.Hyper-V管理器

  • Step 2.然后进行建立一个新的外部网络交换机(可选),注意确定后会重新刷新网卡会导致短暂的断网(修改后建议重新机器以确保在虚拟交换机管理器中选择了正确的网络)

WeiyiGeek.VirtualSwitch

  • Step 3.使用Docker机器和微软Hyper-V驱动程序创建节点,注意需要采用管理员来运行cmd或者Powershell终端(推荐);
# 注意:区分大小写
./docker-machine.exe create -d hyperv --hyperv-virtual-switch Docker0 worker-01
./docker-machine.exe create -d hyperv --hyperv-virtual-switch Docker0 worker-02

WeiyiGeek.虚拟

  • Step 4.查看创建的虚拟机信息
# 创建的机器查看
PS F:\ChoromeDownload> .\docker-machine.exe ls
NAME        ACTIVE   DRIVER   STATE     URL                        SWARM   DOCKER      ERRORS
worker-01   -        hyperv   Running   tcp://10.20.172.122:2376           v19.03.12
worker-02   -        hyperv   Running   tcp://10.20.172.123:2376           v19.03.12

# 将你的Docker客户端连接到运行在这个虚拟机上的Docker引擎
.\docker-machine.exe env worker-01
$Env:DOCKER_TLS_VERIFY = "1"
$Env:DOCKER_HOST = "tcp://10.20.172.122:2376"
$Env:DOCKER_CERT_PATH = "C:\Users\WeiyiGeek\.docker\machine\machines\worker-01"
$Env:DOCKER_MACHINE_NAME = "worker-01"
$Env:COMPOSE_CONVERT_WINDOWS_PATHS = "true"
# Run this command to configure your shell:
& "F:\ChoromeDownload\docker-machine.exe" env worker-01 | Invoke-Expression

# 当前活动机器切换
PS F:\ChoromeDownload> .\docker-machine.exe active
worker-01
PS F:\ChoromeDownload> & "F:\ChoromeDownload\docker-machine.exe" env worker-02 | Invoke-Expression
PS F:\ChoromeDownload> .\docker-machine.exe active
worker-02

# 配置进行查看
.\docker-machine.exe config worker-01
--tlsverify
--tlscacert="C:\\Users\\WeiyiGeek\\.docker\\machine\\machines\\worker-01\\ca.pem"
--tlscert="C:\\Users\\WeiyiGeek\\.docker\\machine\\machines\\worker-01\\cert.pem"
--tlskey="C:\\Users\\WeiyiGeek\\.docker\\machine\\machines\\worker-01\\key.pem"
-H=tcp://10.20.172.122:2376

# 进入创建的机器的ssh之中;
PS F:\ChoromeDownload> .\docker-machine.exe ssh worker-01
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)           www.tinycorelinux.net

PS F:\ChoromeDownload> .\docker-machine.exe ssh worker-01 hostname
worker-01

注意事项:

  • (1) 与Docker-compose一样如果您想使用docker-machine您必须在您的运行它的环境中安装docker;
  • (2) 不同操作系统建议不同的虚拟化程序
Docker Desktop for Mac - virtualbox driver
Docker Desktop for Windows - hyperv driver
  • (3) 构建镜像时候由于拉取Github的releases速度较慢会导致下载失败提示
# 错误信息
(worker-01) Latest release for github.com/boot2docker/boot2docker is v19.03.12
(worker-01) Downloading C:\Users\WeiyiGeek\.docker\machine\cache\boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v19.03.12/boot2docker.iso...
worker-01) 0%Error removing file: Error removing temporary download file: remove C:\Users\WeiyiGeek\.docker\machine\cache\boot2docker.iso.tmp850714895: The process cannot access the file because it is being used by another process.
(worker-01)
Error with pre-create check: "read tcp 10.20.172.103:57715->52.216.89.11:443: wsarecv: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond."

# 解决方法:
ISO: https://github.com/boot2docker/boot2docker/releases/download/v19.03.12/boot2docker.iso
1.迅雷下载
2.Github下载加速站点:https://d.serctl.com/
# 将下载的镜像放入到以下目录之中
C:\Users\WeiyiGeek\.docker\machine\cache\boot2docker.iso 

Swarm 集群

描述: 由于Docker只能在单主机上进行运行,且跨HOST部署,运行与管理能力有限,此时就需要一个容器编排或者管理工具,自Docker 1.12版本开始,swarm模式已经被集成到Docker Engine之中;

此时以上面的Docker-machine和Hyper-V环境中创建的两个docker容器为例,假设我的一台node-2Linux服务器是管理者他被用来执行相关管理命令以及对加入的swarm集群节点进行授权,而worker-01/worker-02加入到swarm之中成为节点进行业务负载;


Hyper-v + Docker

流程步骤:

  • Step1.创建swarm控制端在worker-01机器上或者加入集群的tokern
docker@worker-01:~$ docker swarm init --advertise-addr 10.20.172.122
# docker swarm join --token SWMTKN-1-0w8bvf8gzw5hct845izbv38qvl45385r19p4gwo0v8fuwie68g-603ibqyz4od3mmnw1gmbahd8v 10.10.107.245:2377
# To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
  • Step2.将worker-01/worker-02加入到swarm集群之中
# worker-01 节点
PS F:\ChoromeDownload>.\docker-machine.exe ssh worker-01
docker@worker-01:~$ docker swarm join --token SWMTKN-1-0w8bvf8gzw5hct845izbv38qvl45385r19p4gwo0v8fuwie68g-603ibqyz4od3mmnw1gmbahd8v 10.10.107.245:2377
This node joined a swarm as a worker.

# worker-02 节点
PS F:\ChoromeDownload> .\docker-machine.exe ssh worker-02
[root@node2 ~]$ docker swarm join --token SWMTKN-1-0w8bvf8gzw5hct845izbv38qvl45385r19p4gwo0v8fuwie68g-603ibqyz4od3mmnw1gmbahd8v 10.10.107.245:2377
This node joined a swarm as a worker.
  • Step 3.在Swarm控制节点上查看加入的节点:
$ docker node ls
# ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
# tqulwewuzrgayabjomy3xw55u *   node2               Ready               Active              Leader(领导者)      19.03.12
# 7vp6qrabwp7ee2dkq0d1bf11l     worker-01           Ready               Active                                  19.03.12
# kxhd5fdxvarn6vpjweadf8yfb     worker-02           Ready               Active                                  19.03.12
  • Step 4.Swarm 集群中部署应用准备
# DockerFile
cat > dockerfile <<'END'
FROM frolvlad/alpine-python3
WORKDIR /opt/
ADD ./hostname.txt /opt/
RUN sh -c "ip addr" > ip.txt
EXPOSE 8080
ENV NAME Python-Web
CMD ["python","-m","http.server","8080","-d","/opt/"]
END

# Docker-compose.yml
# Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm.
cat > docker-compose.yml<<'END'
version: "3"
services:
  web:
    image: python-web:latest
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: "50M"
      restart_policy:
        condition: on-failure
    entrypoint: ["sh","-c","/opt/start.sh"]
    volumes:
      - "/tmp/:/opt/"
    ports:
      - "80:8080"
    networks:
      - webnet
networks:
  webnet:
END

# [root@node2 test]# cat start.sh
# ip addr > /opt/ip.txt && python -m http.server 8080

# 镜像构建
docker build -t python-web .

# 镜像查看
$ docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
python-web                  latest              196e26d0d89f        9 seconds ago       57.8MB

# 镜像导出与启动web下载端口
docker save python-web -o python-web.tar
python -m SimpleHTTPServer 80 #python 2语法
# Serving HTTP on 0.0.0.0 port 80 ...
  • Step 5.各个节点拉取镜像进行导入到本地
# worker-01/worker-02 中执行拉取镜像
wget http://10.10.107.245/python-web.tar && docker load -i python-web.tar
# Connecting to 10.10.107.245 (10.10.107.245:80)
# python-web.tar       100% |********************************| 58.1M  0:00:00 ETA
# 50644c29ef5a: Loading layer  5.845MB/5.845MB                                                                            
# 47279ef47504: Loading layer  55.11MB/55.11MB                                                                            
# a126991f92ee: Loading layer   2.56kB/2.56kB                                                                             
# 89a1c87b5354: Loading layer   2.56kB/2.56kB                                                                             
# Loaded image: python-web:latest
  • Step 6.通过swarm集群进行部署应用(多个副本)
# Swarm Master 控制节点上执行
docker stack deploy -c docker-compose.yml swarm-python-web
# Creating network swarm-python-web_webnet # 项目名称+网卡名 = 网络名称
# Creating service swarm-python-web_web

# swarm 集群信息与swarm-python-web服务应用信息
docker stack ls
# NAME                SERVICES            ORCHESTRATOR
# swarm-python-web    1                   Swarm
docker stack services swarm-python-web
# ID                  NAME                   MODE                REPLICAS            IMAGE               PORTS
# bzeeucg6n6s1        swarm-python-web_web   replicated          5/5                 python-web:latest   *:80->8080/tcp

# 应用启动后的正常状态
docker stack ps swarm-python-web
# ID                  NAME                     IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
# xv3doqj787ae        swarm-python-web_web.1   python-web:latest   worker-02           Running             Running 5 minutes ago
# njkppsnrf4nc        swarm-python-web_web.2   python-web:latest   worker-01           Running             Running 5 minutes ago
# sulpgnpg00v2        swarm-python-web_web.3   python-web:latest   node2               Running             Running 4 minutes ago
# ny91qomtch7p        swarm-python-web_web.4   python-web:latest   worker-02           Running             Running 5 minutes ago
# fb1a0cp50wf4        swarm-python-web_web.5   python-web:latest   worker-01           Running             Running 5 minutes ago
  • Step 7.访问集群Web查看效果,即每个节点的IP:80
# master
$ docker inspect $(docker ps -aq) | grep "IPAddress"
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "10.0.0.28",
                    "IPAddress": "10.0.2.11",

# worker-01
docker@worker-01:~$ docker inspect $(docker ps -aq) | grep "IPAddress"
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "10.0.0.25",
                    "IPAddress": "10.0.2.5",
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "10.0.0.27",
                    "IPAddress": "10.0.2.7",

# worker-02
docker@worker-02:~$ docker inspect $(docker ps -aq) | grep "IPAddress"
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "10.0.0.24",
                    "IPAddress": "10.0.2.4",
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "10.0.0.26",
                    "IPAddress": "10.0.2.6",

WeiyiGeek.集群WEb

  • Step 8.如果此时停止或删除一个容器,swarm会在工作节点中新启动一个容器,使之副本数量一直为五;
docker stack ps swarm-python-web
# ID                  NAME                         IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR                         PORTS
# xv3doqj787ae        swarm-python-web_web.1       python-web:latest   worker-02           Running             Running 24 minutes ago
# nkwtm8w9yfxp        swarm-python-web_web.2       python-web:latest   node2               Running             Running 3 minutes ago
# njkppsnrf4nc         \_ swarm-python-web_web.2   python-web:latest   worker-01           Shutdown            Failed 3 minutes ago     "task: non-zero exit (137)"
# sulpgnpg00v2        swarm-python-web_web.3       python-web:latest   node2               Running             Running 24 minutes ago
# ny91qomtch7p        swarm-python-web_web.4       python-web:latest   worker-02           Running             Running 24 minutes ago
# fb1a0cp50wf4        swarm-python-web_web.5       python-web:latest   worker-01           Running             Running 24 minutes ago
  • Step 9.删除在集群中部署的应用以及退出集群:
$docker stack rm $(docker stack ls --format "{{.Name}}")
Removing service swarm-python-web_web
Removing network swarm-python-web_webnet

# 排空节点上的集群容器 
docker@master-01:~$docker node update --availability drain j5auh1zg6qzvmzkf80wvpl9hr

# 节点退出集群
docker@worker-02:~$ docker swarm leave
Node left the swarm.

# 查看节点
docker@master-01:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY(可用性)  MANAGER STATUS      ENGINE VERSION
j5auh1zg6qzvmzkf80wvpl9hr     worker-02           Down 状态           Drain  已停止                                   19.03.12
tjwo77l1i08gzextmfwn69i9z *   worker-01           Ready               Active                Leader              19.03.12

# 控制节点退出swarm集群
docker@master-01:~$ docker swarm leave --force
Node left the swarm.

0x03 知识补充

1.Docker日志设置定期清理

  1. 设置容器为3个日志文件容,分别是id+.json、id+1.json、id+2.json,但是此时只对新建的容器有效;
cat > /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": [
"https://kfwkfulq.mirror.aliyuncs.com",
"https://2lqq34jg.mirror.aliyuncs.com",
"https://pee6w651.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
],
  "dns": ["114.114.114.114","8.8.4.4"],
  "log-driver":"json-file",
  "log-opts":{ "max-size" :"100m","max-file":"1"}
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 清理已存在的容器日志(全部容器)
#容器日志一般存放在/var/lib/docker下面
ls -lh $(find /var/lib/docker/containers/ -name *-json.log)

#方法1:
find /var/lib/docker/containers/ -name *-json.log -exec truncate -s 0 {} \;

#方法2:(已经停止的容器)
find /var/lib/docker/containers/ -name *-json.log -exec cat /dev/null > {} \;

如果docker容器正在运行,那么使用rm -rf 方式删除日志后,通过df -h会发现磁盘空间并没有释放;

原因:在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink).然而如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用


WeiyiGeek Blog - 为了能到远方,脚下的每一步都不能少。

本文章来源 Blog 站点(友链交换请邮我哟):

更多学习笔记文章请关注 WeiyiGeek 公众账号
点击我关注

WeiyiGeek-公众账号

posted @ 2020-10-09 21:17  全栈工程师修炼指南  阅读(185)  评论(0编辑  收藏  举报