Разлика между изображенията на Docker и контейнерите

1. Общ преглед

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

Когато започнем да използваме Docker, има две основни концепции, с които трябва да сме ясни - изображения и контейнери .

В този урок ще научим какви са те и как се различават.

2. Изображения на Docker

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

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

Да кажем, че искаме да създадем образ на Docker на приложение Java Hello World. Първото нещо, за което трябва да помислим, е от какво се нуждае нашето приложение.

За начало това е Java приложение, така че ще ни трябва JVM. Добре, това изглежда лесно, но какво трябва да работи JVM? Нуждае се от операционна система. Следователно, нашият образ на Docker ще има слой с операционна система, JVM и нашето приложение Hello World .

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

Да приемем, че искаме да създадем база данни, като използваме базата данни PostgreSQL. Не е нужно да създаваме нов образ на PostgreSQL от нулата. Просто отиваме в Docker Hub, търсим postgres , което е официалното име на Docker за PostgresSQL, избираме версията, от която се нуждаем, и я стартираме.

Всяко изображение, което създаваме или извличаме от Docker Hub, се съхранява в нашата файлова система и се идентифицира с неговото име и етикет. Той може да бъде идентифициран и по неговия идентификатор на изображението .

Използвайки командата docker images , можем да видим списък с изображения, които имаме в нашата файлова система:

$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE postgres 11.6 d3d96b1e5d48 4 weeks ago 332MB mongo latest 9979235fc504 6 weeks ago 364MB rabbitmq 3-management 44c4867e4a8b 8 weeks ago 180MB mysql 8.0.18 d435eee2caa5 2 months ago 456MB jboss/wildfly 18.0.1.Final bfc71fe5d7d1 2 months ago 757MB flyway/flyway 6.0.8 0c11020ffd69 3 months ago 247MB java 8-jre e44d62cf8862 3 years ago 311MB

3. Стартиране на Docker Images

Изображението се изпълнява с помощта на командата за изпълнение на докер с името и маркера на изображението. Да предположим, че искаме да стартираме изображението postgres 11.6:

docker run -d postgres:11.6

Забележете, че предоставихме опцията -d . Това казва на Docker да стартира изображението във фонов режим - известен също като отделен режим.

С помощта на командата docker ps можем да проверим дали изображението ни работи, трябва да използваме тази команда:

$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3376143f0991 postgres:11.6 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 5432/tcp tender_heyrovsky

Забележете ИДЕНТА НА КОНТЕЙНЪРА в изхода по-горе. Нека да разгледаме какво представлява контейнерът и как е свързан с изображение.

4. Докер контейнери

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

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

Сега нека да мислят отново за серия командата видяхме по-горе. Казахме, че се използва за стартиране на изображения, но това не е напълно точно. Истината е, че командата run се използва за създаване и стартиране на нов контейнер на изображението.

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

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

5. Жизнен цикъл на контейнерите

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

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

docker container create : docker container start 

Или ние можем лесно да го направите с бягане команда:

docker run :

Можем да поставим на пауза работещ контейнер и след това да го поставим отново в работещо състояние:

docker pause  docker unpause 

Поставеният на пауза контейнер ще показва „На пауза“ като състояние, когато проверяваме процесите:

$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9bef2edcad7b postgres:11.6 "docker-entrypoint.s…" 5 minutes ago Up 4 minutes (Paused) 5432/tcp tender_heyrovsky

Също така можем да спрем работещ контейнер и след това да го повторим:

docker stop  docker start 

И накрая, можем да премахнем контейнер:

docker container rm 

Само контейнери в спряно или създадено състояние могат да бъдат премахнати.

За повече информация относно командите на Docker, можем да се обърнем към справка за командния ред на Docker.

6. Заключение

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

Също така говорихме за жизнения цикъл на контейнерите и научихме основните команди за управлението им.

След като вече знаем основите, е време да научим повече за вълнуващия свят на Docker и да започнем да увеличаваме знанията си!