Что такое «Докер» и зачем он нужен

Допу­стим, мы хотим запу­стить интернет-магазин на гото­вой систе­ме управ­ле­ния, а если тор­гов­ля пой­дёт — запу­стить ещё несколь­ко подоб­ных мага­зи­нов. В мага­зине нам нужен дви­жок, интер­пре­та­тор PHP, систе­ма рабо­ты с БД PHPMyAdmin и FTP-сервер для рабо­ты с файлами. 

Мож­но настро­ить все эти сер­ви­сы вручную: 

  1. Уста­но­вить PHP и настро­ить его для наших задач.
  2. Уста­но­вить MySQL и PHPMyAdmin.
  3. Уста­но­вить дви­жок магазина.
  4. Свя­зать дви­жок с базой, что­бы в ней хра­ни­лись все запи­си о товарах.
  5. Уста­но­вить тему для движ­ка, что­бы мага­зин сим­па­тич­но выглядел.
  6. Допи­сать скрипт, кото­рый под­клю­чит онлайн-кассу к наше­му магазину.
  7. Уста­но­вить и настро­ить FTP-сервер для досту­па к файлам.

Что такое «Докер» и зачем он нужен Все систе­мы жёст­ко свя­за­ны и зави­сят от общих настро­ек сервера 

В резуль­та­те мы всё сде­ла­ем как нуж­но, но потра­тим на это мно­го вре­ме­ни. Если через месяц нам нуж­но будет запу­стить ещё три таких же мага­зи­на, то при­дёт­ся делать всё то же самое, но уже на дру­гих сер­ве­рах. Кажет­ся, что это мож­но пору­чить машине.

Руч­ная уста­нов­ка все­го на сер­вер — это как при­го­то­вить пиц­цу дома пол­но­стью само­му: заме­сить тесто, купить и наре­зать ово­щи и кол­ба­су и так далее. В резуль­та­те мы полу­чим вкус­ное блю­до, но потра­тим на при­го­тов­ле­ние мно­го времени.

Docker – автоматизация рутинной работы

Если мы зара­нее зна­ем, что неко­то­рые наши дей­ствия могут повто­рять­ся, то иде­аль­ным выхо­дом из ситу­а­ции будет авто­ма­ти­за­ция. Мы зара­нее про­пи­сы­ва­ем все дей­ствия в виде скрип­та, а потом про­сто запус­ка­ем этот скрипт. Похо­же на рецепт пиццы. 

По такой тех­но­ло­гии рабо­та­ет Docker — про­грам­ма, кото­рая поз­во­ля­ет запус­кать подоб­ные скрип­ты и соби­рать раз­ный софт в одно целое. Прин­цип дей­ствия Доке­ра такой:

  1. Есть набор раз­лич­ных про­грамм, кото­рые нуж­но уста­но­вить, настро­ить и запустить.
  2. Для это­го набо­ра про­грамм пишет­ся скрипт, в кото­ром напи­са­но, какую про­грам­му в какой после­до­ва­тель­но­сти нуж­но ста­вить и как настра­и­вать. Зада­ча Доке­ра — выпол­нить эти инструк­ции и запу­стить про­грам­мы как нужно. 
  3. Для каж­дой про­грам­мы Докер созда­ёт вир­ту­аль­ную маши­ну, в кото­рой рабо­та­ет эта про­грам­ма. Если в скрип­те будет 5 про­грамм, Докер сде­ла­ет 5 вир­ту­аль­ных машин и объ­еди­нит их в одну вир­ту­аль­ную сеть.
  4. Эта вир­ту­аль­ная сеть со сто­ро­ны выгля­дит как еди­ное целое и назы­ва­ет­ся докер-контейнером. 

