Docker: Лесен като изграждане, изпълнение, готово!

Напоследък Docker много шуми и с добра причина. Услугата за контейнеризиране прави внедряването на микроуслуги лесно и стабилно, тъй като всяка услуга може да изпълнява ОС в собствена виртуална среда. Това означава пълна съвместимост ... няма повече притеснения относно версиите на ОС, зависимостите и разликите между вашите разработващи и производствени машини! В допълнение, той е лек, така че можете да стартирате множество контейнери на Docker в една и съща машина (екземпляр EC2). Днес ще научим как да настроите и разположите Docker на Amazon EC2 в 3 лесни стъпки!

Преди да започнем, разгледайте тази диаграма на високо ниво (с любезното съдействие на infoworld.com).

От лявата страна е вашата традиционна настройка на виртуална машина с помощта на хипервизор. Хипервизорът е просто вашият VM мениджър, отговорен за разпределението на хардуерни ресурси към всяка виртуална операционна система. Ако всяка гост OS се нуждае от 1 GB памет и хостът използва 1 GB памет, тогава настройката вляво ще изисква общо 4 GB.

От дясната страна има настройка на контейнер, която ще стартира механизъм за контейнери като Docker. Най-съществената разлика е, че двигателят на контейнера е по-лек, защото може да споделя определени хардуерни ресурси със своята хост ОС, за разлика от традиционните виртуални машини, които изискват собствено отделно разпределение. Тази настройка изисква 1GB за хост операционната система и може би 600MB на контейнер (тъй като 300MB хипотетично се споделя с хост операционната система), за общо 2.8GB необходими. Виждате ли тези предимства? Готино, сега можем да започнем!

Приготвяме се да започнем

Въведете вашия EC2 екземпляр и клонирайте Kangzeroos-ES6-React-Redux-Boilerplate от Github. Кодът, който виждате, ще бъде за настройване на това уеб приложение, но стъпките са еднакви за всеки проект. След като го изтеглите, отидете в папката и намерете файловете по-долу. Това са файловете, които ще използваме с Docker.

Dockerfile build.sh run.sh

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

$ sudo apt-get update $ sudo apt-get install docker-engine $ sudo service docker start $ sudo docker run hello-world

Последната команда проверява дали Docker работи успешно и след това излиза. Ако всичко това работи, вие сте готови да започнете Dockerizing!

Стъпка 1: Изграждане на Dockerfile

Първата стъпка е да конфигурирате файловете, необходими на Docker, за да си изгради изображение. Docker Images са просто чертежи на среди, които искате да създадете, докато контейнерите са действителните работещи и функционални среди, в които ще бъде изпълнено вашето приложение. В корена на нашата директория с приложения има папка, наречена App. Самото уеб приложение се намира в тази Appпапка, докато всички неща, свързани с Docker, са навън. Това е необходимо, тъй като Docker ще контейнерира всичко вътре App. Така че нека направим първия файл на Docker, наречен Dockerfile(без разширение на файла Dockerfile.sh, просто Dockerfile) и да преминем през него ред по ред.

FROM ubuntu # ubuntu setup RUN apt-get update -y RUN apt-get upgrade -y RUN apt-get install nodejs -y && apt-get install npm -y # install curl for n RUN apt-get install curl -y RUN apt-get install vim -y # obtain latest stable version of node RUN npm cache clean -f RUN npm install -g n RUN n stable # setup working directory # ADD /App /App WORKDIR /App RUN npm install # expose port EXPOSE 8080

Първият ред е FROM ubuntu. Целта на Dockerfileе да настрои операционната система и програмите в нея, така че има смисъл първият ред да посочи коя версия на операционната система да се използва. ubuntuтук се има предвид конкретно изображение, хоствано в Docker Hub, по-специално официалното изображение на OS Ubuntu.

# ubuntu setup RUN apt-get update -y RUN apt-get upgrade -y RUN apt-get install curl -y RUN apt-get install vim -y

Следващият набор от редове е настройка в Ubuntu. Искаме да проверим за актуализации на Ubuntu с RUN apt-get update -yи надстройки с RUN apt-get upgrade -y... доста стандартни неща за настройка на вашата среда. Също така инсталирайте curl RUN apt-get install curl -yи vim RUN apt-get install vim -y, които е хубаво да имате за общи цели.

# obtain latest stable version of node RUN apt-get install nodejs -y && apt-get install npm -y RUN npm cache clean -f RUN npm install -g n RUN n stable

Следващият набор от редове е настройка, специфична за NodeJS. Тъй като искаме да използваме ES6 функции, ще ни трябва най-новата версия на NodeJS, постигната чрез модула на възела n. Инсталирайте NodeJS и NPM с RUN apt-get install nodejs -y && apt-get install npm -y. След това почистете npm, за да направите място за nизползване RUN npm cache clean -f. Инсталирайте nс RUN npm install -g n. И накрая, можем да стартираме n(най-новата версия на NodeJS) с RUN n stable.

NodeJS е за Javascript, но ако работите с други езици като Python, бихте инсталирали каквито и програми да са ви необходими, за да стартирате приложението си Python.

