Docker Linux основи роботи з контейнерами

Docker став невідємною частиною сучасної розробки програмного забезпечення, дозволяючи пакувати, р...

Docker став невідємною частиною сучасної розробки програмного забезпечення, дозволяючи пакувати, розгортати та запускати програми у вигляді контейнерів. У цій статті ми детально розглянемо Docker на Linux, охоплюючи основи роботи з контейнерами, важливі команди та практичні поради для ефективного використання Docker у вашому робочому процесі.

Що таке Docker і чому він важливий?

Docker – це платформа контейнеризації, яка дозволяє ізолювати додаток та всі його залежності (бібліотеки, системні інструменти, код, середовище виконання) в окремий контейнер. Контейнеризація надає численні переваги:

  • Узгодженість середовища: Забезпечує ідентичне середовище для розробки, тестування та виробництва, усуваючи проблеми на моєму компютері працює.
  • Ізоляція: Контейнери ізольовані один від одного та від хост-системи, що підвищує безпеку та запобігає конфліктам між додатками.
  • Портативність: Контейнери можна легко переміщувати між різними середовищами, включаючи локальні машини, хмарні сервери та віртуальні машини.
  • Ефективність використання ресурсів: Контейнери використовують менше ресурсів, ніж віртуальні машини, оскільки вони спільно використовують ядро хост-системи.
  • Швидке розгортання: Контейнери можна швидко розгортати та масштабувати, що дозволяє швидко реагувати на зміни вимог бізнесу.

Основні компоненти Docker:

  1. Docker Engine: Основний компонент Docker, відповідальний за створення, запуск та керування контейнерами.
  2. Docker Images: Шаблони, що містять все необхідне для запуску контейнера, включаючи код, середовище виконання, системні інструменти та бібліотеки.
  3. Docker Containers: Працюючі екземпляри Docker images. Вони є ізольованими середовищами, в яких запускаються додатки.
  4. Docker Hub: Публічний реєстр Docker images, де можна знайти та завантажити готові образи для різних додатків та операційних систем.
  5. Docker Compose: Інструмент для визначення та запуску багатоконтейнерних додатків. Він дозволяє описувати конфігурацію додатків у файлі YAML та запускати їх однією командою.
  6. Dockerfile: Текстовий файл, що містить інструкції для автоматичного створення Docker image.

Встановлення Docker на Linux (Ubuntu/Debian):

Найпростіший спосіб встановити Docker на Ubuntu/Debian – використовувати офіційний скрипт встановлення:

  1. Оновіть список пакетів: sudo apt update
  2. Встановіть необхідні залежності: sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
  3. Додайте ключ GPG Docker: curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  4. Додайте репозиторій Docker: echo deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  5. Знову оновіть список пакетів: sudo apt update
  6. Встановіть Docker Engine: sudo apt install docker-ce docker-ce-cli containerd.io
  7. Перевірте статус Docker: sudo systemctl status docker

Після встановлення Docker, додайте вашого користувача в групу `docker`, щоб не потрібно було використовувати `sudo` для виконання команд Docker:

  1. sudo usermod -aG docker $USER
  2. Вийдіть з системи та знову увійдіть, щоб зміни вступили в силу.

Основні команди Docker:

Ось декілька основних команд Docker, які вам знадобляться для початку роботи:

  • docker pull [image_name]: Завантажує Docker image з Docker Hub або іншого реєстру. Наприклад: docker pull ubuntu:latest.
  • docker images: Відображає список доступних Docker images на вашій машині.
  • docker run [options] [image_name] [command]: Створює та запускає контейнер з вказаного Docker image. Наприклад: docker run -it ubuntu:latest bash (запускає контейнер Ubuntu в інтерактивному режимі з bash).
  • docker ps: Відображає список запущених контейнерів.
  • docker ps -a: Відображає список всіх контейнерів (включаючи зупинені).
  • docker stop [container_id]: Зупиняє запущений контейнер. Container_id можна знайти за допомогою команди `docker ps`.
  • docker start [container_id]: Запускає зупинений контейнер.
  • docker restart [container_id]: Перезавантажує запущений контейнер.
  • docker rm [container_id]: Видаляє зупинений контейнер.
  • docker rmi [image_id]: Видаляє Docker image. Image_id можна знайти за допомогою команди `docker images`.
  • docker exec -it [container_id] [command]: Виконує команду всередині запущеного контейнера. Наприклад: docker exec -it [container_id] bash (відкриває bash-сесію всередині контейнера).
  • docker logs [container_id]: Переглядає логи контейнера.
  • docker build -t [image_name] .: Будує Docker image з Dockerfile у поточному каталозі.

Робота з Dockerfile:

Dockerfile – це текстовий файл, що містить інструкції для створення Docker image. Ось приклад Dockerfile для простого веб-додатку на Python:

FROM python:3.9-slim-busterWORKDIR /appCOPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txtCOPY . .CMD [python, app.py]n

