Это всего лишь простая демонстрация, позволяющая получить общее представление о том, как работает Docker, работая шаг за шагом. Я изучил Docker таким образом и сделал этот репозиторий, чтобы решить некоторые проблемы, с которыми я столкнулся во время обучения, чтобы он мог помочь другим новичкам. Надеюсь, вам понравится учиться. Если вам это нравится, поделитесь им на GitHub и поддержите мою работу.
Важно: - Увидев размер файла readme, у вас могут возникнуть сомнения, но, честно говоря, если вы работаете с самого начала, у вас не возникнет никаких проблем и вы будете учиться по ходу дела.
Википедия определяет Docker как
представляет собой набор продуктов платформы как услуги (PaaS), которые используют виртуализацию на уровне ОС для доставки программного обеспечения в пакетах, называемых контейнерами. Контейнеры изолированы друг от друга и объединяют в себе программное обеспечение, библиотеки и файлы конфигурации; они могут общаться друг с другом через четко определенные каналы. Все контейнеры выполняются одним ядром операционной системы и поэтому используют меньше ресурсов, чем виртуальные машины.
Docker помогает вам более эффективно развертывать ваши приложения в «песочнице» (называемой контейнерами) для запуска в операционной системе хоста, например Mac. Основное преимущество докера заключается в том, что он позволяет упаковать программное обеспечение со всеми его зависимостями в единый стандартизированный модуль.
Контейнер — это решение, позволяющее без проблем запустить программное обеспечение при перемещении из одной вычислительной среды в другую. Это может быть переход из промежуточной среды в производственную среду или, возможно, с ноутбука на другой ноутбук с другой операционной системой.
Контейнеры предоставляют логический механизм упаковки, в котором ваши приложения могут быть абстрагированы от среды, в которой они выполняются. Основное отличие состоит в том, что для каждого контейнера не требуется полноценная ОС. Все контейнеры на одном хосте используют одну ОС. Это помогает освободить огромное количество системных ресурсов, таких как процессор и оперативная память.
После завершения установки Docker проверьте установку Docker, выполнив следующую команду:
docker run hello-world
Hello from Docker.
This message shows that your installation appears to be working correctly.
...
Dockerfile
— это текстовый документ, содержащий все команды, которые вы можете вызвать в командной строке для создания изображения. Создайте файл hello.js
и скопируйте в него этот код. Здесь мы написали простой JS-код для отображения Hello World на localhost:8888
. var http = require( " http " ) ;
http.createServer(function (request, response) {
response.writeHead(200, { ' Content-Type ' : ' text/plain ' }) ;
response.end( ' Hello Worldn ' ) ;
}).listen(8888) ;
// Console will print the message
console.log( ' Server running at http://127.0.0.1:8888/ ' ) ;
Dockerfile
и скопируйте в него этот код. FROM node:8
LABEL maintainer= " [email protected] "
RUN npm install
ADD hello.js /hello.js
EXPOSE 8888
ENTRYPOINT [ " node " , " hello.js " ]
Даже если это первый файл Dockerfile, который вы когда-либо видели, я бы сказал, что вы можете догадаться, что здесь происходит. Инструкции Dockerfile: FROM, ENV, LABEL, RUN, ADD, EXPOSE и ENTRYPOINT; они написаны заглавными буквами, но это соглашение, а не требование.
На высоком уровне этот Dockerfile содержит такие инструкции, как «Начать с образа узла», добавить “[email protected]”
в качестве сопровождающего, запустить npm install
для установки зависимостей, скопировать файл в код приложения, задокументировать сетевой порт приложения и и установите hello.js в качестве приложения по умолчанию для запуска.
Теперь мы создадим образ докера на нашем локальном компьютере. Откройте свой терминал в папке текущего проекта и запустите
docker build -t helloworld .
Здесь вы указываете Docker создать образ helloworld
на основе содержимого текущего каталога (обратите внимание на точку (.) в конце команды сборки). Docker найдет файл Dockerfile в каталоге и создаст образ на основе инструкций в файле.
После создания образа Docker следующим шагом будет запуск образа и проверка его работы:
docker run -p 8888:8888 helloworld
Команда, которую мы только что выполнили, использовала порт 8888 для сервера внутри контейнера и предоставляла его внешнему порту 8888. Перейдите по URL-адресу с портом 8888:
Поздравляю! Вы успешно создали свой первый образ Docker.
Образы Docker похожи на шаблоны виртуальных машин и используются для запуска контейнеров. Внутри они состоят из одного или нескольких слоев, доступных только для чтения, которые, сложенные вместе, составляют общее изображение. Docker заботится об объединении этих слоев и представлении их как одного унифицированного объекта. Примечание. Образы Docker являются неизменяемыми, что означает, что образы Docker никогда не могут измениться. Создав его, вы можете удалить его, но не можете изменить.
Образ Docker содержит все упакованные вами файлы, которые становятся файловой системой контейнера, а также множество метаданных о самом образе. Это включает в себя краткую историю того, как было построено изображение. Вы можете использовать это, чтобы увидеть каждый слой изображения и команду, создавшую этот слой. Вы можете проверить историю изображения helloworld
, используя:
docker image history helloworld
IMAGE CREATED CREATED BY COMMENT
cb84eb33ca20 58 seconds ago /bin/sh -c # (nop) ENTRYPOINT ["node" "hello…
7d652a817a9f 58 seconds ago /bin/sh -c # (nop) EXPOSE 8888
334575e947c9 59 seconds ago /bin/sh -c # (nop) ADD file:b9606ef53b832e66e…
Команды CREATED BY
— это инструкции Dockerfile: существует связь «один к одному», поэтому каждая строка в Dockerfile создает слой изображения.
Сначала вам необходимо войти в свою учетную запись dockerhub, выполнив
docker login --username $dockerId
Теперь, когда вы вошли в систему, вы можете отправлять изображения в свою учетную запись или в любую организацию, к которой у вас есть доступ. Если вы не являетесь членом какой-либо организации, вы можете отправлять изображения только в репозитории своей учетной записи.
Мы создали образ Docker под названием helloworld
. Эта ссылка на изображение не имеет имени учетной записи, поэтому мы не можем отправить ее в какие-либо реестры. Однако нам не нужно перестраивать изображение, чтобы дать ему новую ссылку: изображения могут иметь несколько ссылок. Пометьте свое изображение следующим образом:
docker image tag helloworld $dockerId /helloworld:v1
Теперь у нас есть ссылка на изображение с нашим идентификатором Docker в имени учетной записи, и мы вошли в Docker Hub и готовы поделиться нашим изображением! Команда docker image push является аналогом команды pull. Она загружает наши локальные слои образа в реестр:
docker image push championshuttler/helloworld:v1
The push refers to a repository [docker.io/championshuttler/helloworld]
9519a21ac374: Pushed
Мы можем поместить любую строку в тег изображения Docker, и, как мы уже видели, у одного и того же изображения может быть несколько тегов. Мы будем использовать это для создания версий программного обеспечения в наших образах и позволим пользователям делать осознанный выбор в отношении того, что они не будут использовать, а также делать свой собственный осознанный выбор, когда мы используем изображения других людей.
Во многих проектах программного обеспечения используется числовая схема управления версиями с десятичными точками, чтобы указать, насколько велики изменения между версиями, и вы можете отслеживать это с помощью тегов изображений. Основная идея — это что-то вроде [major].[minor].[patch], которое имеет некоторые неявные гарантии. Версия, в которой только увеличивается номер исправления, может содержать исправления ошибок, но должна иметь те же функции, что и последняя версия; выпуск, который увеличивает второстепенную версию, может добавлять функции, но не должен удалять их; основной выпуск может иметь совершенно другие функции.
Большинство приложений не работают в одном компоненте. Даже большие старые приложения обычно создаются как внешние и внутренние компоненты, которые представляют собой отдельные логические уровни, работающие в физически распределенных компонентах. Docker идеально подходит для запуска распределенных приложений — от n-уровневых монолитов до современных микросервисов. Каждый компонент работает в своем легком контейнере, а Docker соединяет их вместе, используя стандартные сетевые протоколы. Вы определяете такие многоконтейнерные приложения и управляете ими с помощью Docker Compose. Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений Docker. В Compose вы используете файл YAML
для настройки служб вашего приложения. Затем одной командой создаем и запускаем все сервисы из вашей конфигурации.
Файл Docker Compose описывает желаемое состояние вашего приложения — как оно должно выглядеть, когда все работает. Это простой формат файла, в котором вы записываете все параметры, которые вы помещаете в команды запуска контейнера Docker, в файл Compose. Затем вы используете инструмент Docker Compose для запуска приложения. Он определяет, какие ресурсы Docker ему нужны (это могут быть контейнеры, сети или тома) и отправляет запросы Docker API для их создания. Имя по умолчанию для файла Compose YAML — docker-compose.yml
. Однако мы можем использовать флаг -f для указания собственных имен файлов.
Давайте начнем.
Ниже кода показан очень простой файл Docker Compose
, который определяет небольшое приложение Flask с двумя службами (веб-интерфейс и Redis). Приложение представляет собой простой веб-сервер, который подсчитывает количество посещений и сохраняет значение в Redis.
version: " 3.5 "
services:
web-frontend:
build: .
command: python app.py
ports:
- target: 8888
published: 8888
networks:
- counter-net
volumes:
- type: volume
source: counter-vol
target: /code
redis:
image: " redis:alpine "
networks:
counter-net:
networks:
counter-net:
volumes:
counter-vol:
Ключ version
необходим, и он всегда должен находиться в первой строке файла. Это объясняет версию формата Compose file
(в основном API).
Ключ services
верхнего уровня — это место, где мы определяем различные службы приложений. В примере, который мы используем, определяются две службы; веб-интерфейс под названием web-frontend
и база данных в памяти под названием Redis. Compose развернет каждый из этих сервисов в качестве своего контейнера.
Ключ networks
верхнего уровня сообщает Docker о необходимости создания новых сетей. По умолчанию Compose создаст мостовые сети. Это сети с одним хостом, которые могут подключать контейнеры только на одном хосте.
В рамках определения службы веб-интерфейса мы даем Docker следующие инструкции:
Мы развернем приложение, определенное в файле Compose из предыдущего раздела. Для этого вам понадобятся следующие 4 файла с https://github.com/championshuttler/counter-app:
Клонируйте репозиторий Git локально.
git clone https://github.com/championshuttler/counter-app.git
Кратко опишем каждый файл:
app.py
— это код приложения (приложение Python Flask).docker-compose.yml
— это файл Docker Compose, который описывает, как Docker должен развернуть приложение.Dockerfile
описывает, как создать образ для службы веб-интерфейса.requirements.txt
перечислены пакеты Python, необходимые для приложения. Давайте воспользуемся Compose, чтобы запустить приложение. Вы должны выполнить все следующие команды из каталога counter-app
:
docker-compose up &
Запуск приложения займет несколько секунд, а вывод может быть весьма подробным.
После успешного развертывания приложения вы можете указать веб-браузеру ваш хост Docker на port 5000
и увидеть приложение во всей его красе.
Учебник показался вам полным беспорядком или вы весело провели время и чему-то научились? Присылайте свои мысли напрямую мне или просто создайте проблему. Найдите меня и в Твиттере, не стесняйтесь спрашивать, есть ли у вас какие-то сомнения.
Мне бы хотелось услышать о вашем опыте работы с этим уроком. Надеюсь, вам понравилось учиться. Если вам это нравится, пожалуйста, поделитесь им на GitHub и поддержите мою работу.