Tworzenie obrazu dockera od podstaw

Creating Docker Image From Scratch



Główną zaletą Dockera nad jakąkolwiek inną technologią konteneryzacji jest to, że Docker jest skierowany do programistów i ich aplikacji upstack. Podczas gdy odpowiednie technologie konteneryzacji takie jak LXC , Strefy oraz Więzienia są ukierunkowane z perspektywy operacyjnej, lub mówiąc prościej, platformy te są substytutem maszyn wirtualnych działających w chmurze. Gdzie jak, Docker jest substytutem pakietów i wykonywalnych plików binarnych.

Krótko mówiąc, Docker staje się coraz bardziej uniwersalnym menedżerem pakietów, który działa na wszystkich możliwych platformach Linux. Zabiera kontenery i wykorzystuje je do rozwiązania zupełnie innego problemu, z którym borykają się programiści. Problem polega na tym, że programiści używają swojego systemu operacyjnego dla komputerów stacjonarnych (takiego jak Windows, macOS lub Linux z mnóstwem pakietów związanych z komputerami stacjonarnymi) do pisania aplikacji. Aplikacja, którą piszą, często działa na zupełnie innym systemie operacyjnym na serwerze, gdzieś z jakąś dystrybucją Linuksa zupełnie inną niż laptop programisty.







W przypadku Dockera chodzi o to, aby Twoja aplikacja była spakowana jako obraz Dockera. Zadaniem Dockera jest wykonanie tego obrazu i uruchomienie go jako aplikacji kontenerowej. Konteneryzacja oznacza, że ​​aplikacja i jej zależności będą działać w odizolowanym środowisku, które może całkowicie różnić się od laptopa programisty, a nawet serwera produkcyjnego. Dopóki oba obsługują platformę Docker, oba mogą uruchamiać tę samą aplikację w dokładnie ten sam sposób.



Anatomia obrazu Docker

Jak wspomniano wcześniej, aplikacja Docker będzie działać w uzgodnionym środowisku. Teraz pytanie brzmi, jak tworzymy to środowisko? Większość obrazów aplikacji zaimportuje obraz bazowy platformy Docker i zbuduje na nim swoją aplikację.



Aplikacje są tworzone z warstw oprogramowania. Obraz kontenera wordpress jest budowany przy użyciu obrazu kontenera httpd, który z kolei jest budowany na obrazie Ubuntu. Obraz, na podstawie którego budowany jest nowszy obraz, jest nazywany OBRAZEM RODZICIELSKIM w terminologii platformy Docker. W Dockerfile (nieco później dowiemy się, co oznacza plik Dockerfile), ten obraz nadrzędny jest wymieniony na górze pliku, jak pokazano poniżej:





OD Ubuntu: 18,04
## Reszta pliku Docker

Ten plik Docker po uruchomieniu konwertuje aplikację na obraz Docker (plik binarny rodzaju), który można następnie przesłać do rejestru, skąd można go pobrać w celu utworzenia nowych kontenerów w innym miejscu. Jednak wszyscy będą mieli Ubuntu: 18.04 jako obraz bazowy i będą działać tak, jakby był to system Ubuntu, w którym działają.

Być może zauważyłeś to, próbując pobrać nowy obraz okna dokowanego.



Tworzenie obrazu Dockera od podstaw

Pokazuje to, ile warstw jest ściąganych przed wprowadzeniem rzeczywistej aplikacji (która może mieć tylko kilka megabajtów).

Z tego powodu chcielibyśmy stworzyć tak zwany obraz bazowy. Który nie jest zbudowany na niczym innym. Słowo kluczowe scratch służy do wskazania, że ​​ta warstwa nie jest zbudowana na niczym innym. Tak jak:

Od zera
## Reszta pliku Dcokerfile

Najpierw utworzymy prostą aplikację hello-world, a następnie ustalimy, jaka będzie reszta pliku Dockerfile. Systemem hosta jest Ubuntu:18.04 LTS, a w eksperymencie używamy Dockera w wersji 17.12.1-ce.

Tworzenie statycznego pliku binarnego

Kontenery platformy Docker to zbiór procesów działających w izolacji od reszty systemu operacyjnego. Jedyną rzeczą, z którą ten proces ma kontakt, jest jądro. Kernel jest odpowiedzialny za planowanie tych procesów na procesorze, zarządzanie pamięcią i kilka innych podstawowych zadań związanych z utrzymaniem rezerwacji.

Jednak większość aplikacji wysokiego poziomu zależy od wielu bibliotek systemowych (takich jak glibc, musl, klibc itp. ) i wiele zależności wykonawczych, takich jak Python, Node.js lub Java Runtime. Plik binarny aplikacji nie zawiera wszystkich dostępnych bibliotek, ale kiedy rozpoczyna wykonywanie, wywołuje te biblioteki z systemu operacyjnego hosta.