Полу­ча­ет­ся, что если мы один раз напи­шем такой скрипт, в кото­ром будут учте­ны все наши тре­бо­ва­ния к интернет-магазину, то в сле­ду­ю­щий раз мы можем про­сто запу­стить этот скрипт через Докер. Он заве­дёт весь нуж­ный софт в память и будет испол­нять с нуж­ны­ми настройками. 

Докер — это как гото­вая замо­ро­жен­ная полу­фаб­ри­кат­ная пиц­ца. В ней уже всё гото­во и наре­за­но как нуж­но, нам оста­ёт­ся толь­ко разо­греть пиц­цу в мик­ро­вол­нов­ке. В ито­ге у нас тоже будет вкус­ная пиц­ца, но вре­ме­ни мы потра­тим намно­го мень­ше, чем при пол­но­цен­ной готовке.

Пример скрипта

Вот при­мер из реаль­ной жиз­ни: для тести­ро­ва­ния новых тем ворд­прес­са его нуж­но мно­го раз ста­вить, ска­чи­вать и уста­нав­ли­вать тему, а затем смот­реть, что нуж­но попра­вить или доба­вить. Что­бы не делать всё с нуля, про­грам­мист пишет скрипт — docker-compose.yml, в кото­ром уже всё предусмотрено:

Что такое «Докер» и зачем он нужен

В этом скрип­те напи­са­но, что у нас в кон­тей­не­ре исполь­зу­ют­ся два докер-файла: wordpress и mysql. Стро­ка image отве­ча­ет за то, отку­да докер возь­мёт обра­зы докер-файлов для уста­нов­ки. Их мож­но брать отку­да угод­но — с локаль­ной маши­ны, офи­ци­аль­но­го репо­зи­то­рия или из любо­го дру­го­го места в интер­не­те. Как толь­ко докер дохо­дит до такой строч­ки, он дела­ет так:

  1. Нахо­дит нуж­ный докер-файл.
  2. Смот­рит, какая опе­ра­ци­он­ная систе­ма в нём прописана.
  3. Запус­ка­ет внут­ри себя вир­ту­аль­ный образ этой системы.
  4. Уста­нав­ли­ва­ет в эту вир­ту­аль­ную систе­му нуж­ный софт, кото­рый про­пи­сан в докер-файле.
  5. Смот­рит, что напи­са­но даль­ше в скрип­те, и меня­ет настрой­ки вир­ту­аль­ной систе­мы или соф­та внут­ри неё.

И так докер дела­ет для каж­до­го докер-файла, кото­рый най­дёт внут­ри скрип­та. В резуль­та­те мы полу­чим две вир­ту­аль­ные систе­мы: внут­ри одной кру­тит­ся ворд­пресс, а внут­ри дру­гой — база дан­ных. Так как в скрип­те мы сра­зу напи­са­ли нуж­ные настрой­ки, то эти две про­грам­мы зна­ют, как общать­ся друг с дру­гом: у ворд­прес­са есть логин и пароль от базы дан­ных. Полу­чи­лась такая вир­ту­аль­ная сеть из вир­ту­аль­ных машин, кото­рая назы­ва­ет­ся контейнер.

Что­бы полу­чить доступ к ворд­прес­су, в скрип­те есть такая строч­ка: ports: - 8888:80. Она озна­ча­ет, что все запро­сы на локаль­ный порт 80 будут пере­на­прав­ле­ны в эту вир­ту­аль­ную сеть в наш ворд­пресс. Если мы в адрес­ной стро­ке бра­у­зе­ра вве­дём http://localhost:80, то сра­зу уви­дим интер­фейс уста­нов­ки вордпресса.

На кар­тин­ке это мож­но пред­ста­вить так:

Что такое «Докер» и зачем он нужен Все про­грам­мы рабо­та­ют в сво­их вир­ту­аль­ных систе­мах и не зави­сят друг от дру­га, а свя­за­ны толь­ко настрой­ка­ми скрипта 

