Създаване на изображение на Docker от Scratch

Creating Docker Image From Scratch



Основното предимство на Docker пред всяка друга технология за контейнеризиране е, че Docker е насочен към разработчиците и техните апстак приложения. Докато правилните технологии за контейнеризиране като LXC , Зони и Затвори са насочени от оперативна гледна точка или, просто казано, тези платформи са заместител на виртуалните машини, работещи в облака. Когато, Docker е заместител на пакети и изпълними двоични файлове.

Свободно казано, Docker става все повече и повече като универсален мениджър на пакети, който работи във всички възможни Linux платформи. Той отнема контейнери и ги използва за решаване на съвсем различен проблем, пред който са изправени разработчиците. Проблемът е, че разработчиците използват настолната си операционна система (като Windows, macOS или Linux с един тон свързани с настолни пакети) за писане на приложения. Приложението, което пишат, често работи на напълно различна операционна система на сървър някъде с някаква Linux дистрибуция, напълно различна от тази на лаптопа на разработчика.







С Docker идеята е приложението ви да е опаковано като изображение на Docker. Работата на Docker е да вземе това изображение и да го стартира като контейнерно приложение за вас. Да бъдеш контейнериран означава, че приложението и неговите зависимости ще се изпълняват в изолирана среда, която може да се различава напълно от лаптопа на разработчика и дори от производствения сървър. Докато и двамата поддържат Docker, и двамата могат да изпълняват едно и също приложение по абсолютно същия начин.



Анатомия на изображение на Докер

Както бе споменато по -рано, приложение Docker ще работи в договорена среда. Сега въпросът е как да създадем тази среда? Повечето изображения на приложения ще импортират базово изображение на Docker и ще изградят приложението си върху него.



Приложенията са направени от слоеве софтуер. Образ на контейнер на wordpress се изгражда с помощта на изображение на контейнер httpd, което от своя страна се изгражда върху изображение на Ubuntu. Изображението, върху което е изградено по -ново изображение, е известно като РОДИТЕЛСКИ ИЗОБРАЖЕНИЕ в терминологията на Docker. В Dockerfile (ще стигнем до това, което означава Dockerfile, малко по -късно), това родителско изображение се споменава в горната част на файла, както е показано по -долу:





ОТ Ubuntu: 18.04
## Останалата част от Dockerfile

Този Dockerfile, когато се изпълнява, преобразува вашето приложение в образ на Docker (двоичен вид), който след това можете да избутате в регистър, откъдето може да бъде изтеглен, за да създадете нови контейнери на друго място. Всички те обаче ще имат Ubuntu: 18.04 като основно изображение и ще работят, сякаш това е Ubuntu система, в която работят.

Може би сте забелязали това, когато се опитвате да изтеглите нов образ на докер.



Създаване на изображение на Docker от Scratch

Това показва колко слоя са изтеглени преди да бъде въведено действителното приложение (което може да бъде само с няколко мегабайта).

Поради тази причина бихме искали да създадем това, което е известно като базово изображение. Което не е изградено върху нищо друго. Ключовата дума scratch се използва, за да покаже, че този слой не е изграден върху нищо друго. Така:

От нулата
## Останалата част от файла Dcoker

Първо ще създадем просто приложение hello-world и след това ще разберем каква ще бъде останалата част от Dockerfile. Хост системата е Ubuntu: 18.04 LTS и ние използваме Docker версия 17.12.1-ce за експеримента.

Създаване на статичен двоичен файл

Docker контейнерите са съвкупност от процеси, работещи изолирани от останалата част от операционната система. Единственото нещо, с което този процес е във връзка, е ядрото. Ядрото е отговорно за планирането на тези процеси на процесора, управлението на паметта и няколко други основни задачи за запазване на резервации.

Но повечето приложения на високо ниво зависят от много системни библиотеки (като glibc, musl, klibc и др ) и много зависимости от времето на изпълнение като Python или Node.js или Java Runtime. Двоичният файл на приложението не разполага с всички налични библиотеки в него, но когато започне изпълнението, той извиква тези библиотеки от хост операционната система.

