1️⃣ Но есть один нюанс 1️⃣
Как вы наверняка знаете, у пользователей и групп в линуксе есть не только их названия, но и id ( uid и gid).
И вот как раз с ними может возникнуть неловкий нюанс, который сведет все ваши старания по обеспечению безопасности на нет...
Как вы наверняка знаете, у пользователей и групп в линуксе есть не только их названия, но и id ( uid и gid).
И вот как раз с ними может возникнуть неловкий нюанс, который сведет все ваши старания по обеспечению безопасности на нет...
👍5
На продовом хосте работает по меньшей мере 12 контейнеров в общей сети. Но новая пачка сервисов требует более серьёзной изоляции от соседей. Как дешевле всего будет сделать это?
Anonymous Quiz
9%
Подниму новый хост, на котором раскатаю контейнеры с новыми сервисами
7%
Для начала подниму все на старом хосте и пойду читать Docker Ninja, чтобы узнать как сделать лучше
80%
Создам на хосте новую сеть docker network create. Новую пачку сервисов подцеплю на неё.
4%
Разверну новые контейнеры на своём рабочем компе. Дёшево и сердито. Да и у меня точно все безопасно!
🎉5👍1
🙅♂ Oh, don't touch my tralala 🙅♂
Все мы знаем, что если просто так запустить контейнер не передвая никаких дополнительных флагов, то stdout о его работе мы будем видеть прямо у себя в терминале. При этом, всплывать он будет по мере поступления событий в самом контейнере.
И, наверняка, ни для кого не является секретом, что есть такой волшебный флаг
Используем мы его так:
Интересно тут то, как это дело работает изнутри.
Как мы уже говорили, когда контейнер запускается без флага
Detach же работает по аналогии с линуксовым оператором
Конечно, системные вызовы это не тема нашего поста и в них мы погрузимся в будущих постах, но, если копать detach ещё глубже, то выйдем на системный вызов
А на этом я с вами прощаюсь и конечно же ставьте 👍, если пост был полезен!
🥷 Docker Ninja 🥷
Все мы знаем, что если просто так запустить контейнер не передвая никаких дополнительных флагов, то stdout о его работе мы будем видеть прямо у себя в терминале. При этом, всплывать он будет по мере поступления событий в самом контейнере.
И, наверняка, ни для кого не является секретом, что есть такой волшебный флаг
-d или --detach.Используем мы его так:
docker run -d -p 80:80 my_image
Интересно тут то, как это дело работает изнутри.
Как мы уже говорили, когда контейнер запускается без флага
-d, терминал остается привязанным к стандартному вводу/выводу контейнера. Это значит, что весь вывод контейнера (stdout и stderr) будет отображаться в терминале. Detach же работает по аналогии с линуксовым оператором
&, который переводит процесс в фоновый режим. Конечно, системные вызовы это не тема нашего поста и в них мы погрузимся в будущих постах, но, если копать detach ещё глубже, то выйдем на системный вызов
setsid(), который отделяет наш контейнер (процесс) от управляющего терминала, делая его независимым.А на этом я с вами прощаюсь и конечно же ставьте 👍, если пост был полезен!
🥷 Docker Ninja 🥷
👍10
🧤Война без конечностей 🧤
Ранним утром в четверг коллеги из разработки отдали свою новую поделку со словами: "Сразу в прод под нашу ответственность".
Мы люди простые, сказано - сделано. Запускаем контейнер с апликухой - работает. Но разработка вдруг сказала, что срочно нужно обновить, потому что влили хотфикс. Не проблема.
И вдруг, первоначальный контейнер повис. Дело пахнет керосином, потому что мы словили зомби процесс.
Пора применять более радикальные меры! Здесь на сцену выходит наш герой —
А теперь поиграем в Таноса:
Но помни, дружище, с такой мощью приходит большая ответственность. Прежде чем использовать, трижды проверь что ты собираешься убить! Так, легким щелчком пальца можно положить не то что половину, а весь прод!
🥷 Docker Ninja 🥷
Ранним утром в четверг коллеги из разработки отдали свою новую поделку со словами: "Сразу в прод под нашу ответственность".
Мы люди простые, сказано - сделано. Запускаем контейнер с апликухой - работает. Но разработка вдруг сказала, что срочно нужно обновить, потому что влили хотфикс. Не проблема.
И вдруг, первоначальный контейнер повис. Дело пахнет керосином, потому что мы словили зомби процесс.
Пора применять более радикальные меры! Здесь на сцену выходит наш герой —
docker kill. Эта команда без лишних вопросов отправляет контейнер в вечный отпуск не ждя никаких gracefull shutdown.docker container kill [OPTIONS] CONTAINER [CONTAINER...]
А теперь поиграем в Таноса:
docker kill dr_strange
docker kill star-lord
docker kill spidy
Но помни, дружище, с такой мощью приходит большая ответственность. Прежде чем использовать, трижды проверь что ты собираешься убить! Так, легким щелчком пальца можно положить не то что половину, а весь прод!
🥷 Docker Ninja 🥷
😁7🔥3
😱 К нам едет ревизор! 😱
Все это время мы с вами разбирали лишь команды клиентской части docker. Но при всем их богатстве, будет большой ошибкой ни разу не упомянуть о возможностях управления самим dockerd через cli.
Возможности эти не такие большие и по большей части они позволяют нам менять какое-то поле конфига
Из названия сразу понятно, что с его помощью можно что-то провалидировать и в нашем случае это будет конфиг
И вот теперь вопрос, зачем, а главное когда оно нам понадобится?
Тут все просто!
Когда вам необходимо с помощью какого-то IaC инструмента поднять докер на множестве хостов и при этом заменить дефолтный конфиг на свой. Еще интереснее, когда этот самый конфиг уникальный для некоторых групп хостов.
Просто ставите докер, закидываете свой конфиг и запускаете
Ставь 👍🏻, если было полезно!
🥷 Docker Ninja 🥷
Все это время мы с вами разбирали лишь команды клиентской части docker. Но при всем их богатстве, будет большой ошибкой ни разу не упомянуть о возможностях управления самим dockerd через cli.
Возможности эти не такие большие и по большей части они позволяют нам менять какое-то поле конфига
dockerd. Но есть довольно полезные экземпляры, например флаг —validate. Из названия сразу понятно, что с его помощью можно что-то провалидировать и в нашем случае это будет конфиг
dockerd. Таким образом, запуская dockerd с этим флагом, мы просто получаем ответ о валидности конфига. $ dockerd --validate
configuration OK
# Для верности посмотрим код последней команды
$ echo $?
0
И вот теперь вопрос, зачем, а главное когда оно нам понадобится?
Тут все просто!
Когда вам необходимо с помощью какого-то IaC инструмента поднять докер на множестве хостов и при этом заменить дефолтный конфиг на свой. Еще интереснее, когда этот самый конфиг уникальный для некоторых групп хостов.
Просто ставите докер, закидываете свой конфиг и запускаете
dockerd --validate с последующей обработкой кода ответа команды. И теперь вы всегда знаете, зашел ли ваш конфиг демону докера!Ставь 👍🏻, если было полезно!
🥷 Docker Ninja 🥷
👍12🔥2
Через какой механизм докер управляет доступом и маршрутизацией трафика при создании сети?
Anonymous Quiz
9%
SELinux
68%
iptables
14%
UFW
9%
firewalld
👍4
🐈 На словах ты tar простой, а на деле img Толстой 🦁
Помнишь, как мы с тобой создавали свой первый образ из архива с помощью команды docker import? Но что, если нам понадобится наоборот из существующего контейнера сделать архив?! Сегодняшняя тема — команда
Сама команда выглядит следующим образом:
В живую это будет выглядеть примерно так:
Хоба! И теперь у нас в руках есть копия файловой системы контейнера в виде архива, который можно позже развернуть с помощью
Используй docker export, чтобы сохранить свои шедевры и всегда быть на шаг впереди! 🧙🏼
🥷 Docker Ninja 🥷
Помнишь, как мы с тобой создавали свой первый образ из архива с помощью команды docker import? Но что, если нам понадобится наоборот из существующего контейнера сделать архив?! Сегодняшняя тема — команда
docker export, которая позволяет это сделать. Сама команда выглядит следующим образом:
docker container export [OPTIONS] CONTAINER
В живую это будет выглядеть примерно так:
docker export mycontainer > mycontainer_backup.tar
Хоба! И теперь у нас в руках есть копия файловой системы контейнера в виде архива, который можно позже развернуть с помощью
docker import, как мы делали это раньше. Используй docker export, чтобы сохранить свои шедевры и всегда быть на шаг впереди! 🧙🏼
🥷 Docker Ninja 🥷
👍10🔥2
⁉️ Да на кой это нам черт ⁉️
Команда
Предлагаю не торопиться с выводами, а лучше сделать тык по кнопочке ниже и ознакомиться с кейсами.
Вперед!👇🏻
Команда
docker export довольно специфичная и, с первого взгляда, применения ей можно и не найти. Тогда на кой черт она сдалась нам?!Предлагаю не торопиться с выводами, а лучше сделать тык по кнопочке ниже и ознакомиться с кейсами.
Вперед!👇🏻
👍6👌1
🌐 Дурной devops - дурные сети. Сломал релиз - голодны дети 🦑
Docker Network Drivers, наверное, самая сложная часть этого инструмента, и одна из самых важных! Так что, сегодня давайте рассмотрим основные типы драйверов и их особенности.
1. Bridge 🛠
- По умолчанию используется для контейнеров на одном хосте.
- Создает частную сеть, изолированную от внешнего мира, но позволяет контейнерам на одном хосте "общаться" между собой.
- Отлично подходит для локальных разработок и тестирования.
- Вариант по умолчанию при создании сети
2. Host 🌍
- Контейнер использует сетевой стек хоста напрямую
- Полезен для приложений, которым требуется высокая производительность, но получаем дебафф в виде полного остутсвия сетевой изоляции.
3. Overlay 🕸
- Позволяет контейнерам на разных хостах общаться друг с другом. По факту соединяет в сеть несколько докер демонов.
- Используется для создания распределенных систем и кластеризации, например, в Docker Swarm.
4. Macvlan 🔌
- Позволяет контейнеру иметь собственный MAC-адрес, как полноценное сетевое устройство.
- Полезен для интеграции с сетевыми устройствами или когда требуется точная настройка сетевого интерфейса.
5. IPvlan 📡
- Позволяет контейнеру иметь собственный IP-адрес в сети, используя один физический интерфейс.
- Работает в режимах L2 и L3, обеспечивая гибкость в управлении трафиком.
- Отлично подходит для высокой плотности контейнеров и минимальной конфигурации сети.
6. None 🚫
- Отключает сеть для контейнера.
- Полностью изолирует контейнер от сетей. Полезно, когда контейнер творит такую дичь, что лучше его никому не видеть и не слышать.
Каждый драйвер имеет свои особенности и сценарии использования. Важно выбрать подходящий тип для вашего проекта, чтобы обеспечить баланс между производительностью, безопасностью и функциональностью. Подробнее о каждом из них мы поговорим в будущих постах.
🥷 Docker Ninja 🥷
Docker Network Drivers, наверное, самая сложная часть этого инструмента, и одна из самых важных! Так что, сегодня давайте рассмотрим основные типы драйверов и их особенности.
1. Bridge 🛠
- По умолчанию используется для контейнеров на одном хосте.
- Создает частную сеть, изолированную от внешнего мира, но позволяет контейнерам на одном хосте "общаться" между собой.
- Отлично подходит для локальных разработок и тестирования.
- Вариант по умолчанию при создании сети
2. Host 🌍
- Контейнер использует сетевой стек хоста напрямую
- Полезен для приложений, которым требуется высокая производительность, но получаем дебафф в виде полного остутсвия сетевой изоляции.
3. Overlay 🕸
- Позволяет контейнерам на разных хостах общаться друг с другом. По факту соединяет в сеть несколько докер демонов.
- Используется для создания распределенных систем и кластеризации, например, в Docker Swarm.
4. Macvlan 🔌
- Позволяет контейнеру иметь собственный MAC-адрес, как полноценное сетевое устройство.
- Полезен для интеграции с сетевыми устройствами или когда требуется точная настройка сетевого интерфейса.
5. IPvlan 📡
- Позволяет контейнеру иметь собственный IP-адрес в сети, используя один физический интерфейс.
- Работает в режимах L2 и L3, обеспечивая гибкость в управлении трафиком.
- Отлично подходит для высокой плотности контейнеров и минимальной конфигурации сети.
6. None 🚫
- Отключает сеть для контейнера.
- Полностью изолирует контейнер от сетей. Полезно, когда контейнер творит такую дичь, что лучше его никому не видеть и не слышать.
Каждый драйвер имеет свои особенности и сценарии использования. Важно выбрать подходящий тип для вашего проекта, чтобы обеспечить баланс между производительностью, безопасностью и функциональностью. Подробнее о каждом из них мы поговорим в будущих постах.
🥷 Docker Ninja 🥷
1👍15🔥3
Вы разрабатываете приложение и запускаете его в Docker-контейнере. Чтобы повысить безопасность и предотвратить получение root-доступа на хостовой системе, какой из следующих подходов вам стоит выбрать?
Anonymous Quiz
64%
Использовать директиву USER для запуска приложения от имени непривелегированного пользователя.
22%
Запустить контейнер с сетевым мостом для изоляции от хостовой системы.
4%
Установить все обновления безопасности в контейнере после его запуска.
10%
Использовать базовый образ с минимальным количеством слоев, чтобы уменьшить поверхность атаки.
👍6🔥2
🐺 И волки целы и овцы сыты 🐑
Зачастую, чтобы собрать простейший образ с вашим приложением, приходится использовать массивные базовые образы со всем сопутствующим обвязом (sdk, сертификаты и прочие прелести из мира CI). В конечном итоге, мы можем получить монструозный многослойный образ, при запуске которого сразу и не скажешь, что деплоишь легкий контейнер.
Эту проблему отлично решает multi-stage build. Stage тут, это все, что идет после диррективы FROM до следующей такой диррективы.
Концептуально, это работает так:
1. Берем за основу образ с необходимым CI софтом
2. Собираем проект внутри него
3. Берем минимально необходимый образ, в котором наша аппликуха будет работать полноценно
4. Копируем в него собранный проект из второго шага
Фича может быть реализована разными способами, но сегодня рассмотрим один из самых распространенных.
Как видим, здесь мы собираем бинарник в образе с golang sdk от версии 1.23, а далее берем минимальный образ
🥷 Docker Ninja 🥷
Зачастую, чтобы собрать простейший образ с вашим приложением, приходится использовать массивные базовые образы со всем сопутствующим обвязом (sdk, сертификаты и прочие прелести из мира CI). В конечном итоге, мы можем получить монструозный многослойный образ, при запуске которого сразу и не скажешь, что деплоишь легкий контейнер.
Эту проблему отлично решает multi-stage build. Stage тут, это все, что идет после диррективы FROM до следующей такой диррективы.
Концептуально, это работает так:
1. Берем за основу образ с необходимым CI софтом
2. Собираем проект внутри него
3. Берем минимально необходимый образ, в котором наша аппликуха будет работать полноценно
4. Копируем в него собранный проект из второго шага
Фича может быть реализована разными способами, но сегодня рассмотрим один из самых распространенных.
FROM golang:1.23
...
RUN go build -o /bin/hello ./main.go
FROM scratch
COPY --from=0 /bin/hello /bin/hello
CMD ["/bin/hello"]
Как видим, здесь мы собираем бинарник в образе с golang sdk от версии 1.23, а далее берем минимальный образ
scratch и копируем в него тот самый бинарь. Таким образом, получаем легкий образ без лишних файлов.🥷 Docker Ninja 🥷
1👍15🔥1
💃🏻 Хороший тамада и конкурсы интерактивные!🕺🏼
Мы с вами уже знаем, что логи приложения внутри контейнера можно смотреть через команду docker logs. Все благодаря тому, что данная команда считывает stdout внутри контейнера. Но что делать, если мы хотим иметь возможность что-то передать внутрь контейнера? Как открыть stdin контейнера?
На такой случай предусмотрен флаг
Скорее всего, многие из вас уже пользовались им в связке с другим флагом (
Использование флага
Эта фишка особенно помогает, когда нам нужно выполнить пайплайн на хосте, где нету какого-либо пакета, а установлен только docker. Например, мы имеем один мощный билд агент и не хотим морочить себе голову установкой чего-либо.
И, кстати, прошу заметить, что данный флаг присутствует не только в команде
🥷 Docker Ninja 🥷
Мы с вами уже знаем, что логи приложения внутри контейнера можно смотреть через команду docker logs. Все благодаря тому, что данная команда считывает stdout внутри контейнера. Но что делать, если мы хотим иметь возможность что-то передать внутрь контейнера? Как открыть stdin контейнера?
На такой случай предусмотрен флаг
--interactive (или -i), который оставляет поток ввода контейнера открытым, позволяя отправлять данные в контейнер через стандартный ввод.echo hello | docker run --rm -i busybox cat
# Ответ команды
hello
Скорее всего, многие из вас уже пользовались им в связке с другим флагом (
-t), о котором мы поговорим в других постах. Но это не единственный кейс использования интерактивного режима на практике.Использование флага
-i позволяет создавать линуксовые пайпы через несколько вызовов различных контейнеров:docker run --rm -i busybox echo "foo bar baz" \
| docker run --rm -i busybox awk '{ print $2 }' \
| docker run --rm -i busybox rev
# Ответ команды
rab
Эта фишка особенно помогает, когда нам нужно выполнить пайплайн на хосте, где нету какого-либо пакета, а установлен только docker. Например, мы имеем один мощный билд агент и не хотим морочить себе голову установкой чего-либо.
И, кстати, прошу заметить, что данный флаг присутствует не только в команде
docker run, но и для docker exec!🥷 Docker Ninja 🥷
1👍9🔥2
Ты столкнулся с ситуацией, когда контейнер в продакшене перестал отвечать, но статус у него UP. Разработчики уже выпустили хотфикс, и тебе нужно срочно остановить залипший контейнер для заливки фикса. Какой твой следующий шаг?
Anonymous Quiz
7%
Перезапустить сервер, на котором находится контейнер, чтобы устранить зомби процесс.
65%
Использовать docker kill, чтобы остановить проблемный контейнер без ожидания graceful shutdown.
1%
Попросить разработчиков еще раз проверить код и подождать, пока они устранят проблему.
26%
Перезапустить контейнер с помощью команды docker restart. 7 бед - 1 ресет.
👍6🔥1
💊 Принимай волумпрунин 💊
Уж сколько раз твердили миру, что за контейнером нужно подчищать, особенно это касается диска! И сегодня разберем очередную команду
Не буду сильно напоминать о том, что со временем docker тома накапливаются, занимая место на диске, даже если они больше не используются. Чтобы освободить место и поддерживать чистоту в системе, мы можем прибегнуть к docker system prune, но что если удалить нужно только тома. Вот тут то и понадобится команда
Чтобы удалить все неиспользуемые тома и освободить пространство, просто выполняем команду:
Получив подтверждение, docker удалит все тома, которые никак не задействованы в каких либо контейнерах.
🥷 Docker Ninja 🥷
Уж сколько раз твердили миру, что за контейнером нужно подчищать, особенно это касается диска! И сегодня разберем очередную команду
docker volume prune, которая поможет очистить неиспользуемые тома Docker.Не буду сильно напоминать о том, что со временем docker тома накапливаются, занимая место на диске, даже если они больше не используются. Чтобы освободить место и поддерживать чистоту в системе, мы можем прибегнуть к docker system prune, но что если удалить нужно только тома. Вот тут то и понадобится команда
docker volume prune.Чтобы удалить все неиспользуемые тома и освободить пространство, просто выполняем команду:
docker volume prune
# Сразу же ловим АХТНУГ и запрос на подтверждение операции
WARNING! This will remove anonymous local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
07c7bdf3e34ab76d921894c2b834f073721fccfbbcba792aa7648e3a7a664c2e
my-named-vol
Total reclaimed space: 36 B
Получив подтверждение, docker удалит все тома, которые никак не задействованы в каких либо контейнерах.
🥷 Docker Ninja 🥷
1👍10🔥2
⁉️ А как же два стула ⁉️
Хочу напомнить вам про загадку двух стульев, а если точнее, то что конкретно будет удалять команда озвученная выше?
Хочу напомнить вам про загадку двух стульев, а если точнее, то что конкретно будет удалять команда озвученная выше?
👍4👏1
🦫 Залетаем в топ с левой пятки 🦫
Как помним, контейнеры изолируют приложения, и каждый контейнер функционирует как отдельный процесс. Но внутри контейнера может запускаться множество разных процессов. И как тогда это работает??
В случае с Nginx, например, это означает, что внутри контейнера будет основной (master) процесс и один или несколько дочерних (worker) процессов. И тут очень важно убедиться, что все worker-ы веб-сервера работают корректно, а иначе плакаль ваш хайлоуд крипто-стартап крокодьими слезками😭
Начнем с базового использования.
Пример вывода команды:
Видим тут PID и PPID, шо значит process id и parent process id. Проверяем: root, в виде nginx-master, у нас родитель для nginx-worker.
Прочитал? Тогда поставь 🔥 за тех, кто не знал про команду и остался курвой после факапа в пятничный релиз!
🥷 Docker Ninja 🥷
Сидим с бобром за компом, к релизу готовим контейнер с nginx-ом.
Как помним, контейнеры изолируют приложения, и каждый контейнер функционирует как отдельный процесс. Но внутри контейнера может запускаться множество разных процессов. И как тогда это работает??
В случае с Nginx, например, это означает, что внутри контейнера будет основной (master) процесс и один или несколько дочерних (worker) процессов. И тут очень важно убедиться, что все worker-ы веб-сервера работают корректно, а иначе плакаль ваш хайлоуд крипто-стартап крокодьими слезками😭
docker top позволяет вам следить за всей этой процессной кухней: убедиться, что они запущены и функционируют без сбоев.Начнем с базового использования.
# Пускаем контейнер
docker run -d --name my_container nginx
# Смотрим, какие процессы запущены внутри контейнера
docker top my_container
Пример вывода команды:
UID PID PPID C STIME TTY TIME CMD
root 12345 12344 0 00:00 ? 00:00:00 nginx: master process nginx -g daemon off;
101 12346 12345 0 00:00 ? 00:00:00 nginx: worker process
Видим тут PID и PPID, шо значит process id и parent process id. Проверяем: root, в виде nginx-master, у нас родитель для nginx-worker.
Прочитал? Тогда поставь 🔥 за тех, кто не знал про команду и остался курвой после факапа в пятничный релиз!
🥷 Docker Ninja 🥷
🔥20👍3
⚠️ Коллеги, ATTENTION PLEASE ⚠️
Вчера ловил жуткие отходняки от магнитных дурей🤯
Так что ловите сердечную сорямбу за пропущенный пост🫶🏻
И викторину для трениров-очки🕶
👇🏻👇👇🏿
Вчера ловил жуткие отходняки от магнитных дурей🤯
Так что ловите сердечную сорямбу за пропущенный пост🫶🏻
И викторину для трениров-очки🕶
👇🏻👇👇🏿
1❤5
Твое приложение должно работать на нескольких хостах и требует высокую производительность работы в сети, но так же важно сохранить сетевую изоляцию между контейнерами на одном сервере. Какой тип сетевого драйвера Docker выберешь?
Anonymous Quiz
39%
Bridge 🛠
10%
Host 🌍
35%
Overlay 🕸
16%
Macvlan 🔌
👍6🔥2🤔2
😈 Понедельник - день суровый 😈
Как говорил, классик, "Опять работа...". Увы и ах, а, может быть, для кого-то и ура, но впереди у нас еще 5 рабочих дней! И поэтому, чтобы жизнь совсем перестала казаться медом, сегодня погутарим опять за сети. А точнее, подумаем над вопросом, почему же, если контейнер это процесс, то его порты не конфликтуют с портами хоста?
Повторюсь в очередной раз, контейнеры в Docker, хотя и являются процессами на хостовой системе, изолированы с помощью пространства имён (namespaces) и cgroups. Это изоляция позволяет контейнерам иметь свои собственные сетевые стеки, включая независимый пул портов.
В результате имеем:
1. Сетевые namespaces:
Каждый контейнер работает в своём собственном сетевом пространстве имён. Это означает, что он имеет свой собственный сетевой интерфейс и стек, который изолирован от хостовой сети и других контейнеров. Благодаря этому порты, используемые в контейнере, не конфликтуют с портами хоста.
2. Проброс портов (Port Binding):
Чтобы контейнер был доступен извне, нужно явно настроить проброс портов с хоста в контейнер. В docker это делается с помощью флага -p, но мы то с вами знаем, что изнутри там ковыряются в политиках iptables. Именно через iptables, в том числе, настраиваются и пробросы портов сквозь разные сетевые неймспейсы.
Таким образом, даже если контейнеры используют те же внутренние порты, что и хостовая система, их изолированное сетевое пространство и явный проброс портов предотвращают конфликты.
Как-то так. А мы дружно ставим 🍾 за тех, кто сегодня не на удаленке!
🥷 Docker Ninja 🥷
Как говорил, классик, "Опять работа...". Увы и ах, а, может быть, для кого-то и ура, но впереди у нас еще 5 рабочих дней! И поэтому, чтобы жизнь совсем перестала казаться медом, сегодня погутарим опять за сети. А точнее, подумаем над вопросом, почему же, если контейнер это процесс, то его порты не конфликтуют с портами хоста?
Повторюсь в очередной раз, контейнеры в Docker, хотя и являются процессами на хостовой системе, изолированы с помощью пространства имён (namespaces) и cgroups. Это изоляция позволяет контейнерам иметь свои собственные сетевые стеки, включая независимый пул портов.
В результате имеем:
1. Сетевые namespaces:
Каждый контейнер работает в своём собственном сетевом пространстве имён. Это означает, что он имеет свой собственный сетевой интерфейс и стек, который изолирован от хостовой сети и других контейнеров. Благодаря этому порты, используемые в контейнере, не конфликтуют с портами хоста.
2. Проброс портов (Port Binding):
Чтобы контейнер был доступен извне, нужно явно настроить проброс портов с хоста в контейнер. В docker это делается с помощью флага -p, но мы то с вами знаем, что изнутри там ковыряются в политиках iptables. Именно через iptables, в том числе, настраиваются и пробросы портов сквозь разные сетевые неймспейсы.
Таким образом, даже если контейнеры используют те же внутренние порты, что и хостовая система, их изолированное сетевое пространство и явный проброс портов предотвращают конфликты.
Как-то так. А мы дружно ставим 🍾 за тех, кто сегодня не на удаленке!
🥷 Docker Ninja 🥷
🍾14👍6
🫠 Работаю над ошибками. Следующая будет фатальная! 🫠
Docker compose простой и очень понятный инструмент, но не смотря на его простоту, даже тут в процессе разработки часто возникают различные проблемы. Ошибки в файле🍑 . Поэтому, имеем все нарастающую необходимость проверить корректность
Для этого используйте команду:
Эта команда проверит наш docker-compose.yml на наличие ошибок и выведет итоговую конфигурацию с учётом всех переменных и параметров. И последняя фича, кстати, очень удобна, когда надо прокинуть какие-то данные через
🥷 Docker Ninja 🥷
Docker compose простой и очень понятный инструмент, но не смотря на его простоту, даже тут в процессе разработки часто возникают различные проблемы. Ошибки в файле
docker-compose.yml, скорее всего ничего не сломают, но могут привести к неожиданным возгораниям в области соприкосновения вас со стуломcompose файла. Это особенно важно, когда работаешь над сложными проектами с множеством сервисов и зависимостей. Для этого используйте команду:
# Находясь в контексте compose проекта
docker compose config
# Или принудительно указывая путь до файла
docker compose config -f /home/user/docker-compose.yml
Эта команда проверит наш docker-compose.yml на наличие ошибок и выведет итоговую конфигурацию с учётом всех переменных и параметров. И последняя фича, кстати, очень удобна, когда надо прокинуть какие-то данные через
.env и затем проверить, что все хорошо подставляется. Если в конфигурации имеются ошибки, мы получим сообщение об ошибке, что позволит вам их оперативно исправить.🥷 Docker Ninja 🥷
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍14❤2
Ты обнаружил, что на продовом хосте не хватает CPU, из-за чего система работает медленно. Один из контейнеров вызывает подозрения. Как ты поступишь, чтобы оптимально разобраться с проблемой, не потеряв данные и состояние приложения?
Anonymous Quiz
80%
docker compose pause <service_name>, чтобы заморозить контейнер, и изучу логи.
4%
Обновлю все контейнеры до последних версий, чтобы обновления исправили проблему с CPU.
11%
Удалю. подозрительный контейнер и пересоздам его с нуля, чтобы избавиться от возможных ошибок.
5%
Перезапущу весь сервер, чтобы освободить ресурсы и быстро устранить проблему.
👍6❤1