Как свести занимаемое на диске место к минимуму
Во-первых, docker по-умолчанию не беспокоится о том, сколько места на диске занимают необходимые ему данные. Большинсво команд оставляют за собой кучу следов, копиируя или изменяя текущие данные образа и не удаляя предыдущую версию. Давайте рассмотрим наиболее популярные:
- Команды
docker pull
иdocker build
создают новые образы. Каждое изменение создает новый слой и кешируется, использует aufs для хранения, таким образом увеличивая занимаемое на диске место. Но при этом предыдущая версия/слой никуда не удаляются, и остаются болтаться бесполезным грузом.Удалить такие неиспользуемые образы, у которых нет метки, можно выполнив в консоли:
1docker images --no-trunc | grep '<none>' | awk '{ print $3 }' | xargs -r docker rmi
можно добавить в cron и неиспользуемые image будут удалятся автоматически. - В целом docker очень прожорлив не только касательно дискового пространства, а также использования inode (df -i). Также добавляем в наш крон, для очистки пространства:
-
1docker rm -v $(docker ps -a -q -f status=exited)
- Все равно мало место, еще вот так:
-
1docker rmi $(docker images -f "dangling=true" -q)
Копирование контейнта из docker контейнера на HN
1 |
docker cp <container_id>:/var/lib/mysql/folder_inside_container /var/lib/mysql/folder_outside_of_container |
Копирование контейнта в docker контейнера с HN
То же можно сделать и наоборот – скопировать локальный файл с хоста – в контейнер:
1 2 |
touch file.txt docker cp file.txt <contaider_id>:/tmp |
Перезагрузка сервиса в контейнере
Рассмотрим на примере nginx. Поднят контейнер, использующий оффициальный nginx образ, в случаи необходимости перечитать конфиг используется следующая команда:
1 |
docker kill -s HUP container_name |
Обновить параметры restart
1 |
docker update --restart=always <container> |
Очистка stdout docker контейнера
docker хранит весь stdout в файлах <ID>-json.log (/var/lib/docker/containers/*/*-json.log) и со времинем размер лог файлов становиться очень большим есть быстрый способ их очистки, если вы еще не добавили в logrotate 😉
1 |
docker inspect <ID> | grep LogPath | awk '{print $2}' | tr -d \" | tr -d \, | xargs truncate -s 0 |
Отключить вывод логов
1 2 |
--log-driver none docker run -it --log-driver none alpine ash |
для compose
1 2 |
logging: driver: none |
Сделать контейнер всегда запущенным
Dockerfile:
1 |
CMD ["tail", "-f", "/dev/null"] |
не проверено:
docker внутри контейнера lxc
файл конфига lxc конейнера /etc/pve/lxc/10041.conf
1 2 3 4 5 6 7 8 9 10 11 |
arch: amd64 cpulimit: 4 cpuunits: 2048 hostname: domain.com memory: 4096 net0: name=eth0,bridge=vmbr0,gw=XXX.XXX.XXX.XXX,hwaddr=E6:2D:6D:79:15:C4,ip=XX.XX.XX.XX/32,type=veth onboot: 1 ostype: debian rootfs: local:10041/vm-10041-disk-1.raw,quota=1,size=30G swap: 1024 lxc.aa_profile: unconfined |
также выполняем для нужного конейнера
1 |
lxc config set 10041 security.nesting true |
logrotate для логов docker контейнера
nano /etc/logrotate.d/docker-logs
1 2 3 4 5 6 7 8 9 |
/var/lib/docker/containers/*/*.log { rotate 7 daily compress size=1M missingok delaycompress copytruncate } |
Войти в последний слой при неудачной сборке
1 2 3 4 5 6 7 8 9 10 |
docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6934ada18de6 42e0228751b3 "/bin/sh -c './utils/" 24 minutes ago Exited (1) About a minute ago sleepy_bell Commit it to an image: $ docker commit 6934a1a98de6 sha256:7025687976a478e0e94b60fa496d319cdf4ec847bcd612aecf869a72336e6b83 And then run the image [if necessary, running bash]: $ docker run -it 7025687976a4 [bash -il] |
Изменить размер tty внутри докер донтейнера под размер консоли
1 |
docker exec -it -e COLUMNS="$(tput cols)" -e LINES="$(tput lines)" container_name bash |
k8s — выполнить команду в нужном контейнере
1 |
kubectl get pods -n $NAMESPACE | grep cron | cut -d ' ' -f 1 | xargs -I {} kubectl exec -it -n $NAMESPACE {} -- bash -c "ls -la" |
k8s — установить label для node
1 |
kubectl label nodes <node_name> key=value |
k8s — Terminating ns завис
1 |
python3 -c "namespace='druid-cluster';import atexit,subprocess,json,requests,sys;proxy_process = subprocess.Popen(['kubectl', 'proxy']);atexit.register(proxy_process.kill);p = subprocess.Popen(['kubectl', 'get', 'namespace', namespace, '-o', 'json'], stdout=subprocess.PIPE);p.wait();data = json.load(p.stdout);data['spec']['finalizers'] = [];requests.put('http://127.0.0.1:8001/api/v1/namespaces/{}/finalize'.format(namespace), json=data).raise_for_status()" |
k8s — Terminating ns завис v2 — proxy
In one terminal:
1 |
kubectl proxy |
In another terminal:
1 2 3 |
kubectl get ns NAME_NAMESPACE -o json | \ jq '.spec.finalizers=[]' | \ curl -X PUT http://localhost:8001/api/v1/namespaces/NAME_NAMESPACE/finalize -H "Content-Type: application/json" --data @- |
k8s — Terminating CRD
1 2 3 |
kubectl patch crd <имя-crd> -p '{"metadata":{"finalizers":[]}}' --type=merge kubectl delete crd <имя-crd> |
k8s — dump psql
1 |
kubectl -n NAMESPACE exec postgresql-0 -- bash -c "PGPASSWORD=superpassword pg_dump -U postgres db_name" > /tmp/database.sql |
k8s — restore psql
1 2 |
cd /tmp/ !!! important !!! cat database.sql | kubectl exec -i postgresql-0 -n NAMESPACE -- PGPASSWORD=superpassword psql -U postgres -d db_name |
k8s — parse using json and jq
1 |
kubectl get no -o json | jid -q | pbcopy |
then (for example)
1 |
kubectl get no -o json | jq -r '[.items[] | {name:.metadata.name, id:.spec.externalID, unschedulable:.spec.unschedulable}]' |
containerd
1 2 |
ctr -n k8s.io containers list | grep privateregistry.org/k8s/elasticsearch ctr -n k8s.io c rm 6c79c4c27f0439be0bca155b8733573ac5865950ae648340c696453c5e85e7af |
1 2 |
ctr -n k8s.io image list | grep privateregistry.org/k8s/elasticsearch ctr -n k8s.io image rm privateregistry.org/k8s/elasticsearch:latest |