df 与du不一致

事件起因:

同事发现云主机磁盘系统盘满了,准备清理系统盘,便利用du 命令统计了根目录下各文件夹的大小,发现统计的各文件夹的大小总和 加起来比 df 命令查看到的系统盘所使用空间 要小很多。这里记录下解决方法

了解下df与du的工作原理:

du

du命令会对待统计文件逐个调用fstat这个系统调用,获取文件大小。它的数据是基于文件获取的,所以有很大的灵活性,不一定非要针对一个分区,可以跨越多个分区操作。如果针对的目录中文件很多,du速度就会很慢了。

df

df命令使用的事statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据是基于分区元数据的,所以只能针对整个分区。由于df直接读取超级块,所以运行速度不受文件多少影响。

du和df不一致情况原因:

常见的df和du不一致情况就是文件删除的问题。当一个文件被删除后,在文件系统目录中已经不可见了,所以du就不会再统计它了。然而如果此时还有运行的进程持有这个已经被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除, 分区超级块中的信息也就不会更改。这样df仍旧会统计这个被删除了的文件。

 解决方法:

1 lsof | grep delete — 查看已经删除,仍被进程占用没有释放空间的文件相关信息

2 得到占用文件的进程,重启或kill该进程,释放文件。

进行第一步操作时发现有较大的tomcat 和 nginx的访问日志被删除后但仍进程占用,进行第二步操作后系统盘空间成功释放很多,系统盘的使用率也就降下去了。

其他需要注意的:

(1)当出现du和df差距很大的情况时,考虑是否是有删除文件未完成造成的,方法是lsof命令,然后重启或关闭相关进程即可。

(2)可以使用清空文件的方式来代替删除文件,方式是:echo "" > test.log。

(3)除了rm外,有些命令会间接的删除文件,如gzip命令完成后会删除原来的文件,为了避免在出现这种问题,前先确认没有进程打开该文件。

READ MORE

docker php nginx

  1. php+nginx只启动服务,映射本地代码目录,这样发布时需要rsync同步代码
#docker-compose.yml
#nginx+php
services:
  web:
    image: nginx:alpine
    ports:
      - "8001:8001"
    volumes:
      - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./docker/nginx/conf.d/:/etc/nginx/conf.d/
      - ./:/var/www/html
    depends_on:
      - php
  php:
    #dockerfile
    #build:
    #  context: .
    #  dockerfile: Dockerfile
    image: 10.2.134.137:5000/5i5j-pc-php
    volumes:
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
      - ./docker/php/php-fpm.conf:/usr/local/etc/php-fpm.conf
      - ./docker/php/php-fpm.d/:/usr/local/etc/php-fpm.d/
      - ./:/var/www/html
      
  1. php+nginx两个镜像都把代码包进去
#docker-compose.yml
#nginx+php
services:
  web:
    build:
     context: .
     dockerfile: nginx.dockerfile
    ports:
      - "8001:80"
    depends_on:
      - php
  php:
    #dockerfile
    build:
     context: .
     dockerfile: php.dockerfile
#nginx.dockerfile
FROM nginx:alpine

# Copy nginx configuration
COPY ./docker/nginx/nginx.conf /etc/nginx/nginx.conf
COPY ./docker/nginx/conf.d /etc/nginx/conf.d
COPY ./web /var/www/html/web
php.dockerfile
FROM 10.2.134.137:5000/5i5j-pc-php

COPY ./docker/php/php.ini /usr/local/etc/php/php.ini
COPY ./docker/php/php-fpm.conf /usr/local/etc/php-fpm.conf
COPY ./docker/php/php-fpm.d/ /usr/local/etc/php-fpm.d/
COPY . /var/www/html
# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]

READ MORE

docker redis

获取 redis 镜像 docker pull redis

  • 不加版本号默认获取最新版本,也可以使用 docker search redis 查看镜像来源
  1. 查看本地镜像 docker images

  2. 从官网获取 redis.conf 配置文件

  • 修改默认配置文件
- bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问
- protected-mode no #默认yes,开启保护模式,限制为本地访问
- daemonize no#默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程(可选),改为yes会使配置文件方式启动redis失败
- dir ./ #输入本地redis数据库存放文件夹(可选)
- appendonly yes #redis持久化(可选)
  1. docker 启动 redis 命令 docker run -p 6379:6379 –name redis -v /usr/local/docker/redis.conf:/etc/redis/redis.conf -v /usr/local/docker/data:/data -d redis redis-server /etc/redis/redis.conf –appendonly yes

  2. 不挂载配置文件:

  3. docker run –name redis -p 6379:6379 -d –restart=always redis redis-server –appendonly yes –requirepass “这是密码”

  • 命令解释说明:

READ MORE

docker registry

registry服务要求认证
yum install -y httpd-tools
htpasswd -Bbn admin 1C82G5N4zfobWPMTlzdy > /home/ecs-user/registry_auth/htpasswd


启动registry服务
sudo docker run -p 8001:5000 \
--restart=always \
--name registry \
-v /home/ecs-user/my_registry/:/var/lib/registry \
-v /home/ecs-user/registry_auth/:/auth/ \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
-d registry




查看registry服务上有哪些镜像
curl -XGET http://47.99.164.28:8001/v2/_catalog

本地镜像打tag
docker commit -m="5i5j-pc项目" -a="zuoerdong" ab5ce696a902 5i5j-pc-php:v1

生成可以推送到私有registry服务的tag
docker tag 5i5j-pc-php:v1 47.99.164.28:8001/5i5j-pc-php:v1
推送到私有服务
docker push 47.99.164.28:8001/5i5j-pc-php:v1

READ MORE

docker启动es

docker run --name elasticsearch -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 elasticsearch:7.7.0

READ MORE