Tworzenie obrazu Dockera od zera

Tworzenie obrazu Dockera od zera
Główną zaletą Dockera nad każdą inną technologią kontenerów jest to, że Docker ma na celu deweloperów i ich aplikacje w górę. Podczas gdy odpowiednie technologie kontenerów, takie jak LXC, strefy i więzienia są skierowane z perspektywy operacyjnej lub, mówiąc prosto, platformy te są substytutem wirtualnych maszyn działających w chmurze. Gdzie jako Docker zastępuje pakiety i pliki binarne wykonywalne.

Luźno mówiąc, Docker coraz bardziej przypomina uniwersalny menedżer pakietów, który działa na wszystkich możliwych platformach Linux. Potrzeba kontenerów i używa ich do rozwiązania zupełnie innego problemu, z którym napotykają się programiści. Problem polega na tym, że programiści używają swojego systemu operacyjnego stacjonarnego (takiego jak system Windows, MacOS lub Linux z toną pakietów związanych z pulpitem) do pisania aplikacji. Aplikacja, którą piszą, często działa na zupełnie innym systemie operacyjnym na serwerze gdzieś z pewną dystrybucją Linux zupełnie inną niż laptop programisty.

Z Docker jest pomysł, że Twoja aplikacja jest zapakowana jako obraz Docker. Zadaniem Dockera jest wykonanie tego obrazu i uruchomienie go jako kontenerowanej aplikacji dla Ciebie. Bycie kontenerowanym 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. Tak długo, jak oboje wspierają Dockera, oboje mogą uruchomić tę samą aplikację w ten sam sposób.

Anatomia obrazu dokera

Jak wspomniano wcześniej, aplikacja Docker będzie działać na uzgodnionym środowisku. Teraz pytanie brzmi: w jaki sposób tworzymy to środowisko? Większość obrazów aplikacji zaimporkowałaby obraz bazowy Dockera i zbudowałby ich aplikację.

Aplikacje są wykonane z warstw oprogramowania. Obraz pojemnika WordPress jest zbudowany za pomocą obrazu kontenera HTTPD, który z kolei jest zbudowany na obrazie Ubuntu. Obraz, na którym budowany jest nowszy obraz, jest znany jako obraz nadrzędny w Docker Terminology. W DockerFile (nieco później przejdziemy do tego, co oznacza Dockerfile), ten obraz nadrzędny jest wspomniany na górze pliku, jak pokazano poniżej:

Z Ubuntu: 18.04
## reszta pliku dokera

Ten plik dokujący po wykonaniu przekształca aplikację w obraz Docker (binarny), który możesz następnie popchnąć do rejestru, z którego można go wyciągnąć, aby stworzyć nowe kontenery gdzie indziej. Jednak wszyscy będą mieli Ubuntu: 18.04 jako obraz podstawowy i działaj tak, jakby był to system Ubuntu, w którym działają.

Być może zauważyłeś to, próbując wyciągnąć nowy obraz Docker.

To pokazuje, ile warstw jest pobieranych przed faktyczną aplikacją (która może mieć tylko kilka megabajtów).

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

Od zera
## reszta DCokerFile

Najpierw utworzymy prostą aplikację Hello-World, a następnie dowiemy się, jaka będzie reszta pliku dokera. System hosta to Ubuntu: 18.04 LTS i używamy Docker wersja 17.12.1-ce do eksperymentu.

Tworzenie statycznego binarnego

Kontenery Docker to zbiór procesów działających od izolacji od reszty systemu operacyjnego. Jedyną rzeczą, z którą proces jest w kontakcie, jest jądro. Kernel jest odpowiedzialny za planowanie tych procesów na procesor, zarządzanie pamięcią i kilka innych podstawowych zadań Keeping.

Ale większość aplikacji na wysokim poziomie zależy od wielu bibliotek systemowych (takich jak GLIBC, MUSL, KLIBC itp) i wiele zależności od środowiska wykonawczego, takich jak Python lub Węzeł.JS lub Java Runtime. Binarny aplikacji nie ma w sobie wszystkich dostępnych bibliotek, ale po rozpoczęciu wykonywania wywołuje te biblioteki z systemu operacyjnego hosta.

