Як швидко створити тонкі зображення Docker від Саймона Хау До науки про дані

Саймон Хау

20 листопада 2019 · 7 хв читання

Ви пам’ятаєте ті дні, коли ви писали чудове програмне забезпечення, але не могли встановити його на чужій машині, або воно там розбилося? Хоча це ніколи не є приємним досвідом, ми завжди могли сказати

створити

На сьогодні це вже не виправдання через контейнеризацію.

Дуже коротко, за допомогою контейнеризації, ви додаєте свою програму та всі необхідні залежності в зображення. Після виконання ви запускаєте це зображення як контейнер. З цим вам не потрібно возитися з системою іншої людини, щоб ваше програмне забезпечення працювало. Контейнер, а отже, і ваше програмне забезпечення має працювати просто де завгодно, якщо воно працює на вашому комп'ютері. Це також корисно для науковців даних при розгортанні моделей, які залежать від різних пакетів та їх версій. Для мене вчені з даних повинні знати, як створювати зображення та контейнери.

Як ви всі знаєте, Docker є головним гравцем у цій царині, і зображення Docker всюдисущі. Це приголомшливо, оскільки ви можете запускати, наприклад, бази даних різних версій поруч, без зайвих клопотів. Злом зображень для ваших додатків також дуже простий. Це пов’язано з великою кількістю базових зображень та простою мовою визначення. Однак, коли ви зломьте зображення разом, не знаючи, що робите, у вас є дві проблеми.

  1. Ви витрачаєте місце на диску, оскільки ваші зображення стають надмірно жирними.
  2. Ви витрачаєте час, чекаючи збірок, які тривають занадто довго.

У цій статті я хочу показати вам, як можна пом'якшити ці дві проблеми. На щастя, для цього потрібно лише знати декілька прийомів та технік, запропонованих Docker. Щоб зробити підручник веселим та корисним, я покажу вам, як упакувати програму Python у образ Docker. Ви можете знайти весь код, на який посилаються нижче, у моєму сховищі Github.

Ви готові? Давайте його на.

Припустимо, що весь наш код живе в одному файлі Python main.py. Оскільки ми круті діти, ми використовуємо останню і найкращу версію Python, яка на момент написання цієї статті становила 3,8. Наш додаток - це просто простий веб-сервер, який залежить від панд, фастапі та uvicorn. Ми зберігаємо залежності у файлі requirements.txt. Місцево ми розробляємо додаток у віртуальному середовищі. Це середовище знаходиться в папці .venv у тій же папці, що і код (це стає важливим незабаром). Тепер ми вирішили упакувати все це в образ Docker. Для цього нам залишається лише

  1. Використовуйте базове зображення з доступним Python 3.8.
  2. Скопіюйте код та файл вимог.
  3. Встановіть вимоги та залежності на зображенні.
  4. Виставити команду, яка запускає наш додаток

Виглядає перша версія нашого образу Docker

Окрім нашого коду та вимог, нам потрібно встановити GCC, оскільки FastApi вимагає цього при встановленні. Ми будуємо свій імідж шляхом

Розмір цього зображення становить близько 683 МБ і займає близько хвилини для його створення (за винятком завантаження базового зображення). Давайте подивимося, як ми можемо це зменшити.

Основне зображення

Щодо базового зображення, я вже зробив свідомий вибір, використовуючи Python slim. Чому я саме це обрав?

Я міг взяти, наприклад, повний образ Ubuntu або CentOS, що призвело б до розміру зображення> 1 Гб. Але, оскільки мені потрібен лише Python, немає причин встановлювати все це.

На нижньому кінці розміру зображення можна взяти python: 3.8.0 - альпійський. Але мій код спирається на панд, що дуже важко встановити на альпійських. У Alpine також є проблеми щодо стабільності та безпеки. Крім того, тонкий - це лише

80 Мб більше, ніж альпійський, що все ще добре. Для отримання додаткової інформації про те, як вибрати оптимальний образ Python, я звертаюся до зацікавленого читача до цієї статті.

Контекст побудови

Коли ви створюєте зображення, перший рядок, надрукований на вашій консолі, говорить: Надсилання контексту збірки в демон Docker. На моєму комп'ютері це зайняло близько 5 секунд, і було надіслано 154 МБ. Що тут відбувається? Docker копіює всі файли та папки, що знаходяться в контексті побудови, до демона. Тут контекст збірки є каталогом, в якому зберігається файл Docker. Оскільки нам потрібні лише два текстові файли, 154 МБ звучить досить багато, чи не так? Причиною цього є те, що Docker копіює все, наприклад, папку .venv, яка містить віртуальне середовище, або папку .git.