# setup working directory ADD /App /App WORKDIR /App RUN npm install # expose port EXPOSE 8080

Последната част от Dockerfileе да настроите работната директория на самото приложение. ADD /App /Appвзема Appпапката от нашата машина и я копира в контейнера на Docker. След това WORKDIR /Appзадава работната директория на Docker, /Appтака че да се изпълняват всички команди, които изпълнявате в Docker /App. Това е необходимо, за npm installда се инсталира на правилното място (известен още /Appкато контейнера на Docker).

И накрая, ние, RUN npm installкойто инсталира нашите NodeJS зависимости в нашата машина. И накрая, изрично ще изложим порт 8080 на нашия образ на Docker, EXPOSE 8080така че външният свят да има достъп до нашето приложение. Външният свят включва интернет, както и други контейнери на Docker, работещи на същата машина.

Стъпка 2: Скриптът за изграждане

docker build -t kangzeroo .

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

Ето разбивката на този ред: docker buildе командата, която казва на Docker да изгради изображение. -t kangzerooзадава името на маркера на изображението на Docker kangzeroo, на което можем да се обърнем по-късно. Моля, не забравяйте, че за да има валидно име на етикет, то трябва да е с малки букви и да няма интервали (използвайте имена на змийски букви). И накрая, .казва на Docker къде да търси това, Dockerfileкоето е необходимо за компилацията ( .означава тук).

Ако сте в екземпляр EC2, можем да стартираме bash build.shот основната директория на нашия проект. Това ще стартира процеса на изграждане на Docker, докато преминава през стъпките в Dockerfileсъздадената от нас. Това може да отнеме известно време ... накрая трябва да изглежда така: (Не се притеснявайте за некритичните грешки, като незадължителната зависимост, пропусната на екрана по-долу).

Сега нека проверим дали изображението ни е създадено. Въведете, за docker imagesда видите изображенията, които в момента се изпълняват в нашата машина. Трябва да видите резултат като този:

Ако искаме да изтрием това изображение, просто напишете docker rmi kangzeroo. Ако въведете docker imagesотново след изтриване, ще видите, че изображението вече го няма. Засега нека оставим изображението, защото ще го използваме, за да изградим контейнера на Docker, в който да работи нашето приложение.

Стъпка 3: Стартирайте скрипта

Now that our image has been created, let’s make run.sh. Recall that Docker Images are simply blueprints of environments that you want to create. Containers are the actual running and functional environments that your app will be executed in. So run.sh will turn our images into containers. Here is what run.sh looks like:

docker run -d -it -p 80:8080 --name=kz kangzeroo npm run ec2 -- --host=0.0.0.0

Let’s walkthrough this short script. docker run is the command to run a container from an image. -d -it is the command for daemon (running tasks in the background) and interactive terminal (giving us a way to interact with the container). If you omit -d then the docker container will not run in the background and you will see log output from the app. -p 80:8080 maps port 80 of our machine to port 8080 of the container. Recall that earlier we specified EXPOSE 8080 in our Dockerfile. So now we take incoming connections on our machine’s port 80 (port 80 is the default for http) and redirect them to our container’s port 8080. If your app is not a webpage, then you can exclude this port mapping.--name=kz gives our container the name kz. Finally, kangzeroo npm run ec2 refers to our image called kangzeroo and npm run ec2 is a command specific to this boilerplate app (for starting up the app). The last part — — host=0.0.0.0 sets the boilerplate to run on 0.0.0.0 instead of localhost (This too is specific to the boilerplate). If you were running a Python backend app, it would look like docker run -d -it --name=kz kangzeroo python app.py.

Great! Save this file and run it with bash run.sh. Then check if the container is running by typing docker ps -a. This is what it should look like:

Your app is now online and running inside a Docker container! Check if it works… for this boilerplate you can check from a web browser.

And it’s working! Great, now let’s turn off our Docker container. Type docker ps -a to see all the containers again. Type docker stop kz and it stops the container. If you type docker ps you will not see the container anymore, but you will see it if you type docker ps -a ( -a means all, inclusive of running and not running container. omit -a if you only want to see running containers). To remove the container, type docker rm kz. If you type docker ps -a you won’t see the container anymore.

Conclusion

Това беше Докер! Като се има предвид всичко, Docker е много по-лесен от настройването на базирана на хипервизор виртуална машина и можете да видите как архитектурата на микросервиза става много по-лесна за управление, когато приемате контейнери. С нашите Dockerfile, build.shи run.shфайлове, създадени в EC2, можем да обобщим, 3-те стъпки за тичане Docker от приложението ни главната директория:

$ bash build.sh $ bash run.sh $ exit

Това е! Docker: лесен като изграждане, изпълнение, готово!

Бонус Cheatsheet

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

$ docker images // To view install images $ docker rmi  // To remove an installed image $ docker ps -a // To view all docker containers $ docker stop  // To stop a docker container $ docker rm  // To remove a docker container $ docker exec -it  bash // Execute into container and run bash * If you want to see the log output from a docker container, omit the -d from run.sh
Тези методи бяха частично използвани при разполагането на renthero.ca