Ponieważ staramy się stworzyć obraz od zera, nie otrzymalibyśmy tych subtelności. Dlatego nasza aplikacja musi być plikiem statycznym lub samodzielnym plikiem wykonywalnym.

Zacznijmy od utworzenia folderu o nazwie MyDockerImage i utworzenia w nim pliku hello.cc.

$mkdirMój obraz Docker
$Płyta CDMój obraz Docker
$dotykaćwitam.cc

Otwórz hello.cc za pomocą ulubionego edytora tekstu i dodaj do niego następujące wiersze.

#włączać
przy użyciu standardowej przestrzeni nazw;
intGłówny(){
koszt<< 'Dzień dobry! Ta wiadomość pochodzi z kontenera ';
powrót 0;

}

Jest to prosty program w C++, który wypisuje Hello! Ta wiadomość …

Z powodów omówionych wcześniej skompilujemy to za pomocą flagi statycznej. Używany kompilator to g++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0.

Aby skompilować program, w tym samym katalogu uruchom następującą komendę:

$ g++ -o cześć-statycznydzień dobry.DC

Spowoduje to utworzenie binarnego pliku wykonywalnego hello w tym samym katalogu. To nasz plik statyczny. Sprawdź, czy działa zgodnie z przeznaczeniem, podając nazwę pliku w terminalu.

$./dzień dobry

Teraz jesteśmy gotowi do konteneryzacji tego prostego programu.

Plik dockera

Plik Dockerfile składa się z zestawu reguł, które pobierają pliki aplikacji (takie jak pliki binarne, pliki źródłowe itp.) wraz z różnymi parametrami konfiguracyjnymi, takimi jak układ systemu plików, wyeksponowane porty itp. i zamieniają je w plik obrazu Docker. Następnie możesz udostępnić plik obrazu każdemu, kto chce uruchomić tę aplikację.

Nie będziemy zagłębiać się w każdą opcję dostępną dla Dockerfile, zamiast tego napiszemy bardzo minimalistyczny plik Dockerfile. W tym samym katalogu, w którym znajduje się twój plik wykonywalny hello, utwórz pusty plik o nazwie Plik dockera.

$dotykaćPlik dockera

Otwórz go za pomocą ulubionego edytora tekstu i napisz do niego następujące wiersze:

Od zera
DODAJ cześć/
CMD['/dzień dobry']

zadrapanie nie jest obrazem nadrzędnym. Raczej wskazuje Dockerowi, że obraz nie jest zbudowany na żadnym innym obrazie. Jest zbudowany od podstaw. Polecenie ADD pobierze statyczny plik binarny o nazwie |_+_|z bieżącego katalogu i doda go do katalogu głównego pliku obrazu. Kiedy w końcu uruchomimy kontener oparty na tym obrazie, plik wykonywalny hello będzie widoczny w samym katalogu głównym pod adresem |_+_|

Wreszcie linia CMD ma ciąg /dzień dobry ten ciąg zostanie wykonany jako polecenie powłoki za każdym razem, gdy kontener zostanie utworzony z tego obrazu, a więc plik binarny, który dodaliśmy do naszego kontenera i wydrukujemy wiadomość, którą napisaliśmy w naszej aplikacji.

Zbudujmy obraz, wywołując kompilacja dokera polecenie, które przejdzie przez zawartość pliku Dockerfile i wygeneruje obraz. Uruchom następujące polecenie w tym samym katalogu, co plik Dockerfile i wykonywalny plik binarny.

$kompilacja dokera--etykietkadzień dobry .

ten –otaguj cześć flaga ustawia nazwę obrazu na dzień dobry i kropka ( . ) na koniec mówi kompilacja dokera aby zajrzeć do bieżącego katalogu dla pliku Dockerfile i powiązanej zawartości.

Uruchamianie kontenera Docker

Aby sprawdzić, czy właśnie utworzony obraz pojawia się na liście obrazów, uruchom:

$obrazy dokowane

Zwróć uwagę, jak mały jest obraz powitania w porównaniu z innymi obrazami. W każdym razie jest gotowy do uruchomienia jako kontener,

$Docker uruchom cześć

Otóż ​​to! Stworzyłeś swój pierwszy minimalistyczny pojemnik od podstaw.

Inne opcje

Chociaż tworzenie obrazów od podstaw jest zawsze opcją, ludzie często tworzą obrazy z innych lekkich dystrybucji Linuksa. Na przykład obrazy takie jak alpine i busybox są naprawdę lekkimi środowiskami z mniejszymi bibliotekami, takimi jak musl zamiast glibc.

Używanie ich jako obrazu rodzica za pomocą Z alpejski: najnowszy spowoduje również mniejsze obrazy. Ponieważ obrazy bazowe mają rozmiar tylko 2-5 MB. Daj nam znać, jeśli jest jakiś temat związany z Dockerem, który możesz chcieć, abyśmy omówili w następnej kolejności. Możesz się z nami skontaktować Świergot , Facebook lub zapisz się do nas przez e-mail .