Дигиталната връзка – Мрежи и променливи на средата в Docker

Дотук имаме контейнери, които работят и пазят данни. Но в реалния свят приложенията трябва да си говорят. Уеб сървърът трябва да намери базата данни, а приложението трябва да знае паролата за нея, без тя да е "забита" в кода.
Днес ще научим как Docker изгражда виртуални мрежи и как да управляваме настройките чрез Environment Variables.
1. Docker Networks: Кой с кого може да говори? 🌐
Когато стартирате контейнери, Docker автоматично ги поставя в мрежа. Но за да бъде системата ви сигурна и организирана, трябва да разберете как работят мрежовите драйвери:
- Bridge (Мост): Най-често използваният. Контейнерите в една Bridge мрежа могат да си говорят помежду си чрез имената си (например
webможе да пингнеdatabase), но са изолирани от външния свят, освен ако не отворите порт. - Host: Контейнерът споделя мрежата директно с вашия сървър. Бързо е, но няма изолация.
- None: Пълна изолация. Контейнерът няма достъп до никаква мрежа.
2. Магията на DNS в Docker Compose 🪄
Едно от най-големите предимства на Docker Compose е, че той автоматично създава мрежа за вашия проект. В тази мрежа името на услугата става неин адрес.
Ако в docker-compose.yml имате услуга db, вашето приложение не трябва да търси IP адрес като 192.168.0.5. То просто се свързва с хост db. Docker се грижи за останалото.
3. Environment Variables: Пазете тайните си! 🔐
Никога, ама никога не пишете пароли, API ключове или секретни токени директно в кода на програмата си (т.нар. "hardcoding"). Ако го направите и качите кода в GitHub, всеки ще ги види.
Вместо това използваме Environment Variables (Променливи на средата). Те се подават на контейнера в момента на стартиране.
4. Практика: Свързване на приложение с база данни 🚀
Нека направим проект, в който едно приложение (напр. Adminer – инструмент за управление на бази данни) се свързва с MySQL база данни чрез мрежа и променливи.
Създайте нова папка и файл: nano docker-compose.yml
version: '3.8'
services:
# Нашата база данни
mysql_db:
image: mysql:8.0
restart: always
environment:
# Използваме променливи за настройка на базата
MYSQL_ROOT_PASSWORD: secret_admin_password
MYSQL_DATABASE: moqta_baza
networks:
- backend_network
# Уеб интерфейс за базата данни
adminer:
image: adminer
restart: always
ports:
- "8080:8080"
environment:
# Казваме на Adminer кой е сървърът по подразбиране
ADMINER_DEFAULT_SERVER: mysql_db
networks:
- backend_network
networks:
backend_network:
driver: bridge
Какво постигнахме тук?
- Изолация: Създадохме мрежа
backend_network. Само контейнерите в нея могат да се виждат. - Сигурност: Паролата се подава чрез
environment. Можем да я променим лесно, без да пипаме кода на MySQL. - Свързаност: Adminer ще търси базата на адрес
mysql_db(името на услугата).
Стартирайте с docker compose up -d и отворете vashiqt-ip-adres:8080. За "Server" напишете mysql_db и използвайте паролата от файла.
5. Използване на .env файл (Професионалният подход)

Ако имате много променливи, файлът docker-compose.yml става претрупан. Затова използваме .env файл.
- Създайте файл
.env:nano .envPlaintextDB_PASSWORD=super_tajna_parola DB_NAME=production_db - Редактирайте
docker-compose.yml:YAMLenvironment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} MYSQL_DATABASE: ${DB_NAME}
Docker Compose автоматично ще прочете стойностите от .env файла. Така можете да споделите YAML файла с колеги, без да им разкривате паролите си.
6. Чести грешки и съвети 💡
- Портове vs Мрежи: Потребителите често бъркат порта, който отваряме към света (
ports), с вътрешната комуникация. Контейнерите в една мрежа могат да си говорят на всички портове, без да ги описвате вports. Описвайте вportsсамо това, което трябва да се вижда от браузъра. - Забравена мрежа: Ако дефинирате собствена мрежа за един контейнер, но забравите да добавите другия в нея, те няма да се виждат.
Заключение
Вече сте напреднали потребители! Знаете как да изолирате услугите си и как да управлявате конфигурациите им професионално.
В последната ни статия (Част 5) ще завършим поредицата с нещо изключително важно: Поддръжка, почистване и добри практики за сигурност. Ще научим как да поддържаме сървъра си чист от "боклуци" и как да актуализираме контейнерите си без риск.
Намерихте материала за полезен?
Съдържанието на itpraktika.com е безплатно и ще остане такова.
Ако статията ти е помогнала — можеш да подкрепиш сайта с малка доброволна сума.
Всяко дарение помага за поддръжката и развитието на портала.
