Админим с Буквой
5.35K subscribers
302 photos
8 videos
59 files
1.15K links
Канал о системном администрировании, DevOps и немного Инфобеза.

По всем вопросам обращаться к @bykva. Рекламу не размещаю.
Download Telegram
Docker pull via proxy

# systemctl edit docker.service


add the following strings:

[Service]
Environment=ALL_PROXY=socks5://user:password@host:port


reload systemd && restart docker

# systemctl daemon-reload
# systemctl restart docker.service


#proxy #docker
Список тегов, используемых в канале:

—-------------------------------
Лекции и материалы
—-------------------------------
#Занятие
#Лекции
Лекция
#junior

—---------
Linux
—---------
#ssh
#bash
#bash_tips_and_tricks
#awk
#tmux
#console
#utils
#troubleshooting
#nmap
#apt
#bind
#sound
#power_management

—----------
DevOps
—----------
#jenkins
#ansible
#git
#kubernetes
#deploy
#ceph
#docker
#puppet

—------------------
Virtualization
—------------------
#vmware
vagrant

—------------------
Networking
—---------------—
#networking
#proxy
#socks

—---------
InfoSec
—---------
#vulns
#security
#ctf

—-------------
Windows
—-------------
#RDTS
#windows_server2012
#RDP

—------------
Datacenters
—---------—
#ovh
#hetzner

—-------
Other
—-------
#android
#jira

—------------------------------------------------
Ссылки и сторонние материалы
—------------------------------------------------
#read
#thirdparty

Updated: 29.05.18
Docker up to date checking

Сервис для проверки ваших докер контейнеров на "обновленность". Для публичных - бесплатно. приватные - за денежку.

https://anchore.io/

#docker
Убитый контейнер докера не запускается

Ошибка:
endpoint with name XXXX already exists in network bridge.
Решение:
docker network disconnect --force bridge <Container ID or Endpoint ID or Container NAME>

Это не для тех, кто не умеет гуглить, а для того чтобы наоборот каждый раз не гуглить когда такое возникает=)

#docker #troubleshooting #networking
Запускаем задачу в background в докер контейнере через ansible

Особо ничего сложного, nohup да &, однако процесс все равно не отпускает консоль, посему ansible зависает. Чтобы этого не происходило, можно применить такую конструкцию:

- name: run bg job
shell: docker exec -i <container> sh -c 'nohup CMD &'
async: 45
poll: 0

#docker #ansible
RBAC on docker registry

Поигрался тут на днях с одним сервисом который позволяет использвать token-based аутентификацию пользователя с docker registry. Стандартный вариант логин-пароль уже не удовлетворяет потребностям и пришлось искать что-то другое. В итоге набрел на готовое решение от cesanta/docker_auth. Написано на go, легковестный token-сервис с поддержкой различных способов аутентификации пользователей и также, что самое главное - это ACL. С помощью acl можно задавать кто, и какие репозитории может пушить и пуллить, с точностью до регулярного выражения. В качестве базы хранения пользователей-acl можно выбрать статический файл, mongodb, ldap и некоторые другие. В том числе можно использовать и сторонний софт, хоть самопис. токен будет выдаваться в зависимости от кода ответа этого софта. И тут уже можно сделать все что угодно - хоть выдавать токены в зависимости от времени суток. Поковырявшись в этом собрал готовое решение, запускаемое через docker-compose. Оно содержит набор из 3 контейнеров: docker_auth, docker registry и mongo. После старта docker-compose все что нужно сделать - загрузить список правил и пользователей в mongo через простейший shell-скрипт.

https://github.com/bykvaadm/docker_auth

#docker #auth
Cleanup docker registry

Проверено для версии 2.6.2

1. добавить в конфиг registry эти строки и перезапустить:

storage:
delete:
enabled: true


2. получаем список тегов для репозитория и выбираем список на удаление

curl -u <user>:<password> https://<registry_host>/v2/<repo_name>/tags/list


3. помечаем объекты на удаление через api

