SharUpOff | Code
87 subscribers
38 photos
16 links
Download Telegram
🤔 Почему мы с командой не используем python:alpine?


FROM python:alpine
RUN pip install poetry --no-cache-dir

🚫 В Alpine Linux вместо glibc - musl. До недавнего времени установка библиотек Python с бинарными зависимостями требовала их сборки.

✔️️️️ Благодаря PEP 656 появились скомпилированные пакеты для musl. Но не на все платформы.

Значительная часть наших разработчиков использует macOS. Это удобная ОС для работы с Python. После GNU/Linux, конечно 😏

Наш Dockerfile выглядел бы так:

FROM python:alpine

RUN apk add --no-cache gcc libc-dev libffi-dev && \
pip install poetry --no-cache-dir && \
apk del gcc libc-dev libffi-dev

🐌 Это на порядок замедлило бы сборку. Особенно, если речь о multi-stage builds с различающимся набором зависимостей.

А если не удалять пакеты, в чём тогда смысл alpine? 🤔

Не убедительно? Вот ещё две статьи про выбор образа:
- https://pythonspeed.com/articles/base-image-python-docker-images/
- https://pythonspeed.com/articles/alpine-docker-python/

#python #docker #alpine #musl #macos
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
DNSCrypt - это протокол шифрования и набор готового программного обеспечения для организации защищённого канала передачи DNS-трафика: https://github.com/DNSCrypt

Ни для кого не секрет, что провайдеры любят заглядывать в наш DNS-трафик, а порой даже берут на себя ответственность нарушать работу протокола.

Несколько лет я использовал только dnscrypt-proxy на роутере. Все запросы на 53 порт, которые пытались пройти мимо, неумолимо заворачивались:

iptables -t nat -I PREROUTING -i br0 -p udp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)

К примеру, Chrome старается игнорировать системные настройки и ходит за DNS к себе, в Google. Поэтому порт 853, а также адреса вроде 8.8.8.8 и 8.8.4.4 тоже заблокированы в моей домашней сети. Остаётся только одна полностью контролируемая точка выхода DNS-запросов.

😴 Конечной точкой долгое время был сервер Яндекса. Буквально пару дней назад он устал и запросы перестали ходить. Видимо, пришло время поднять свой encrypted-dns-server.

😵 Пакет, который разработчик любезно собрал для Debian, на моей Ubuntu 20.04 LTS не поделил память с OOM Killer.

Пробую собрать. Rust. Cargo, кажется, пытается выкачать весь GitHub. Последние 500Мб на моей скромной VPS'ке стремительно заканчиваются приблизительно на 27% готовности зависимостей.

Остаётся последний вариант. Изучив трёхэтажный однострочник для запуска Docker решил лучше накатать простейший Compose:

services:
server:
image: jedisct1/dnscrypt-server
command:
- start
ports:
- 123.123.123.123:12345:12345/udp
- 123.123.123.123:12345:12345/tcp
volumes:
- /etc/dnscrypt-server:/opt/encrypted-dns/etc/keys

🛠 Перед первым запуском нужно проинициализировать сервис:

docker compose run server init -N example.com -E 123.123.123.123:12345

В ответ будет выведена строка sdns://AQQAAAAAAAAAEDc3Ljg4... Она нужна для настройки клиента.

Интернет дома снова работает. Теперь ещё чуточку надёжнее.

#traffic #iptables #dns #dnscrypt #devops #linux #docker #compose
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥32
🐳 Docker Hub умер, да здравствует Docker Hub!

Здесь можно рассуждать на тему ненадёжности облачных решений, но тогда станет душно, а мы договорились приятно проводить время

У Тебя же есть виртуалка, через которую выходишь в большой интернет? Можно завернуть трафик в неё.

Всё 💁‍♂️

Ты ещё здесь? 😅 Ну хорошо, ещё можно запустить Registry в режиме pull-through cache - здесь информации мало, зато строчкой ниже будет раздел Registry, а в нём ссылка на спецификацию Distribution Registry. Перейдём в раздел Configuring a registry. Как тебе такое чтиво на вечер?

docker run registry …

Не люблю эти длинные команды для запуска контейнеров, поэтому создал compose.yaml:

services:
registry:
image: registry
network_mode: host
volumes:
- /etc/docker/registry:/etc/docker/registry

В смонтированном каталоге лежит config.yml. Cкопировал его из образа и добавил proxy. Как в спецификации:

proxy:
remoteurl: https://registry-1.docker.io
ttl: 24h

🚀 Теперь запускаем docker compose up любимым способом. Я использую systemd. Можно сразу настроить basic auth и letsencrypt, но я пока добавил в Caddyfile:

docker.efstudios.org {
reverse_proxy localhost:5000

basicauth {
sharupoff password-hash
}
}


👀 Проверяем:

docker login docker.efstudios.org --username sharupoff


Login Succeeded


docker run docker.efstudios.org/library/hello-world


Hello from Docker!
This message shows that your installation appears to be working correctly.


☝️ Кстати, образы нужно запрашивать из подкаталога library, о чём документация в основном умалчивает.

☕️ А теперь, пока кэш наполняется образами, наполни чашку ароматным чаем и отлично проведи остаток этого вечера

#docker #dockerhub #dockerregistry #caddy
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2
На этой неделе столкнулись с любопытной проблемой: на Ubuntu 24.04 не устанавливается SSL-соединение из Docker-контейнера до некоторых хостов, если… Если запущен Wireguard.

Выглядит это так:

docker compose run --rm service curl -v https://example.com


* Trying 172.16.64.10:443...
* Connected to example.com (172.16.64.10) port 443 (#0)
* ALPN: offers h2,http/1.1
* TLSV1.3 (OUT), TLS handshake, Client hello (1):
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: /etc/ssl/certs


⌛️ Здесь долго висит...

* Recv failure: Connection reset by peer
* OpenSSL SSL_connect: Connection reset by peer in connection to example.com:443
* Closing connection 0
curl: (35) Recv failure: Connection reset by peer


ℹ️ Дело в том, что WG для своего интерфейса устанавливает MTU 1420, оставляя 80 байт на собственный оверхед:

cat /sys/class/net/wg0/mtu


1420


Docker же использует стандартный размер пакета 1500 байт:

docker compose run --rm service cat /sys/class/net/eth0/mtu


1500


При такой конфигурации TLS handshake в некоторых случаях не влазит в целый пакет.

Беглое чтение документации подсказывает, что настройки WG можно трогать только в крайнем случае, а вот для Docker Compose значение MTU можно смело изменить.

✍️ Создадим файл:

cat > docker-compose.override.yml << EOF
networks:
default:
driver: bridge
driver_opts:
com.docker.network.driver.mtu: 1420
EOF


👀 Проверим MTU:

docker compose down
docker compose run --rm service cat /sys/class/net/eth0/mtu


1420


✔️ Теперь запросы выполняются:

docker compose run --rm service curl -v https://example.com


HTTP/2 200


И никакой магии 🐰🎩

#docker #compose #wireguard #ubuntu #mtu #networking #issue #solved
Please open Telegram to view this post
VIEW IN TELEGRAM
👏7