docker - Используемые технологии

Thank you for reading this post, don't forget to subscribe!

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

Docker исполь­зу­ет тех­но­ло­гию namespaces для орга­ни­за­ции изо­ли­ро­ван­ных рабо­чих про­странств, кото­рые мы назы­ва­ем кон­тей­не­ра­ми. Когда мы запус­ка­ем кон­тей­нер, docker созда­ет набор про­странств имен для дан­но­го контейнера.

Это созда­ет изо­ли­ро­ван­ный уро­вень, каж­дый аспект кон­тей­не­ра запу­щен в сво­ем про­стан­стве имен, и не име­ет доступ к внеш­ней системе.

Спи­сок неко­то­рых про­странств имен, кото­рые исполь­зу­ет docker:

  • pid: для изо­ля­ции процесса;
  • net: для управ­ле­ния сете­вы­ми интерфейсами;
  • ipc: для управ­ле­ния IPC ресур­са­ми. (ICP: InterProccess Communication);
  • mnt: для управ­ле­ния точ­ка­ми монтирования;
  • utc: для изо­ли­ро­ва­ния ядра и кон­тро­ля гене­ра­ции версий(UTC: Unix timesharing system).

Docker так­же исполь­зу­ет тех­но­ло­гию cgroups или кон­троль­ные груп­пы. Ключ к рабо­те при­ло­же­ния в изо­ля­ции, предо­став­ле­ние при­ло­же­нию толь­ко тех ресур­сов, кото­рые вы хоти­те предо­ста­вить. Это гаран­ти­ру­ет, что кон­тей­не­ры будут хоро­ши­ми сосе­дя­ми. Кон­троль­ные груп­пы поз­во­ля­ют раз­де­лять доступ­ные ресур­сы желе­за и если необ­хо­ди­мо, уста­нав­ли­вать пре­де­лы и огра­ни­че­ния. Напри­мер, огра­ни­чить воз­мож­ное коли­че­ство памя­ти контейнеру.

Cgroups — это аббре­ви­а­ту­ра от Linux “control groups”. Это функ­ция ядра Linux, кото­рая изо­ли­ру­ет и кон­тро­ли­ру­ет исполь­зо­ва­ние ресур­сов для поль­зо­ва­тель­ских про­цес­сов. Её созда­ли инже­не­ры из Google в 2006 году.

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

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

Cgroups была в конеч­ном ито­ге пере­ра­бо­та­на в Linux, для добав­ле­ния функ­ции namespace isolation (изо­ля­ция про­стран­ства имён). Идея изо­ля­ции про­стран­ства имён не нова. В Linux уже было мно­го видов namespace isolation. Напри­мер, изо­ля­ция про­цес­сов, кото­рая раз­де­ля­ет каж­дый про­цесс и предот­вра­ща­ет сов­мест­ное исполь­зо­ва­ние памяти.

Cgroup обес­пе­чи­ва­ет более высо­кий уро­вень изо­ля­ции. Бла­го­да­ря cgroup, про­цес­сы из одно­го про­стран­ства имён неза­ви­си­мы от про­цес­сов из дру­гих пространств

Union File Sysem или UnionFS — это фай­ло­вая систе­ма, кото­рая рабо­та­ет созда­вая уров­ни, делая ее очень лег­ко­вес­ной и быст­рой. Docker исполь­зу­ет UnionFS для созда­ния бло­ков, из кото­рых стро­ит­ся кон­тей­нер. Docker может исполь­зо­вать несколь­ко вари­ан­тов UnionFS вклю­чая: AUFS, btrfs, vfs и DeviceMapper.

Docker соче­та­ет эти ком­по­нен­ты в оберт­ку, кото­рую мы назы­ва­ем фор­ма­том кон­тей­не­ра. Фор­мат, исполь­зу­е­мый по умол­ча­нию, назы­ва­ет­ся libcontainer. Так же docker под­дер­жи­ва­ет тра­ди­ци­он­ный фор­мат кон­тей­не­ров в Linux c помо­щью LXC. В буду­щем Docker воз­мож­но будет под­дер­жи­вать дру­гие фор­ма­ты кон­тей­не­ров. Напри­мер, инте­гри­ру­ясь с BSD Jails или Solaris Zones.