Урок за Docker: Започнете с мрежата на Docker

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

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

Има четири основни начина, по които Docker снабдява разработчиците с мрежи за контейнери. Първите две, мостови и насложени мрежи, обхващат най-често използваните случаи в производството. Другите две, хост и Macvlan мрежи, съществуват, за да покрият по-редки случаи.

Docker мрежи: Мостови мрежи

Мостовите мрежи позволяват на контейнерите, работещи на един и същ хост на Docker, да комуникират помежду си. Нов екземпляр на Docker се предлага с мостова мрежа по подразбиране с име bridgeи по подразбиране всички новосъздадени контейнери се свързват с нея.

В bridgeмрежата се доставя с много удобни настройки по подразбиране се на най-кутия, но те може да се наложи фина настройка в производството. Например bridgeавтоматично включените контейнери имат всички портове изложени един на друг, но нито един на външния свят. Това е полезно, когато трябва да тествате комуникация между контейнери, но не и за внедряване на услуга на живо.

За най-добри резултати създайте своя собствена мостова мрежа. Дефинираните от потребителя мостове имат много функции, които bridgeмостът не:

  • DNS резолюцията работи автоматично между контейнери на персонализиран мост. По този начин не е необходимо да използвате сурови IP адреси, за да комуникирате помежду им, както правите на bridgeмоста. Контейнерите могат да намират други контейнери чрез DNS, като използват името на контейнера.
  • Контейнерите могат да се добавят и премахват от персонализиран мост, докато се изпълняват.
  • Променливите на околната среда могат да се споделят между контейнери на персонализиран мост.

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

Docker мрежи: Насложени мрежи

Мостовите мрежи са за контейнери на един и същ хост. Мрежите за наслагване са за контейнери, работещи на различни хостове, като тези в рояк на Docker. Това позволява на контейнерите между хостовете да се намират и комуникират, без да се налага да се притеснявате как да настроите това за всеки отделен участващ контейнер.

Оркестраторът на роевия режим на Docker автоматично създава насложена мрежа ingress,. По подразбиране всички услуги в роя се прикрепят към ingress. Но както и по подразбиране bridge, това не е най-добрият избор за производствена система, тъй като настройките по подразбиране може да не са подходящи. Най-добре е да създадете персонализирана overlay мрежа, със или без рояк, и да прикачите възли към нея, ако е необходимо.

Ако искате да използвате наслагваща мрежа с контейнери, които не се изпълняват в рояк, това е друг случай на използване за създаване на персонализирана мрежа за наслагване. Обърнете внимание, че всеки хост на Docker в насложена мрежа трябва да има подходящите портове, отворени за връстниците си, за да се виждат, и без режим на роене всеки възел се нуждае от достъп до някакво хранилище на ключ-стойност.

Също така имайте предвид, че мрежите за наслагване по подразбиране позволяват само 256 различни IP адреса. Можете да увеличите този лимит, но Docker препоръчва вместо това да използвате множество наслагвания.

Докер мрежа: Мрежа на хост

В hostмрежа водача позволява контейнери са техните мрежови стекове работят рамо до рамо с стека на домакина. Уеб сървър на порт 80 в hostмрежов контейнер е достъпен от порт 80 на самия хост.

Най-голямото предимство на мрежовите мрежи е скоростта. Ако трябва да предоставите достъп до порт на контейнер и искате да го направите възможно най-близо до основната ОС, това е пътят. Но това идва с цената на гъвкавост: Ако присвоите порт 80 на контейнер, никой друг контейнер не може да го използва на този хост.

Docker мрежи: Macvlan мрежи

Мрежата на Macvlan е за приложения, които работят директно с основната физическа мрежа, като например приложения за наблюдение на мрежовия трафик. На macvlanводача не просто зададете IP адрес към контейнер, но физически MAC адрес, както добре.

Имайте предвид, че този тип мрежова мрежа на Docker идва с много от същите предупреждения, които бихте имали, ако, да речем, създавате виртуални MAC адреси с помощта на виртуални машини. Накратко, Macvlan трябва да бъде запазен само за приложения, които не работят, освен ако не разчитат на физически мрежов адрес.

Docker мрежи: Създаване и управление на мрежи

Цялото управление на мрежата в Docker се извършва с помощта на docker networkкомандата. Много от неговите подкоманди са подобни на други команди на Docker; например, docker network lsпоказва всички конфигурирани мрежи в текущия екземпляр на Docker:

$ docker network ls NETWORK ID NAME DRIVER SCOPE 2e0adaa0ce4a bridge bridge local 0de3da43b973 host host local 724a28c6d86d none null local

За да създадете мрежа, използвайте createподкомандата заедно с --driverфлага, за да посочите кой драйвер да използвате ( bridge, overlay, macvlan):

$ docker network create --driver bridge my-bridge 

Контейнерите, свързани с хост, не изискват създаване на мрежа за тях. Вместо това стартирайте контейнера с --network hostфлага. Всички процеси в контейнера прослушват техните предварително конфигурирани портове, така че се уверете, че те са настроени първо.

Опциите за създаване на мрежа включват също определяне на нейната подмрежа, обхват на IP адреси и мрежов шлюз, точно както би било в случай на създаване на мрежа, използваща други средства.

Контейнерите се изпълняват по подразбиране в bridgeмрежата. За да използвате определена мрежа, просто използвайте --networkфлага при стартиране на контейнера и посочете името на мрежата.

Можете също да сдвоите работещ контейнер с мрежа:

$ docker network connect bridge my_container

Това се свързва  my_containerс bridgeмрежата, като същевременно запазва всички съществуващи мрежови връзки, които вече има.

Когато даден контейнер се завърти, всички мрежи, свързани с него, остават непокътнати. Ако искате да премахнете мрежи ръчно, можете да го направите с docket network rm командата или да използвате, за docker network pruneда премахнете всички мрежи, които вече не се използват на хоста.

Докер мрежи и Kubernetes мрежи

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

Подробностите са описани в документацията на Kubernetes, но кратката версия е, че те имат коренно различни модели за начина на разпределяне и управление на мрежовите ресурси. Така че, ще трябва да разработите специфична за Kubernetes мрежова настройка за вашето приложение.

Един от възможните подходи е използването на приставка Kubernetes Container Network Interface (CNI), която работи със собствените мрежови контроли на Docker. Но това в най-добрия случай е временно решение; в един момент ще трябва да изградите своите проекти на Kubernetes, като използвате собствени мрежови метафори отвътре навън.