repo="REPO_PATH"
tag_list='TAG LIST separated by space'
user="USER"
pwd="PASSWORD"
registry_host="<registry_host>"
header="Accept: application/vnd.docker.distribution.manifest.v2+json"

for tag in ${tag_list}; do
digest=$(curl -I -u $user:$pwd -H "$header" "https://${registry_host}/v2/${repo}/manifests/${tag}" 2>/dev/null| awk '$1 == "docker-content-digest:" {print $2}'| tr -dc '[[:print:]]')
curl -XDELETE -u $user:$pwd -H "$header" "https://${registry_host}/v2/${repo}/manifests/${digest}"
done


4. заходим внутрь контейнера и запускаем garbage-collector.

registry garbage-collect /etc/docker/registry/config.yml


Итого наша задача - получить список тегов, выбрать нужные на удаление. На каждый тег получить sha256 манифеста (docker-content-digest в заголовке ответа), а затем пометить этот заголовок на удаление. К концу 3-го пункта никакие данные еще не удалены. Удаление происходит не вручную, а с помощью нативного сборщика мусора. согласно помеченным манифестам будут удалены выбранные теги.

#docker #registry
Интегрируем проверку на уязвимости в CI

The Anchore Engine is an open source project that provides a centralized service for inspection, analysis and certification of container images. 

https://github.com/anchore/anchore-engine

https://medium.com/devopslinks/step-by-step-guide-to-integrate-opensource-container-security-scanner-anchore-engine-with-cicd-580da8db5dfc

#docker #jenkins #security
Нападение без объявления войны

я хз че это было, но вы поймете когда вам это понадобится))

https://github.com/moby/moby/blob/master/contrib/init/systemd/docker.socket

(Ну а так, ошибка такая: docker.service: Failed to schedule restart job: Unit docker.socket not found.)

#docker #troubleshooting
куда можно потратить 3 часа

Способов потерять время - сотни. Можно поваляться на траве в погожий денек, написать какой-нибудь прикольной зеленоглазой девчонке, а можно... собирать пакеты и тестировать их в докере. И убить эти 3 часа в попытке исполнить .examples/.docs скрипты установки. Ну это те, которые приносят файлики в /usr/share/docs/<package>. Вы кладете туда файл, а он не приезжает после установки пакета. Самое главное что если пакет вскрыть с помощью ar, то нужные файлы там есть. При установке пакета - в нужных местах не появляются. Самое бесячее, что в нужной папке появляется файл copyright, а твои другие - нет.

Ларчик-то просто открывался. Всего-навсего в докере из коробки лежит конфиг dpkg, который говорит, мол copyright клади, а другие файлы не клади...

#packaging #docker
докер в кроне

если вы набили руку вызывать докер через docker exec -ti, и особенно та часть которая относится к -ti, помните, никакого tty в кроне нет и работать это не будет. Поэтому просто, docker exec <ID/NAME> <CMD>.

Сам уже не первый раз натыкаюсь, надоело уже, решил записать))

#docker #cron
Интересное наблюдение

На одном из серверов выполнил вот такую команду:

# ps aux | grep nginx
puppet 6754 ... nginx: worker process
puppet 6755 ... nginx: worker process


Вы наверное тоже насторожились как и я, какого хрена nginx запущен от папета. Оказалось все довольно просто. На сервере nginx запущен в докере:

# docker exec -ti 4da030b0cfb5 ps aux | grep nginx
nginx 668 nginx: worker process
nginx 669 nginx: worker process


А вот ответ на вопрос как так получилось:

# grep puppet /etc/passwd                                                                                                                                              
puppet:x:105:109:Puppet configuration ....
# docker exec -ti 4da030b0cfb5 grep nginx /etc/passwd
nginx:x:105:111:nginx user


#docker
ansible base64 multiply vars