Ponieważ staramy się stworzyć obraz od zera, nie otrzymalibyśmy tych subtelności. Więc nasza aplikacja musi być plik statyczny lub samodzielny wykonywalny.

Zacznijmy od utworzenia folderu o nazwie MyDockerImage i utworzenia pliku Hello.CC w nim.

$ mkdir mydockerimage
$ CD MyDockerImage
$ Touch Hello.CC

Otwórz Hello.CC za pomocą ulubionego edytora tekstu i dodaj następujące wiersze w środku.

#włączać
za pomocą przestrzeni nazw Std;
int main ()
Cout << "Hello! This message is coming from a container \n ";
powrót 0;

To jest prosty program C ++, który drukuje „Hello! Ta wiadomość… "

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

Aby skompilować program, w tym samym katalogu Uruchom następujące polecenie:

$ g ++ -o hello -static hello.CC

To tworzy plik wykonywalny wykonywalny „Hello” w tym samym katalogu. To nasz plik statyczny. Przetestuj, czy działa zgodnie z zamierzeniami, wspominając nazwę pliku w terminalu.

$ ./Witam

Teraz jesteśmy gotowi do kontenerowania tego prostego programu.

Dockerfile

DockerFile składa się z zestawu reguł, które przyjmują pliki aplikacji (takie jak binarie, pliki źródłowe itp.) Wraz z różnymi parametrami konfiguracyjnymi, takimi jak układ systemu plików, porty narażone itp. I zamienia je w plik obrazu Docker. Następnie możesz udostępnić plik obrazu każdemu, kto chce uruchomić tę aplikację.

Nie będziemy kopać w każdą opcję dostępną dla DockerFile, zamiast tego napiszemy bardzo minimalistyczny plik dokujący. W tym samym katalogu, w którym przebywa Twój Hello Exchutable, utwórz pusty plik o nazwie Dockerfile.

$ Touch Dockerfile

Otwórz go ze swoim ulubionym edytorem tekstu i napisz do niego następujące wiersze:

Od zera
Dodaj Hello /
Cmd ["/hello"]

zadrapanie nie jest obrazem nadrzędnym. Raczej wskazuje Dockera, że ​​obraz nie jest zbudowany na żadnym innym obrazie. Jest zbudowany od zera. Dodaj polecenie wzięłoby statyczny binarny nazwany WitamZ bieżącego katalogu i dodaj go do katalogu głównego pliku obrazu. Kiedy w końcu uruchomiliśmy kontener na podstawie tego obrazu, Hello Eklegalność będzie widoczna w samym katalogu głównym pod adresem /Witam.

Wreszcie linia CMD ma ciąg "/Witam" Ten ciąg zostanie wykonany jako polecenie powłoki za każdym razem, gdy pojemnik zostanie utworzony z tego obrazu, a zatem plik binarny, który dodaliśmy do naszego kontenera i wydrukuj wiadomość, którą napisaliśmy w naszej aplikacji.

Zbudujmy obraz, wywołując Docker Build polecenie, które przechodzi przez zawartość DockerFile i wygenerował obraz. Uruchom następujące polecenie w tym samym katalogu, co DockerFile i wykonywalny binarny.

$ Docker Build -Tag Hello .

-Tag Hello flaga ustawia nazwę obrazu na Witam i kropka ( ".”) Na koniec mówi Docker Build Aby spojrzeć na obecny katalog dla DockerFile i powiązanych treści.

Uruchamianie kontenera Docker

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

$ Docker Images

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

$ Docker Run Hello

Otóż ​​to! Utworzyłeś od zera swojego pierwszego minimalistycznego pojemnika.

Inne opcje

Podczas tworzenia 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 to naprawdę lekkie środowiska z mniejszymi bibliotekami, takimi jak MUSL zamiast GLIBC.

Używanie ich jako obrazu nadrzędnego za pomocą używania „From Alpine: najnowszy” spowodowałby również mniejsze obrazy. Ponieważ obrazy podstawowe mają rozmiar tylko 2-5 MB. Daj nam znać, czy istnieje jakikolwiek temat związany z Docker, który możesz chcieć, abyśmy opisali następne. Możesz skontaktować się z nami na Twitterze, Facebooku lub subskrybować nas za pośrednictwem poczty e -mail.