Forwarded from Useful Tools | Linux | GitOps | DevOps (Dmitry Malinin)
Вчера ночью без обьявления войны Docker Hub (hub.docker.com) ввела ограничения на доступ к сервису с территории России. Но нас не победить, ответ молниеносен, хотя и своеобразен.
Использовать для обхода блокировки докерхабом IP адресов России
http://huecker.io
Прислано: @burpsuite_user
И вдогонку альтернативный список прокси серверов
#docker #proxy
Использовать для обхода блокировки докерхабом IP адресов России
http://huecker.io
Прислано: @burpsuite_user
И вдогонку альтернативный список прокси серверов
/etc/docker/daemon.json
{"registry-mirrors": ["https://mirror.gcr.io", "https://daocloud.io", "https://c.163.com/", "https://registry.docker-cn.com"]
}
#docker #proxy
Здрасти. Еще один частый вопрос с проекта Linux Factory:
Давай симулируем ситуацию и попробуем что-то с этим сделать.
ㅤ
Для начала соберем имейдж, это будет простой nginx + свой конфиг, который будет копироваться с локальной машины в имейдж.
Создаем на хостовой машине пару файлов:
Dockerfile:
nginx.conf
Собираем имейдж:
Ждем, на экране бежит куча всякого непотребства. Это нормально. Ждем…
Проверяем:
Ага, все ок, выплюнуло что-то вроде:
Запускаем:
Проверяем:
Хуй там плавал. Ничо не стартануло… ошибок нет, куда смотреть?
Если контейнер вообще не запускается, то для начала смотрим логи:
1. Узнаем состояние контейнера:
Видим хуй с маслом:
2. Смотрим логи:
В
В логах видим ошибку:
Вот! С ней уже можно работать. Получается мы посмотрели логи, даже для незапущенного контейнера. Пиздуем в nginx конфиг и видим, что в 14й строке проебали точку с запятой.
Дополнительно можно посмотреть коды выхода:
Например, если код выхода
Это основные моменты отладки.
Ну а если контейнер все же запустился, но что-то не работает, сначала повторяем все вышенаписанное. Ну и дополнительно можешь подключиться к нему в интерактивном режиме:
Подставляешь id/name контейнера и выбираешь шелл, частенько bash и коробки не установлен, поэтому как вариант запускаешь sh.
А для визуализации слоев используем утилиту dive
Установка dive:
Открываем имейдж на анализ:
Подставляем id или имя — ИМЕЙДЖА (не контейнера)
Смотрим, охуеваем, закрываем.
Еще можно глянуть конкретный файл в контейнере:
Либо скопировать его себе на локальную машину:
Поправить и скопировать обратно в контейнер:
Перезапускаем контейнер с новым конфигом:
Такие дела! Если знаешь еще хаки и способы отладки контейнеров/имеджей, пиши в комменты, будет полезно!
tags: #devops #debug #docker
—
➕ @bashdays ➕ @gitgate
Я собрал докер имейдж, а контейнер вечно в ребуте либо вообще не запускается, чо делать и как отлаживать?
Давай симулируем ситуацию и попробуем что-то с этим сделать.
ㅤ
Для начала соберем имейдж, это будет простой nginx + свой конфиг, который будет копироваться с локальной машины в имейдж.
Создаем на хостовой машине пару файлов:
Dockerfile:
FROM nginx:latest
WORKDIR /etc/nginx
COPY ./nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
nginx.conf
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name localhost;
location / {
return 200 'Hello, Docker!'
add_header Content-Type text/plain;
}
}
}
Собираем имейдж:
docker build -t my-nginx .
Ждем, на экране бежит куча всякого непотребства. Это нормально. Ждем…
Проверяем:
docker images
Ага, все ок, выплюнуло что-то вроде:
REPOSITORY TAG IMAGE ID CREATED SIZE
my-nginx latest b844ef77daa3 33 seconds ago 188MB
Запускаем:
docker run -d -p 80:80 my-nginx
Проверяем:
docker ps
Хуй там плавал. Ничо не стартануло… ошибок нет, куда смотреть?
Если контейнер вообще не запускается, то для начала смотрим логи:
1. Узнаем состояние контейнера:
docker ps -a
Видим хуй с маслом:
Exited (1) 4 minutes ago
2. Смотрим логи:
docker logs --follow <id or name>
В
<id or name>
подставляем айдишник либо имя контейнера:В логах видим ошибку:
invalid number of arguments in "return" directive in /etc/nginx/nginx.conf:15
Вот! С ней уже можно работать. Получается мы посмотрели логи, даже для незапущенного контейнера. Пиздуем в nginx конфиг и видим, что в 14й строке проебали точку с запятой.
Дополнительно можно посмотреть коды выхода:
docker inspect <id or name>
Например, если код выхода
ExitCode = 137
, значит не хватило ресурсов, подкинь памяти и все взлетит. Наверное…Это основные моменты отладки.
Ну а если контейнер все же запустился, но что-то не работает, сначала повторяем все вышенаписанное. Ну и дополнительно можешь подключиться к нему в интерактивном режиме:
docker exec -it <id or name> bash/sh
Подставляешь id/name контейнера и выбираешь шелл, частенько bash и коробки не установлен, поэтому как вариант запускаешь sh.
А для визуализации слоев используем утилиту dive
Установка dive:
DIVE_VERSION=$(curl -sL "https://api.github.com/repos/wagoodman/dive/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
curl -OL https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.deb
sudo apt install ./dive_${DIVE_VERSION}_linux_amd64.deb
Открываем имейдж на анализ:
dive <id or imagename>
Подставляем id или имя — ИМЕЙДЖА (не контейнера)
Смотрим, охуеваем, закрываем.
Еще можно глянуть конкретный файл в контейнере:
docker exec -it <id or name> cat /etc/nginx/nginx.conf
Либо скопировать его себе на локальную машину:
docker cp <id or name>:/etc/nginx/nginx.conf /tmp
Поправить и скопировать обратно в контейнер:
docker cp /tmp/nginx.conf <id or name>:/etc/nginx/nginx.conf
Перезапускаем контейнер с новым конфигом:
Прикол в том, что тебе не нужно билдить новый имейдж, ты делаешь правки прям в контейнере.
docker exec <id or name> nginx -s reload
Такие дела! Если знаешь еще хаки и способы отладки контейнеров/имеджей, пиши в комменты, будет полезно!
tags: #devops #debug #docker
—
➕ @bashdays ➕ @gitgate
25 69 12
Реверсим Dockerfile
Представим что у нас пропал Dockerfile, а остался только собранный имейдж. Ну или скачал ты готовый имейдж с докерхаба и хочется узнать как его собирали.
Как произвести реверсинг?
ㅤ
Для примера соберем образ из такого Dockerfile
Запускаем сборку имейджа:
Теперь нативными командами вытягиваем начинку, без всяких dive и т.п. Но придется немного глазками пробежаться.
Результат команды выведет протокол сборки + команды. Но команды будут урезанными. Для того чтобы получить полный листинг, делаем так:
Вылетит простыня, но при сноровке и насмотренности, всё вполне предсказуемо.
В идеале совмещаем с dive, смотрим окно Layers и стрелками перемещаемся по слоям, а там уже видно все команды, которые выполнялись из Dockerfile.
По итогу из говна и палок собираем копию нужного нам Dockerfile.
А файлы, которые были добавлены через COPY, вытягиваем себе на локальную машину так:
Как вариант можешь воспользоваться анализаторами, например trivy.
Trivy это комплексный и универсальный сканер безопасности для docker images. Заодно еще безопасность своих решений можно позырить и приуныть.
А еще есть клевая поделка для этого на python, но про нее закину уже завтра.
Вот такие пироги, если знаешь еще способы — пиши в комменты, будет полезно!
tags: #debug #devops #docker
—
🔔 @bashdays➡️ @gitgate
Представим что у нас пропал Dockerfile, а остался только собранный имейдж. Ну или скачал ты готовый имейдж с докерхаба и хочется узнать как его собирали.
Как произвести реверсинг?
ㅤ
Для примера соберем образ из такого Dockerfile
FROM python:3.8-slim
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
EXPOSE 5000
CMD ["python", "app.py"]
Запускаем сборку имейджа:
docker build -t pythoner:latest .
Теперь нативными командами вытягиваем начинку, без всяких dive и т.п. Но придется немного глазками пробежаться.
docker history pythoner:latest
Результат команды выведет протокол сборки + команды. Но команды будут урезанными. Для того чтобы получить полный листинг, делаем так:
docker history --no-trunc pythoner:latest
Вылетит простыня, но при сноровке и насмотренности, всё вполне предсказуемо.
В идеале совмещаем с dive, смотрим окно Layers и стрелками перемещаемся по слоям, а там уже видно все команды, которые выполнялись из Dockerfile.
По итогу из говна и палок собираем копию нужного нам Dockerfile.
А файлы, которые были добавлены через COPY, вытягиваем себе на локальную машину так:
docker cp <image id>:/etc/nginx/nginx.conf /tmp
Про дебаг докер имейджей и контейнеров я писал в этом посте, почитай, достаточно информативно.
Как вариант можешь воспользоваться анализаторами, например trivy.
Trivy это комплексный и универсальный сканер безопасности для docker images. Заодно еще безопасность своих решений можно позырить и приуныть.
А еще есть клевая поделка для этого на python, но про нее закину уже завтра.
Вот такие пироги, если знаешь еще способы — пиши в комменты, будет полезно!
tags: #debug #devops #docker
—
Please open Telegram to view this post
VIEW IN TELEGRAM
15 65 17
Вчера мы рассмотрели способы как отреверсить Dockerfile с помощью рук и глаз.
Сегодня рассмотрим никому не известную утилиту — «Дедок».
Утилита написана на питоне и позволяет свести к минимуму handjob по реверсу.
ㅤ
Грубо говоря «Дедок» проанализирует твой docker image и выплюнет на экран готовый Dockerfile.
Ну как готовый, очень приближенный к реальности.
Работает эта хуйня очень просто — парсит history и избавляется от лишней хуйни. Но хуйня порой пролетает, так что будь к этому готов.
Запускаем так:
Либо сразу в алиас:
Я этим пользоваться не буду, мне больше handjob нравится, но ты посмотри, мож где-то быстренько пригодится что-то зареверсить.
➡️ Репа проекта и документашка.
Развлекайся. Увидимся совсем скоро!
tags: #debug #devops #docker
—
🔔 @bashdays➡️ @gitgate
Сегодня рассмотрим никому не известную утилиту — «Дедок».
Утилита написана на питоне и позволяет свести к минимуму handjob по реверсу.
ㅤ
Грубо говоря «Дедок» проанализирует твой docker image и выплюнет на экран готовый Dockerfile.
Ну как готовый, очень приближенный к реальности.
Работает эта хуйня очень просто — парсит history и избавляется от лишней хуйни. Но хуйня порой пролетает, так что будь к этому готов.
Запускаем так:
docker run -v /var/run/docker.sock:/var/run/docker.sock mrhavens/dedockify <ID Image>
Либо сразу в алиас:
alias dedoc="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm mrhavens/dedockify"
Предварительно подставь нужный ID Image.
Я этим пользоваться не буду, мне больше handjob нравится, но ты посмотри, мож где-то быстренько пригодится что-то зареверсить.
Развлекайся. Увидимся совсем скоро!
tags: #debug #devops #docker
—
Please open Telegram to view this post
VIEW IN TELEGRAM
12 36 13
Принцесса для снятия стресса
Привет. Когда ты создаешь новый docker контейнер, то по умолчанию этому контейнеру назначается имя. Откуда оно берется?
Например:
Окей. После некоторого ресёрча оказалось, что 90% докера написано на Golang. Вот это поворот!
Порывшись еще немного, нашел функцию по генерации этих имен для контейнеров.
➡️ Посмотреть можешь тут.
ㅤ
Мотаем этот код в самый низ и видим забавную хуйню:
Этакая пасхалочка. Но зачем все эти имена?
Да чтобы удобнее было манипулировать контейнерами, вот и вся идея этой возни.
Ну и на закуску адаптируем полученные знания на bash, генератор может выглядеть так:
После запуска скрипта, на экран выведутся 10 случайных имен в стиле docker. Количество можешь гибко менять.
Теперь ты в праве заполнить массивы своими данными и генерировать уникальные имена, например:
А потом использовать сразу в командах:
Есть еще такая штука:
Это выплюнет тебе подобное имя прям в консоли без скриптов и приседаний.
А еще есть библиотека на питоне — codenamize, которая проворачивает тоже самое.
Короче есть из чего выбрать. В общем пользуйся, прикручивай, изучай!
tags: #linux #bash #docker
—
🔔 @bashdays➡️ @gitgate
Привет. Когда ты создаешь новый docker контейнер, то по умолчанию этому контейнеру назначается имя. Откуда оно берется?
Docker генерирует случайные имена для контейнеров, используя сочетание прилагательных и фамилий известных учёных или инженеров.
<прилагательное><фамилия>
и всегда написаны в нижнем регистре.Например:
quirky_pare
agitated_turing
furious_heisenberg
romantic_curie
Окей. После некоторого ресёрча оказалось, что 90% докера написано на Golang. Вот это поворот!
Порывшись еще немного, нашел функцию по генерации этих имен для контейнеров.
ㅤ
Мотаем этот код в самый низ и видим забавную хуйню:
if name == "boring_wozniak" /* Steve Wozniak is not boring */ {
goto begin
}
Этакая пасхалочка. Но зачем все эти имена?
Да чтобы удобнее было манипулировать контейнерами, вот и вся идея этой возни.
Ну и на закуску адаптируем полученные знания на bash, генератор может выглядеть так:
#!/bin/bash
adjectives=(
"adoring" "agitated" "amazing" "angry" "awesome" "blissful" "bold"
"boring" "brave" "clever" "cool" "compassionate" "competent" "crazy"
"dazzling" "determined" "ecstatic" "elegant" "eloquent" "epic"
"exciting" "fervent" "focused" "furious" "gallant" "gifted" "goofy"
"gracious" "happy" "hardcore" "hopeful" "hungry" "infallible" "inspiring"
"jolly" "jovial" "keen" "kind" "laughing" "loving" "magical"
"mystifying" "naughty" "nervous" "nostalgic" "optimistic" "peaceful"
"practical" "priceless" "quirky" "recursing" "relaxed" "reverent"
"sad" "serene" "sharp" "silly" "sleepy" "stoic" "strange" "stupefied"
"suspicious" "tender" "thirsty" "trusting" "unruffled" "vibrant"
"vigilant" "wizardly" "wonderful" "youthful" "zealous" "zen"
)
scientists=(
"albattani" "allen" "archimedes" "ardinghelli" "babbage" "bashdays" "banach"
"banzai" "bardeen" "bartik" "bassi" "bell" "benz" "bhabha" "bhaskara"
"blackwell" "bohr" "booth" "borg" "bose" "boyd" "brahmagupta" "brattain"
"brown" "carson" "chandrasekhar" "colden" "cori" "cray" "curie"
"darwin" "davinci" "dijkstra" "dubinsky" "easley" "einstein"
"elion" "engelbart" "euclid" "euler" "fermat" "fermi" "feynman"
"franklin" "galileo" "galois" "goldberg" "goodall" "hawking"
"heisenberg" "hermann" "herschel" "hertz" "hodgkin" "hoover" "hopper"
"hypatia" "joliot" "kalam" "keller" "kowalevski" "lalande" "leavitt"
"lichterman" "liskov" "lovelace" "mayer" "mccarthy" "mcclintock"
"mclean" "mcnulty" "meitner" "mendel" "mendeleev" "minsky" "mirzakhani"
"moore" "napier" "newton" "nobel" "noether" "panini" "pare"
"pasteur" "payne" "perlman" "pike" "poincare" "ptolemy" "raman"
"ramanujan" "ride" "ritchie" "roentgen" "rosalind" "saha"
"sammet" "shockley" "sinoussi" "stallman" "stonebraker" "swanson"
"tesla" "thompson" "torvalds" "turing" "varahamihira" "visvesvaraya"
"wilbur" "wiles" "williams" "wilson" "wing" "wozniak" "wright"
"yonath"
)
generate_container_name() {
local adjective="${adjectives[RANDOM % ${#adjectives[@]}]}"
local scientist="${scientists[RANDOM % ${#scientists[@]}]}"
echo "${adjective}_${scientist}"
}
count=${1:-10}
for ((i=1; i<=count; i++)); do
generate_container_name
done
После запуска скрипта, на экран выведутся 10 случайных имен в стиле docker. Количество можешь гибко менять.
Теперь ты в праве заполнить массивы своими данными и генерировать уникальные имена, например:
pizdatiy_huy
или ohuennaya_pizda
.А потом использовать сразу в командах:
docker run --name $(bash script.sh) -d nginx
Есть еще такая штука:
alias dn='curl -s https://frightanic.com/goodies_content/docker-names.php'
Это выплюнет тебе подобное имя прям в консоли без скриптов и приседаний.
А еще есть библиотека на питоне — codenamize, которая проворачивает тоже самое.
Короче есть из чего выбрать. В общем пользуйся, прикручивай, изучай!
tags: #linux #bash #docker
—
Please open Telegram to view this post
VIEW IN TELEGRAM
26 57 19
Как правильно натянуть презерватив
Вот поставил ты
ㅤ
Хуйня! У меня например на хостовой машине стоит
И оно проксирует на
Но если сделать так:
Ты сразу попадешь в контейнер, минуя
Напрашивается
Есть решение гораздо изящнее. Рассмотрим пример с gitea.
Это урезанный
Смотрим секцию с портами и видим там биндинг на
То тебе покажут письку!😑
Вроде элементарно, но как оказалось дохуя специалистов этого не знают и продолжают трахаться с
И да, оказывается многие (в основном деды) не знают что
А вообще если у тебя всё в контейнерах крутится, выкинь
Пользуйтесь!
tags: #devops #docker #security
—
🔔 @bashdays➡️ @gitgate
Вот поставил ты
docker
, запустил на нем контейнер, пробросил порты, збс! Только вот есть одно НО. Проброшенные порты торчат жопой наружу и любой желающий может получить к ним доступ.ㅤ
Хуйня! У меня например на хостовой машине стоит
nginx
, который прокси-пасит по урлам на нужные приложения, например:curl https://bashdays.ru/vault/
И оно проксирует на
localhost:8002
, на этом порту крутится контейнер с vault hashicorp.Но если сделать так:
curl XXX.XXX.XXX.XXX:8002
Ты сразу попадешь в контейнер, минуя
nginx
и все его правила. Гавно!Напрашивается
iptables
, но в связке с docker
это то еще приключение. Про эти моменты писал в этом и этом посте.
Есть решение гораздо изящнее. Рассмотрим пример с gitea.
Это урезанный
docker-compose.yml
version: "3"
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:latest
networks:
- gitea
volumes:
- gitea:/data
ports:
- "127.0.0.1:3000:3000"
- "127.0.0.1:2221:22"
Смотрим секцию с портами и видим там биндинг на
127.0.0.1
. Вот это оно и есть. То есть ты и порты пробрасываешь на хостовую машину и наружу ими не светишь.Nginx
на хостовой машине отлично сходит на 127.0.0.1:3000
, но вот если снова выполнить:curl XXX.XXX.XXX.XXX:3000
То тебе покажут письку!
Вроде элементарно, но как оказалось дохуя специалистов этого не знают и продолжают трахаться с
iptables
.И да, оказывается многие (в основном деды) не знают что
docker-compose
(тот что бинарник) это легаси и файлики docker-compose.yml
теперь можно запускать так:docker compose up -d
А вообще если у тебя всё в контейнерах крутится, выкинь
nginx
и замени на traefik
и никакие порты по умолчанию жопой наружу торчать не будут + автоматическое получение SSL для доменов.Пользуйтесь!
tags: #devops #docker #security
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Собирал docker контейнер и чет меня лог сборки прям напряг.
То есть то, что отмечено на скрине красным прямоугольником, это область которая прокручивается. И предыдущий текст теряется.
ㅤ
Ну хуйня же! — подумал я и пошел копать.
А всё, как обычно, просто, в строке сборке делаем так:
Устанавливаем параметр
Как альтернатива, можно сделать так:
И теперь не нужно подставлять в каждую команду сборки этот параметр.
tty вывод будет «более красивым» для интерактивных терминалов (то есть он будет перезаписываться).
plain будет просто выводить все.
auto (по умолчанию) будет предпринята попытка определить, какой из двух вариантов больше подходит для текущей среды.
Такие дела. Изучай.
tags: #docker #devops
—
🔔 @bashdays➡️ @gitgate
То есть то, что отмечено на скрине красным прямоугольником, это область которая прокручивается. И предыдущий текст теряется.
ㅤ
Ну хуйня же! — подумал я и пошел копать.
А всё, как обычно, просто, в строке сборке делаем так:
docker build -t "setuppython" --progress=plain .
Устанавливаем параметр
progress=plain
и радуемся. Лог сборки прекращает ротироваться и весь мусор теперь на экране.Как альтернатива, можно сделать так:
export BUILDKIT_PROGRESS=plain
И теперь не нужно подставлять в каждую команду сборки этот параметр.
progress
может быть = auto, plain, и ttytty вывод будет «более красивым» для интерактивных терминалов (то есть он будет перезаписываться).
plain будет просто выводить все.
auto (по умолчанию) будет предпринята попытка определить, какой из двух вариантов больше подходит для текущей среды.
Такие дела. Изучай.
tags: #docker #devops
—
Please open Telegram to view this post
VIEW IN TELEGRAM
20 70
Тошнит от избыточности Portainer?
Ну дак вот, есть пиздатая легковесная альтернатива под названием dockge.
Визуально она очень похожа на Uptime Kuma, без хуйни и перегруженных интерфейсов.
Суть простая: скармливаешь туда свой docker-compose, нажимаешь — запустить, а дальше оно само всё сделает.
В общем всё что нужно для быстрого развертывания.
Сам лично переехал на эту штуку в домашней лаборатории. И пока доволен. Вот те готовый ямлик для запуска dockge.
➡️ Репка на гитхабе
➡️ Посмотреть видео работы
Забирай в копилку! Ну и с пятницей!
🛠 #utilites #docker
—
✅ @bashdays / @linuxfactory / @blog
Ну дак вот, есть пиздатая легковесная альтернатива под названием dockge.
Визуально она очень похожа на Uptime Kuma, без хуйни и перегруженных интерфейсов.
Суть простая: скармливаешь туда свой docker-compose, нажимаешь — запустить, а дальше оно само всё сделает.
Удобное редактирование, обновление, поддержка .env, визуализация логов, подключение через shell к контейнерам и т.п.
В общем всё что нужно для быстрого развертывания.
Сам лично переехал на эту штуку в домашней лаборатории. И пока доволен. Вот те готовый ямлик для запуска dockge.
services:
dockge:
image: louislam/dockge:1
restart: unless-stopped
ports:
- 5001:5001
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data:/app/data
- /opt/stacks:/opt/stacks
environment:
- DOCKGE_STACKS_DIR=/opt/stacks
- DOCKGE_ENABLE_CONSOLE=true
Забирай в копилку! Ну и с пятницей!
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
6 81