0%

Docker上快速清理空间

  • 查看docker的磁盘空间占用情况

    1
    docker system df
  • 快速清理闲置的资源

    1
    docker system prune -a
  • 快速清理镜像

    1
    docker image prune -a
  • 找到大的日志文件,然后清空

    1
    2
    ls -lh $(find /var/lib/docker/containers/ -name *-json.log)
    echo "" > xxxxx.log

在Ubuntu的系统中

  • 查看磁盘空间情况

    1
    2
    df -h
    du -h --max-depth=1 . | sort -n # .可以替换成任一目录
  • 通过文件大小去找文件

    1
    find / -size +100M |xargs ls -lh
  • 实际操作的时候发现journal的日志好大,通过journalctl 去修改日志的大小和存储周期

    1
    2
    journalctl --vacuum-time=1w  # 只保留近1周的日志
    journalctl --vacuum-size=500M # 只保留最多500M的日志

材料

名称 用量
黄油 200g
糖粉 53g
低筋面粉 124g
高筋面粉 65g
玉米淀粉 65g
1.5g

步骤

  1. 预热烤箱150度
  2. 烤25分钟

材料

名称 用量
黄油 100g
鸡蛋 1个大的,约40g
苏打粉 1.5g
泡打粉 2.8g
0.8g
75%巧克力 140g
低筋面粉 72g
中筋面粉 72g
白砂糖 50g
红糖 50g

步骤

  1. 巧克力切碎,至颗粒大小备用
  2. 隔水加热黄油至完全融化
  3. 加入白砂糖、红糖搅拌至糖跟黄油均匀混合,并无明显颗粒
  4. 放凉黄油,至室温或略高室温
  5. 加入鸡蛋液,(用搅拌器进行高速打发,约4分钟)搅拌均匀即可
  6. 将剩余粉类全部混合并过筛倒进黄油
  7. 用刮刀进行翻拌至无干粉,注意不要让面粉起筋
  8. 加入巧克力翻拌均匀
  9. 放入冰箱,约2小时
  10. 预热烤箱170度
  11. 把材料从冰箱拿出来,均匀捏成小球形状
  12. 烤15分钟
  13. 拿出来后静置5分钟

材料

名称 用量
森永松饼粉 1包(120g)
鸡蛋 1只
牛奶 100ml~140ml,要根据鸡蛋大小以及希望的效果做调整
黄油 10g

步骤

  1. 煎全凭经验

PIL从URL读取图片

1
2
3
4
5
6
7
import io
import requests
from PIL import Image

resp = requests.get(image_url)
data = resp.content
img = Image.open(io.BytesIO(data))

AliOss通过URL转存文件

1
2
3
4
5
import requests

byte_data = requests.get(file_url).content
ali_oss = AliOss(ACCESS_KEY_ID, ACCESS_KEY_SECRET, ALI_OSS_ENDPOINT, ALI_BUCKET_NAME)
ali_oss.put_object(file_path, byte_data)

AliOss上传PIL的Image对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import io
import requests
from PIL import Image

img = Image.new("RGB", (200, 200))

# 转成可以上传的数据类型
output_buffer = io.BytesIO()
img.save(output_buffer, format="JPEG", qulity=85)
byte_data = output_buffer.getvalue()

# 上传
ali_oss = AliOss(ACCESS_KEY_ID, ACCESS_KEY_SECRET, ALI_OSS_ENDPOINT, ALI_BUCKET_NAME)
ali_oss.put_object(file_path, byte_data)

PIL跟Django的ImageField之间的转换