Розберемо інструкції Dockerfile:

  • FROM: Визначає базовий образ, на основі якого буде створено ваш образ. В даному випадку, використовується образ Python 3.9 на базі Debian Buster.
  • WORKDIR: Встановлює робочий каталог всередині контейнера.
  • COPY: Копіює файли та каталоги з хост-машини в контейнер. Тут ми копіюємо файл `requirements.txt`, який містить список залежностей Python.
  • RUN: Виконує команду всередині контейнера. В даному випадку, ми встановлюємо залежності Python, використовуючи `pip`.
  • COPY . .: Копіює всі файли з поточного каталогу на хост-машині в робочий каталог всередині контейнера.
  • CMD: Визначає команду, яка буде запущена при старті контейнера. Тут ми запускаємо скрипт `app.py` за допомогою Python.

Щоб побудувати Docker image з Dockerfile, виконайте команду:

docker build -t my-python-app .

Де `my-python-app` – назва вашого Docker image, а `.` вказує на поточний каталог, де знаходиться Dockerfile.

Docker Compose: Керування багатоконтейнерними додатками:

Docker Compose дозволяє визначати та запускати багатоконтейнерні додатки. Замість запуску кожного контейнера окремо, ви можете описати конфігурацію вашого додатку у файлі `docker-compose.yml` та запустити все однією командою.

Ось приклад `docker-compose.yml` для веб-додатку з базою даних PostgreSQL:

version: 3.9services:n  web:n    build: .n    ports:n      - 5000:5000n    depends_on:n      - dbn    environment:n      DATABASE_URL: postgresql://user:password@db:5432/mydb  db:n    image: postgres:13n    environment:n      POSTGRES_USER: usern      POSTGRES_PASSWORD: passwordn      POSTGRES_DB: mydbn    volumes:n      - db_data:/var/lib/postgresql/datavolumes:n  db_data:n

Розберемо файл `docker-compose.yml`:

  • version: Версія формату файлу Docker Compose.
  • services: Визначає список сервісів, які входять до складу додатку. У цьому випадку, у нас є два сервіси: `web` (веб-додаток) та `db` (база даних PostgreSQL).
  • web:
    • build: Вказує на каталог, що містить Dockerfile для побудови образу веб-додатку.
    • ports: Визначає відображення портів між контейнером та хост-машиною. В даному випадку, порт 5000 контейнера відображається на порт 5000 хост-машини.
    • depends_on: Вказує на залежності між сервісами. Веб-додаток залежить від сервісу бази даних (`db`). Docker Compose гарантує, що сервіс бази даних буде запущений перед веб-додатком.
    • environment: Визначає змінні середовища, які будуть доступні веб-додатку. Тут ми передаємо URL бази даних.
  • db:
    • image: Вказує на Docker image, який буде використано для сервісу бази даних. В даному випадку, використовується образ PostgreSQL 13 з Docker Hub.
    • environment: Визначає змінні середовища, які будуть використані для конфігурації бази даних.
    • volumes: Визначає volumes для збереження даних бази даних. В даному випадку, ми використовуємо volume `db_data` для збереження даних PostgreSQL.
  • volumes: Визначає volumes, які використовуються сервісами.

Щоб запустити додаток, визначений у файлі `docker-compose.yml`, перейдіть в каталог, що містить файл, та виконайте команду:

docker-compose up -d

Опція `-d` запускає додаток у фоновому режимі (detached mode).

Щоб зупинити додаток, виконайте команду:

docker-compose down

Поради та кращі практики:

  • Використовуйте офіційні образи: Завжди віддавайте перевагу офіційним Docker images з Docker Hub, оскільки вони зазвичай краще підтримуються та мають менше вразливостей.
  • Мінімізуйте розмір образу: Зменшуйте розмір Docker image, видаляючи непотрібні файли та залежності. Використовуйте багатоетапні збірки (multi-stage builds), щоб зменшити розмір кінцевого образу.
  • Використовуйте volumes для збереження даних: Використовуйте volumes для збереження даних, які повинні бути збережені після зупинки або видалення контейнера.
  • Використовуйте змінні середовища для конфігурації: Використовуйте змінні середовища для конфігурації додатків, щоб їх можна було легко змінювати без необхідності перебудови Docker image.
  • Пишіть чисті та зрозумілі Dockerfile: Робіть Dockerfile легко читабельним та зрозумілим, щоб інші розробники могли легко зрозуміти, як створюється Docker image.
  • Використовуйте інструменти для оркестрації контейнерів: Для управління великою кількістю контейнерів використовуйте інструменти для оркестрації контейнерів, такі як Kubernetes або Docker Swarm.
  • Регулярно оновлюйте Docker: Регулярно оновлюйте Docker Engine та інші компоненти Docker, щоб отримувати останні виправлення помилок та оновлення безпеки.

Висновок:

Docker – потужний інструмент, який може значно спростити розробку, розгортання та управління додатками. Розуміння основних принципів роботи з Docker та застосування кращих практик дозволить вам ефективно використовувати Docker у ваших проектах. Сподіваємось, ця стаття допомогла вам зрозуміти основи роботи з Docker на Linux. Практикуйтеся, експериментуйте, і ви швидко освоїте цей корисний інструмент.