Тъй като се опитваме да създадем изображение от нулата, няма да получим тези хубави неща. Така че нашето приложение трябва да бъде статичен файл или самостоятелен изпълним файл.

Нека започнем със създаването на папка, наречена MyDockerImage и създаване на файл hello.cc вътре в нея.

$mkdirMyDockerImage
$CDMyDockerImage
$докосванездравей.cc

Отворете hello.cc с любимия си текстов редактор и добавете следните редове вътре в него.

#включва
използвайки пространство за имена std;
intглавен(){
цена<< 'Здравейте! Това съобщение идва от контейнерн';
връщане 0;

}

Това е проста C ++ програма, която отпечатва Hello! Това съобщение …

По причини, обсъдени по -рано, ще компилираме това, използвайки статичния флаг. Използваният компилатор е g ++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0.

За да компилирате програмата, в същата директория изпълнете следната команда:

$ g++ -о здравей-статиченЗдравейте.DC

Това създава двоичен изпълним файл hello в същата директория. Това е нашият статичен файл. Проверете дали работи по предназначение, като споменете името на файла в терминала.

$./Здравейте

Сега сме готови да контейнеризираме тази проста програма.

Докер файл

Dockerfile се състои от набор от правила, които приемат файловете на вашето приложение (като двоични файлове, изходни файлове и т.н.), заедно с различни конфигурационни параметри, като оформление на файловата система, открити портове и т.н., и ги превръща в файл с изображение на Docker. След това можете да споделите файла с изображение с всеки, който иска да стартира това приложение.

Няма да копаем във всяка опция, налична за Dockerfile, вместо това ще напишем много минималистичен Dockerfile. В същата директория, където се намира вашият hello изпълним файл, създайте празен файл с име Докер файл.

$докосванеДокер файл

Отворете го с любимия си текстов редактор и напишете следните редове към него:

ОТ нулата
ДОБАВИ здравей/
CMD['/Здравейте']

драскотина не е родителско изображение. По -скоро показва Docker, че изображението не е изградено върху друго изображение. Изграден е от нулата. Командата ADD ще вземе статичния двоичен файл с име | _+_ | от текущата директория и ще го добави към основната директория на файла с изображение. Когато най -накрая стартираме контейнер на базата на това изображение, изпълнимият файл hello ще се види в самата коренова директория на | _+_ |

И накрая, редът CMD има низ /Здравейте този низ ще се изпълнява като команда на обвивка, когато се създаде контейнер от това изображение, като по този начин двоичният файл, който добавихме към нашия контейнер и отпечата съобщението, което написахме в нашето приложение.

Нека изградим образа, като извикаме docker build команда, която ще премине през съдържанието на Dockerfile и ще генерира изображението. Изпълнете следната команда в същата директория като Dockerfile и изпълнимия двоичен файл.

$docker build-маркерЗдравейте .

The - маркирай здравей flag задава името на изображението на Здравейте и точката ( . ) в края разказва docker build за да разгледате текущата директория за Dockerfile и свързаното съдържание.

Стартиране на контейнера Docker

За да проверите дали изображението, което току -що създадохме, се показва в списъка с изображения, изпълнете:

$докер изображения

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

$docker тичам здравей

Това е! Създадохте първия си минималистичен контейнер от нулата.

Други възможности

Докато създаването на изображения от нулата винаги е опция, хората често са склонни да създават изображения от други леки дистрибуции на Linux. Например изображения като alpine и busybox са наистина леки среди с по -малки библиотеки като musl вместо glibc.

Използвайки ги като родителско изображение, използвайте ОТ алпийски: най -новите би довело и до по -малки изображения. Тъй като основните изображения са с размер само 2-5 MB. Кажете ни, ако има тема, свързана с Docker, която бихте искали да разгледаме по -нататък. Можете да се свържете с нас на Twitter , Facebook или се абонирайте за нас по имейл.