В при­ме­ре с нашей замо­ро­жен­ной пиц­цей докер-файлы — это начин­ка: кол­ба­са, ана­на­сы, сыр, томат­ная пас­та и спе­ции. Каж­дый такой докер-файл гото­вит­ся для пиц­цы отдель­но и не зави­сит от дру­гих. А докер-скрипт — это рецепт при­го­тов­ле­ния всей пиц­цы из этих ком­по­нен­тов. Он отве­ча­ет за то, что­бы все про­дук­ты были в нуж­ном коли­че­стве и в нуж­ном месте.

Что такое докер-файл

Докер-файл — это тоже скрипт, но немно­го с дру­гой зада­чей. Зада­ча докер-файла такая:

  1. Ска­зать, какая опе­ра­ци­он­ная систе­ма будет вир­ту­аль­но запус­кать­ся при запуске.
  2. Уста­но­вить и настро­ить какую-то про­грам­му в этой опе­ра­ци­он­ной системе.

Напри­мер, один докер-файл может отве­чать за ворд­пресс, и тогда в нём будут про­пи­са­ны все коман­ды для про­стой уста­нов­ки движ­ка. Дру­гой докер-файл может отве­чать за рабо­ту базы дан­ных MySQL, и тогда в нём будет напи­са­но как её уста­но­вить и какие ресур­сы выделить.

Что такое «Докер» и зачем он нужен При­мер докер-файла, кото­рый отве­ча­ет за запуск вир­ту­аль­но­го вордпресса 

👉 Докер-файл гово­рит, какую выбрать опе­ра­ци­он­ную систе­му и как в ней уста­но­вить нуж­ный софт. Скрипт docker-compose.yml гово­рит, как меж­ду собой подру­жить несколь­ко докер-файлов, что­бы они рабо­та­ли как еди­ное целое.

Что такое «Докер» и зачем он нужен

Как запускать

Если у нас есть скрипт и нуж­ные докер-файлы, то тогда запу­стить ворд­пресс на сер­ве­ре — это зада­ча на три мину­ты (коман­ды для линукса):

  1. Уста­но­вить докер на сер­ве­ре: sudo apt install -y docker-ce.
  2. Зака­чать туда нуж­ные скрип­ты и файлы.
  3. Запу­стить скрипт docker-compose.yml: docker compose up -d.

После это­го на нашем сер­ве­ре будет рабо­тать свой Докер, кото­рый запу­стит вир­ту­аль­ный кон­тей­нер с нашей сбор­кой. Для все­го интер­не­та это будет выгля­деть так, как буд­то мы на самом деле раз­вер­ну­ли это на сер­ве­ре, но на самом деле это всё рабо­та­ет внут­ри вир­ту­аль­ной машины.

Это так же быст­ро, как разо­греть замо­ро­жен­ную пиц­цу: мы про­сто ста­вим её в любую под­хо­дя­щую мик­ро­вол­нов­ку и сра­зу полу­ча­ем гото­вый обед.

А для чего всё это?

Эко­но­мия вре­ме­ни при раз­ра­бот­ке — не глав­ное, хотя Докер дей­стви­тель­но силь­но упро­ща­ет жизнь программистам. 

Основ­ная зада­ча этой тех­но­ло­гии — воз­мож­ность мас­шта­би­ро­ва­ния и запус­ка десят­ков и сотен кон­тей­не­ров одно­вре­мен­но, что­бы спра­вить­ся с нагруз­кой на сайт или сер­вис. Напри­мер, мож­но запу­стить одно­вре­мен­но несколь­ко кон­тей­не­ров с базой дан­ных, если запро­сов к базе ста­нет слиш­ком много.

Текст и картинки:

Миха­ил Полянин

Редак­ту­ра:

Мак­сим Ильяхов

Худож­ник:

Даня Бер­ков­ский

Кор­рек­тор:

Ири­на Михеева

Вёрст­ка:

Мария Дро­но­ва

Соц­се­ти:

Олег Веш­кур­цев