1
待续

  • 查看docker的进程状态

    1
    systemctl status docker
  • 安装kubeadm、kubelet和kubectl等工具的命令和步骤:

    1
    curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
    1
    2
    3
    cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
    deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
    EOF

    执行更新,并且安装

    1
    2
    apt-get update
    apt-get install -y kubeadm=1.14.1-00 kubectl=1.14.1-00 kubelet=1.14.1-00
  • 从k8s的mirror镜像库下载k8s master组件和node组件镜像步骤:

    • 查看核心组件版本
    1
    kubeadm config images list
    • Kuiki的方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # master节点
    # 先将难以拉去的镜像通过阿里源拉下来
    sudo -i # 切root方便操作docker
    for i in `kubeadm config images list`; do
    imageName=${i#k8s.gcr.io/}
    docker pull registry.aliyuncs.com/google_containers/$imageName
    docker tag registry.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
    docker rmi registry.aliyuncs.com/google_containers/$imageName
    done;
    exit # 退出root
    • master节点
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    docker pull anjia0532/kube-apiserver-amd64:v1.10.2
    docker pull anjia0532/kube-controller-manager-amd64:v1.10.2
    docker pull anjia0532/kube-scheduler-amd64:v1.10.2
    docker pull anjia0532/kube-proxy-amd64:v1.10.2
    docker pull anjia0532/etcd-amd64:3.1.12
    docker pull anjia0532/pause-amd64:3.1
    docker pull anjia0532/k8s-dns-sidecar-amd64:1.14.8
    docker pull anjia0532/k8s-dns-kube-dns-amd64:1.14.8
    docker pull anjia0532/k8s-dns-dnsmasq-nanny-amd64:1.14.8

    docker tag anjia0532/kube-apiserver-amd64:v1.10.2 k8s.gcr.io/kube-apiserver-amd64:v1.10.2
    docker tag anjia0532/kube-scheduler-amd64:v1.10.2 k8s.gcr.io/kube-scheduler-amd64:v1.10.2
    docker tag anjia0532/kube-controller-manager-amd64:v1.10.2 k8s.gcr.io/kube-controller-manager-amd64:v1.10.2
    docker tag anjia0532/kube-proxy-amd64:v1.10.2 k8s.gcr.io/kube-proxy-amd64:v1.10.2
    docker tag anjia0532/etcd-amd64:3.1.12 k8s.gcr.io/etcd-amd64:3.1.12
    docker tag anjia0532/pause-amd64:3.1 k8s.gcr.io/pause-amd64:3.1
    docker tag anjia0532/k8s-dns-sidecar-amd64:1.14.8 k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.8
    docker tag anjia0532/k8s-dns-kube-dns-amd64:1.14.8 k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.8
    docker tag anjia0532/k8s-dns-dnsmasq-nanny-amd64:1.14.8 k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.8
  • worker节点

    1
    2
    3
    4
    5
    docker pull anjia0532/pause-amd64:3.1
    docker pull anjia0532/kube-proxy-amd64:v1.10.2

    docker tag anjia0532/pause-amd64:3.1 k8s.gcr.io/pause-amd64:3.1
    docker tag anjia0532/kube-proxy-amd64:v1.10.2 k8s.gcr.io/kube-proxy-amd64:v1.10.2

    查看可供安装的kubeadm的版本

    1
    apt-cache madison kubeadm
  • 初始化kubeadm(master节点)

    1
    kubeadm init --apiserver-advertise-address=172.18.94.63 --pod-network-cidr=10.244.0.0/16 --kubernetes-version=1.14.1
  • 从节点加入主节点

    1
    kubeadm join 10.0.2.15:6443 --token 8t3pie.0n7ra7idaqzl7i1j --discovery-token-ca-cert-hash sha256:00dd3ee3f9c2592bb4ce15dce533f3cae193f30a457c5c2deffd30b548f46b0a
  • 初始化配置

    1
    kubeadm reset
  • The connection to the server localhost:8080 was refused - did you specify the right host or port?

    原因:kubenetes master没有与本机绑定,集群初始化的时候没有设置
    解决办法:执行以下命令

    1
    export KUBECONFIG=/etc/kubernetes/admin.conf

    /etc/kubernetes/admin.conf这个文件主要是集群初始化的时候用来传递参数的

  • 检查功能

    1
    kubectl get pods -n kube-system -o wide
  • 安装weave

    1. 方法1:
      1
      kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
    2. 方法2: (应对weave pod启动时出现:Network 10.32.0.0/12 overlaps with existing route xx.xx.xx.xx/16 on host 错误信息)
      1
      curl -L "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" > weave.yaml
      在weave容器,修改:IPALLOC_RANGE
      1
      2
      3
      4
      vim weave.yaml

      - name: IPALLOC_RANGE
      value: 192.168.16.0/20
      1
      kubectl apply -f weave.yaml
  • 安装dashboard的步骤:

    1. 下载dashboard镜像

      1
      2
      docker pull anjia0532/kubernetes-dashboard-amd64:v1.8.3
      docker tag anjia0532/kubernetes-dashboard-amd64:v1.8.3 k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3
    2. 安装dashboard

      1
      kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta1/aio/deploy/recommended.yaml

      Dashboard 可以参考这个网址https://www.kubernetes.org.cn/5462.html

      另外,1.7章,6:30 教怎么样创建dashboard的用户

  • 其他

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # 在kubeadm init后此时root用户还不能使用kubelet控制集群,还需要配置该环境变量。
    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

    # 立即生效
    source ~/.bash_profile

    kubectl get pods -n kube-system -o wide
    echo xxxx|base64 -d

    # 编辑kubelet的参数配置
    vim /var/lib/kubelet/config.yaml

    # 修改后重启生效
    systemctl daemon-reload
    systemctl restart kubelet

    # 查看运行状态
    service kubelet status

材料

名称 用量 备注
3号意面 150g 1人约70~100g为宜
5瓣
番茄 2个
洋葱 1/2个
黄油 5g
100g 猪肉牛肉都可以,带点肥更好
番茄酱 约两勺
黑胡椒 若干
罗勒酱 若干 备选,如果有这个更好!
迷迭香 若干 备选

步骤

备菜

  • 番茄切丁、洋葱切粒、蒜头切末备用
  • 肉切成肉末,加少许盐、油、胡椒粉抓匀腌制

烹饪

  • 大锅烧水,煮沸后下入一勺盐(约4g),下入意面
  • 中火煮约8分钟至8成熟
  • 在煮意面的工程中,煮制酱料
  • 平底锅热锅后,下入橄榄油,调至中火
  • 先下入洋葱粒,爆出香味后继续放入蒜末,继续爆香
  • 待香味煮出后,洋葱蒜末微微要焦时,加入番茄进行炒制
  • 如果番茄水分比较少,需要加入适量的水
  • 把番茄煮起沙后,进行调味,下入2勺番茄酱、2g糖、黄油以及黑胡椒、盐、罗勒酱、迷迭香若干
  • 加入肉末继续进行翻炒煮制,把肉末弄散
  • 此时面差不多煮好了,把面捞出,稍微沥一下水,直接放在平底锅继续煮制
  • 如果平底锅内水偏少,可以加入煮意面的水
  • 稍微翻炒后即可出锅,出锅前如果不够咸再加盐进行调味

  • Simple

    • 最简单常用的模式

          graph LR
      P((P生产者)) -->Q[消息队列]
      Q --> C((C消费者))
      style Q fill: #CCC, stroke-width:0
  • Work

    • 一个消息只能被一个消费者获取

          graph LR
      P((P生产者)) -->Q[消息队列]
      Q --> C1((C1消费者))
      Q --> C2((C2消费者))
      style Q fill: #CCC, stroke-width:0
  • Publish/Subscribe

    • 消息被路由投递给多个队列,一个消息被多个消费者获取
          graph LR
      P((P生产者)) --> X(X交换机)
      X --> Q1[消息队列1]
      X --> Q2[消息队列2]
      Q1 --> C1((C1消费者))
      Q2 --> C2((C2消费者))
      style Q1 fill: #CCC, stroke-width:0
      style Q2 fill: #CCC, stroke-width:0
  • Routing

    • 一个 消息被多个消费者获取。并且消息的目标队列可被生产者指定
          graph LR
      P((P生产者)) --> X(X交换机
      type=direct) X --error--> Q1[消息队列1] X --error--> Q2[消息队列2] X --info--> Q2[消息队列2] X --warning--> Q2[消息队列2] Q1 --> C1((C1消费者)) Q2 --> C2((C2消费者)) style Q1 fill: #CCC, stroke-width:0 style Q2 fill: #CCC, stroke-width:0
  • Topic

    • 一个消息被多个消费者获取。消息的目标queue可用BindingKey以通配符(#: 一个或多个词,*: 一个词)的方式指定

          graph LR
      P((P生产者)) --> X(X交换机
      type=topic) X --*.orange.*--> Q1[消息队列1] X --*.*.rabbit--> Q2[消息队列2] X --lazy.#--> Q2[消息队列2] Q1 --> C1((C1消费者)) Q2 --> C2((C2消费者)) style Q1 fill: #CCC, stroke-width:0 style Q2 fill: #CCC, stroke-width:0

  • 启动守护进程

    1
    service docker start
  • 检查是否启动成功

    1
    docker run hello-world
  • 查看docker进程

    -a 查看停止运行的容器

    1
    2
    3
    docker ps
    docker ps |awk '{print $2, $NF}'
    docker ps -a |grep CONT_ID
  • 删除所有停止运行的容器(慎用

    1
    docker rm $(docker ps -a -q)
  • 查看版本号

    1
    docker version
  • 查询镜像

    1
    docker search NAME
  • 下载镜像

    1
    docker pull IMAGE
  • 运行容器

    1
    docker run ..........
  • 修改容器

    -y 是非交互模式

    1
    docker run IMAGE apt-get install -y NAME
  • 创建新的镜像

    1. 查看新的容器ID
    1
    docker ps -l
    1. 提交新容器

      提交后会返回新的ID

    1
    docker commit CONT_ID NEW_NAME
  • 查询容器信息

    1
    2
    docker inspect CONT_ID
    docker inspect -f {{.State.Status}} CONT_ID
  • 上传新的镜像

    IMAGE_NAME 为新建的镜像名称

    1
    docker push IMAGE_NAME
  • 停止容器

    如果在创建容器的时候起了别名,可以用别名替换ID

    1
    docker stop CONT_ID
  • 查看容器日志

    -f 可以实时查看

    1
    docker logs CONT_ID
  • 查看容器开销

    1
    docker stats CONT_ID
  • 操作容器内部

    1
    2
    docker exec CONT_ID ps grep|aux
    docker exec -it CONT_ID
  • 删除容器

    -f 强制删除正在运行的容器

    1
    docker rm CONT_ID
  • docker-compose 基本操作

    创建以及启动容器

    1
    docker-compose up

    启动容器

    1
    docker-compose start

    停止容器

    1
    docker-compose stop

    通过配置文件*.yml 对容器操作

    1
    2
    3
    4
    docker-compose -f *.yml ps
    docker-compose -f *.yml stop
    docker-compose -f *.yml start
    docker-compose -f *.yml down
  • 查看容器列表

    1
    docker images -a
  • 查看镜像层

    1
    docker history IMAGE_NAME

之前在副文本上一直使用百度家的UEditor,但是官方在Django以及python3.X上没有做维护,所以换上了ckeditor,使用下来还算方便。

环境信息:

  • Django 2.0.1
  • django-ckeditor 5.4.0

正文:

  1. 用pip安装ckeditor:

    1
    pip install django-ckeditor
  2. settingsINSTALLED_APPS注册:

    1
    2
    3
    4
    5
    6
    7
    8
    INSTALLED_APPS = [
    ...

    'ckeditor',
    'ckeditor_uploader', # 如果富文本中允许用户上传图片/文件到后台,则需要加上

    ...
    ]
  3. 配置上传文件路径(如果用到上传功能):
    ckeditor的上传路径是将media的路径后边拼接upload_path,也就是说按照下边的配置,最终的上传路径为/media/uploads/

    1
    2
    3
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    CKEDITOR_UPLOAD_PATH = "uploads/"
  4. 富文本url配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    from django.urls import include, re_path

    urlpatterns = [
    ...

    re_path(r'^ckeditor/', include('ckeditor_uploader.urls')), # Django2.0要用're_path'

    ...
    ]
  5. 在settings中按需定制自己的富文本面板(非必须):
    可以按照自己的喜好,定制富文本的编辑工具面板,下边这个是我花了点时间选出了一些常用以及实用的功能。其中具体参数含义可以到官方文档查询。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    CKEDITOR_CONFIGS = {
    'default': {
    'toolbar_ToolbarConfig': [
    {'name': 'basic', 'items': [
    'Font', 'FontSize', 'BGColor', 'TextColor',
    '-',
    'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock',
    '-',
    'Bold', 'Italic', 'Underline', 'Strike', 'Undo', 'Redo',
    '-',
    'Strike', 'Subscript', 'Superscript',
    '-',
    'Image', 'Flash', 'Table', 'HorizontalRule', 'SpecialChar',
    ]},
    '/',
    {'name': 'custom', 'items': [
    'Source',
    '-',
    'Preview', 'Maximize',
    ]}
    ],
    'toolbar': 'ToolbarConfig',
    'width': '100%',
    }
    }
  1. field的使用方式:
    1
    2
    3
    4
    5
    6
    7
    from django.db import models
    from ckeditor.fields import RichTextField
    from ckeditor_uploader.fields import RichTextUploadingField

    class Post(models.Model):
    content_without_upload = RichTextField() # 不带上传功能的富文本
    content_with_upload = RichTextUploadingField() # 带上传功能的富文本(需要先在INSTALL_APP中声明)
  1. 效果:

    django-ckeditor后台效果

  2. 后记:
    在前后端分离的开发过程中,富文本内所插入的图片需要返回绝对路径,查了许多文档,ckeditor没有像百度的UEditor一样把url_prefix放出来,方便设置。后来我摸索了一下,改动了一下源码就可以实现功能了。文件路径ckeditor_uploader/util.py中的get_media_url(path),具体如下:

    1
    2
    3
    4
    5
    6
    def get_media_url(path):
    """
    Determine system file's media URL.
    """
    url_prefix = hasattr(settings, 'CKEDITOR_URL_PREFIX') and settings.CKEDITOR_URL_PREFIX or ''
    return url_prefix + default_storage.url(path)

    随后只需要在settings中加入:

    1
    CKEDITOR_URL_PREFIX = 'https://actmerce.github.io'

参考: