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

Дигиталната връзка – Мрежи и променливи на средата в 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

Какво постигнахме тук?

  1. Изолация: Създадохме мрежа backend_network. Само контейнерите в нея могат да се виждат.
  2. Сигурност: Паролата се подава чрез environment. Можем да я променим лесно, без да пипаме кода на MySQL.
  3. Свързаност: Adminer ще търси базата на адрес mysql_db (името на услугата).

Стартирайте с docker compose up -d и отворете vashiqt-ip-adres:8080. За "Server" напишете mysql_db и използвайте паролата от файла.


5. Използване на .env файл (Професионалният подход)

Използване на .env файл

Ако имате много променливи, файлът docker-compose.yml става претрупан. Затова използваме .env файл.

  1. Създайте файл .env: nano .envPlaintextDB_PASSWORD=super_tajna_parola DB_NAME=production_db
  2. Редактирайте docker-compose.yml:YAMLenvironment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} MYSQL_DATABASE: ${DB_NAME}

Docker Compose автоматично ще прочете стойностите от .env файла. Така можете да споделите YAML файла с колеги, без да им разкривате паролите си.


6. Чести грешки и съвети 💡

  • Портове vs Мрежи: Потребителите често бъркат порта, който отваряме към света (ports), с вътрешната комуникация. Контейнерите в една мрежа могат да си говорят на всички портове, без да ги описвате в ports. Описвайте в ports само това, което трябва да се вижда от браузъра.
  • Забравена мрежа: Ако дефинирате собствена мрежа за един контейнер, но забравите да добавите другия в нея, те няма да се виждат.


Заключение

Вече сте напреднали потребители! Знаете как да изолирате услугите си и как да управлявате конфигурациите им професионално.

В последната ни статия (Част 5) ще завършим поредицата с нещо изключително важно: Поддръжка, почистване и добри практики за сигурност. Ще научим как да поддържаме сървъра си чист от "боклуци" и как да актуализираме контейнерите си без риск.

open source spirit
🛠️
$

Намерихте материала за полезен?

Съдържанието на itpraktika.com е безплатно и ще остане такова.
Ако статията ти е помогнала — можеш да подкрепиш сайта с малка доброволна сума. Всяко дарение помага за поддръжката и развитието на портала.

PayPal Revolut

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *


Колко е 3 + 9 ? (въведете числото)