{
"auths": {
"{{ dkr_url }}": {
"auth": "{{ (dkr_user+':'+dkr_password) | b64encode }}"
},
"{{ dkr_dev_url }}": {
"auth": "{{ (dkr_dev_user+':'+dkr_dev_password) | b64encode }}"
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.2 (linux)"
}

#ansible #docker
terraform create dockreg secret in k8s

resource "kubernetes_secret" "company-dkr-key" {
metadata {
name = "company-dkr-key"
namespace = "${kubernetes_namespace.company.metadata.0.name}"
}

data = {
".dockerconfigjson" = "{\"auths\":{\"${var.company-dkr-url}\":{\"username\":\"${var.company-dkr-user}\",\"password\":\"${var.company-dkr-password}\",\"email\":\"email\",\"auth\":\"${base64encode(format("%s:%s", var.company-dkr-user, var.company-dkr-password))}\"}}}"

## OR u can also do this from file
# ".dockercfg" = "${file("${path.module}/docker.cfg")}"

}

type = "kubernetes.io/dockercfg"
}

#terraform #docker #kubernetes
как сбросить пароль на postgresql в запущенном docker контейнере без перезапуска

Рубрика "костылим с буквой"

ОСТОРОЖНО прочитанное далее может вызвать кровотечение из глаз и непреодолимое желание расшибить себе лоб рукой.

вы были предупреждены.

Раскатывал я тут хелм сентри... Дано: не работающий Job, который использует пароль из секрета, и криво написанный авторами чарт, в котором слетает пароль пользователя в postgres. Задача - установить в контенере на лету нужный пароль пользователя.



# получаем пароль который должен быть выставлен на постгре
kubectl -n sentry get secret sentry-sentry-postgresql -o yaml | awk '$1=/postgresql-password:/ {print $2}' | base64 -d; echo

# получаем ноду на которой крутится постгре и ssh-шимся на нее
kubectl -n sentry get po -o wide | awk '$1~/.*postgr.*/ {print $7}'

# получаем id контейнера и логинимся туда под рутом
docker ps | grep postgr | grep entry | awk '{print $1}'
docker exec -ti -u0 <container_id> bash

# узнаем пользователя под которым запущен постгре
grep Uid /proc/1/task/1/status

# разрешаем логиниться из-под локалхоста
sed -ibak 's/^\([^#]*\)md5/\1trust/g' /opt/bitnami/postgresql/conf/

# добавляем пользователя в систему и переходим в него
useradd postgres -u 1001
su postgres

# выставляем переменные окружения и релоадим сервис
export PGDATA=/bitnami/postgresql/data
/opt/bitnami/postgresql/bin/pg_ctl reload

# логинимся в postgres и выставляем пароль
psql -U postgres
ALTER USER postgres WITH PASSWORD 'XXX';

возвращаем назад изменения или перестартуем контейнер.


#рукиизжопы #костыли #postgresql #docker #sentry #kubernetes
Happy New Year! With a new year upon us, it's time to reflect on the best Docker content and projects from 2019 sourced from our Docker experts and our exceptional Docker community and community leaders. Check out our most binge-worthy content of 2019 as you begin to map your Docker journey for 2020.

Top 5 Docker Blogs from 2019

Intro Guide to Dockerfile Best Practices by Tibor Vass - July 2, 2019
Happy Pi Day with Docker and Raspberry Pi by Paulo Frazao - March 14, 2019
5 Things to Try with Docker Desktop WSL 2 Tech Preview by Ben De St Paer-Gotch - July 31, 2019
New in Docker Hub: Personal Access Token by Shenea Leven - September 19, 2019
Docker's Next Chapter: Advancing Developer Workflows for Modern Apps by Scott Johnston - November 13, 2019


Top Docker & Docker Captain Projects:

Container registry with commands in an Alpine image
Golang library with API to run Docker container
docker-compose stack for Prometheus monitoring
Sample node app for Docker examples

#docker #подборка
Собрал стенд для обучения работы с hashicorp vault

Разворачивается через вагрант на локальных вм. Поднимается куб кластер в котором поднимается HA версия vault с бекендом на HA etcd.

НА - это не на, а аббревиатура. написано большими буквами потому что я не помню как пишется high availabilпыр-пыр-пыр. etcd используется вместо консула потому что почему бы и нет. разница в бэкенде не существенна при обучении работы с vault. (ну на самом деле, потому что консул в кубе можно развернуть только один кластер, а это значит что мы отдаем его только под секреты - ведь не шарить же его еще с кем-то если мы там храним секреты, а в данном случае кажется избыточным поднимать консул, ведь если у вас будет 20 нод, вы получите 20 реплик консула (так написан чарт), а у etcd по-прежнему останется 3. )

В данном репозитории ТОЛЬКО сам стенд. материалы для обучения продаются, как говорится, отдельно =)

https://github.com/bykvaadm/vault-on-kubernetes-stand

#virtualbox
#vagrant
#ansible
#kubernetes
#helm
#docker
#etcd
#ingress
#hashicorp
#vault
#обучение

З.Ы. поделились аналогичным стендом, на компоузах и с консулом. https://github.com/temalovepizza/vaultstuff
Собираем helm-чарт в gitlab-ci и пушим в docker registry

Используем экспериментальную фичу с oci-registry в которую научился хелм. Это значит что мы можем чарты теперь просто пушить рядом с контейнерами докера с таким же именованием и тегированием.

deploy_helm:
stage: deploy
image: docker:18-dind
services:
- docker:18-dind
environment: { name: production }
tags: [docker]
only:
refs: [master]
script:
- export CHART_VERSION=$(grep version Chart.yaml | awk '{print $2}')
- chmod 400 $DOCKERCONFIG
- mkdir registry
- alias helm='docker run -v $(pwd)/regisry:/root/.cache/helm/registry -v $(pwd):/apps -v ${DOCKERCONFIG}:/root/.docker/config.json -e DOCKER_CONFIG="/root/.docker" -e HELM_REGISTRY_CONFIG="/root/.docker/config.json" -e HELM_EXPERIMENTAL_OCI=1 alpine/helm'
- helm chart save . registry.company.com/helm/charts/debezium:${CHART_VERSION}
- helm chart push registry.company.com/helm/charts/debezium:${CHART_VERSION}

Структура репозитория - файлы чарта и .gitlab-ci.yml. После запуска деплоя создается воркер - докер с поддержкой docker-in-docker. Мы качаем публичный контейнер хелма на альпине. Все пробросы нужны для того чтобы хелм внутри докера умел ходить в регистри и сохранять промежуточный кэш для докер регистри. Помещаю его в "алиас" команды хелма для того чтобы логически отделить запуск хелма и запуск докера. последние 2 строки - сохранить чарт в локальный кэш и подготовить для пуша в регистри и собственно запушить. Чтобы всё это работало нужно подготовить docker config.json с готовыми параметрами пользователя для доступа к докер регистри и сохранить его в переменные джобы как файл.

#helm
#gitlab
#docker
Делаем резервные копии postgres на s3 (minio)

В гисте приложен кусочек плейбука ansible который настраивает резервное копирование через mc клиент. скрипт умеет выгружать в bucket по-отдельности каждую базу из списка, оценивать размер и время совершения последнего копирования каждой базы и отдавать эту информацию в формате prometheus, а также подчищать из s3 устаревшие копии.

https://gist.github.com/bykvaadm/434a4eef5392528c9c0e4788937301bc

#postgres
#docker
#patroni
#ansible
#minio
#prometheus
Читаем документацию вместе с Буквой

Я довольно часто натыкаюсь при работе с коллегами разработчиками на то, что они используют или в шелл скриптах (ci/cd) или в юнит файлах конструкцию ExecStartPre= docker pull ... которая при перезапуске всегда им подтягивает latest версию контейнера. В целом звучит логично, однако правильнее воспользоваться встроенным функционалом docker, а именно ключом --pull=always, который выполнит ту же самую задачу и будет более простым в использовании.

#docker