Създаване на минимален Docker контейнер с nginx

Създаване на минимален Docker контейнер с nginx

В предишните статии се запознахме с Docker и контейнеризиращата технология. В тях ви запознахме с основните принципи на работа на тази технология, предимствата ѝ, градивните ѝ елементи, както и защо бихме я използвали.

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

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

  • Ще свалим официалното nginx изображение локално;
  • Ще използваме прост инструмент, с чиято помощ да намалим големината на nginx изображението и да го запазим под друго име;
  • Ще напишем прост Dockerfile, който на базата на новосъздаденото изображение, ще добави статично съдържание и указания с каква команда да се стартира контейнера.

За тези, които не знаят какво е nginx

Nginx

Nginx е уеб сървър, силно фокусиран върху високата паралелност, производителност и минималното използване на памет. Също така може да се използва като proxy сървър за HTTP, HTTPS, SMTP, POP3, и IMAP протоколи, а също и като load balancer и HTTP кеш. Работи под Linux, BSD варианти, Mac OS X, Solaris, AIX, HP-UX, както и с други *nix системи. Има работеща версия и за Microsoft Windows.

Време е да минем към примера ;)

Ще започнем създаването на минимален Docker контейнер, като за база ще използваме официалното Docker изображение на nginx: https://registry.hub.docker.com/_/nginx/.

Контейнерът използва за база Debian “Jessie” и добавя всички нужни файлове за функционирането на уеб сървъра. Това излишно увеличава големината на наличния контейнер:

*docker images*

*nginx     latest    6886fb5a9b8d     13 days ago   132.8 MB

*

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

За да намалим големината на нашия nginx контейнер до минимум, ще използваме проект с отворен код, наличен в Github:

*[git clone](https://github.com/mvanholsteijn/strip-docker-image)*

*cd strip-docker-image

 *

Като за начало ще свалим nginx изображението:

*docker pull nginx*

След като е готово, можем да видим информация за него по следния начин:

*docker images nginx*

Използваме описания по-горе инструмент, за да премахнем ненужната информация от контейнера:

*       ./strip-docker-image -i nginx -t stripped-nginx \*

*                                   -x 80 \*

*                                   -p nginx \*

*                                   -f /etc/passwd \*

*                                   -f /etc/group \*

*                                   -f '/lib/*/libnss*' \*

*                                   -f /bin/ls\*

*                                   -f /bin/cat\*

*                                   -f /bin/sh\*

*                                  -f /bin/mkdir\*

*                                   -f /bin/ps\*

*                                   -f /var/run\*

*                                   -f /var/log/nginx\*

*                                   -f /var/cache/nginx*

При повторна проверка виждаме вече създадено новото изображение:

*docker images*

*stripped-nginx     latest      13a553afa8bb       5 days ago         7.302 MB

nginx             latest       6886fb5a9b8d      13 days ago         132.8 MB*

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

*       vim Dockerfile*

*       FROM stripped-nginx*

*       MAINTAINER Your Name <yourname@example.com>*

*       ADD web/ /usr/share/nginx/html/*

*       EXPOSE 80*

*       ENTRYPOINT ["/usr/sbin/nginx", "-g","daemon off;"]*

С горния Dockerfile казваме на Docker да използва предварително създадения от нас имидж stripped-nginx като база, добавяме информация за създателя на контейнера и директория web/ и файлове default.conf и nginx.conf от текущата директория към указаните пътища в нашия контейнер. След това задаваме на Docker да направи портове 80 и 443 на контейнера достъпни. Последният ред стартира nginx уеб сървъра при стартиране на контейнера.

За да има какво да визуализира нашият уеб сървър, трябва да добавим съдържание в директория web/. Тъй като за нашия пример контейнерът ни не разполага с PHP ще използваме статична уеб страница, генерирана с помощта на Hugo. Вече генерираните файлове може да изтеглите от ТУК и да разархивирате в директорията с вашия Dockerfile.

[wget ](http://drive.cmailpro.net/~p.kalchev@icn.bg/protected/pwd/63ddd591a12f4f9b9ec93bd9fd1f8a/web.tar.gz)

*tar -xf web.tar.gz*

След разархивиране директорията трябва да изглежда по следния начин:

*ls *

*       Dockerfile strip-docker-image web web.tar.gz*

След като всичко е готово може да създадем нашия контейнер през Docker:

*       docker build -t username/container .*

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

*       docker run --name web -d -p 80:80 username/container *

За да отворим вече стартирания сайт, е нужно да насочим локално чрез hosts файл IP адреса на Docker host машината (машината, на която сме стартирали контейнера) към домейн hugo.loc (за да се визуализира правилно форматирането).

*Ако и вие искате да създадете вашия пръв Docker контейнер, не се колебайте да заявите безплатно вашия Docker хостинг! *

[button url="https://www.icn.bg/bg/registrations/test-docker-now/?utmsource=Blogpost&utmmedium=button&utmcampaign=Dockerhostingorder" text-align: center" icon="icon-envelope" size="wpbbtn-large" lightbox="true" target="blank"]Заяви[/button]

Етикети: #docker-kontejneri #docker #container #kontejnerizatsiya #docker-containers #docker-primeri #web-server-nginx #kontejner