Docker windows hello world: Docker Desktop for Windows user manual

Содержание

Установка и запуск hello-world

Шаг 1: Скачиваем Docker

Docker для Mac

Docker для Mac наше самое новое предложение. Оно работает как нативное приложение для Mac и использует xhyve для виртуализации Docker Engine среды и особенности Linux ядра для Docker демона.

  • Модель вашего Мака должна быть не позднее 2010 года. А так же должна быть поддержка аппаратного управления памятью Intel (MMU) и расширенные таблицы страниц (EPT)


  • OS X 10. 10.3 Yosemite или более новая


  • Не менее 4GB of RAM


  • VirtualBox до версии 4.3.30 НЕ должен быть установлен (она несовместима с Docker для Mac). В противном случае возникнет ошибка. Удалите старую версию VirtualBox и повторно попробуйте установить.

Docker Toolbox для Mac

Docker для Windows

Докер для Windows наше новое приложение для ПК. Он работает как стандарное приложение Windows, и использует Hyper-V для виртуализации среды Docker Engine и функции ядра Linux для сервера.

  • 64-битный Windows 10 Pro, Enterprise или Education (1511 Ноябрьское обновление, сборка 10586 или более поздняя). В будущем мы постараемся поддерживать больше версий Windows 10.


  • Пакет Hyper-V должен быть включен. Docker произведет его установку, если это необходимо. (Для этого требуется перезагрузка).

Docker Toolbox для Windows

Если у вас установлена Windows более ранней версии, которая не поддерживает Docker, то можетескачать Docker Toolbox.

Docker для Linux

Docker Engine работает на всех дистрибутивах Linux.

Шаг 2: Установка Docker

Шаг 3: Проверка установки

  1. Откройте терминал командной строки и выполните несколько команд для проверки что Docker работает правильно.


    Попробуйте несколько полезных команд docker version для проверки установленной у вас версии и docker ps что бы увидеть есть ли у вас запущенные контейнеры. (Поскольку вы только начали их не будет.)


  2. Напишите команду docker run hello-world и выполните ее.


    Если команда выполнена успешно вы увидите примерно следующее:


    $ docker run hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    535020c3e8ad: Pull complete
    af340544ed62: Pull complete
    Digest: sha256:a68868bfe696c00866942e8f5ca39e3e31b79c1e50feaee4ce5e28df2f051d5c
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker.
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
    1. The Docker Engine CLI client contacted the Docker Engine daemon.
    2. The Docker Engine daemon pulled the "hello-world" image from the Docker Hub.
    3. The Docker Engine daemon created a new container from that image which runs the
       executable that produces the output you are currently reading.
    4. The Docker Engine daemon streamed that output to the Docker Engine CLI client, which sent it
       to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
    $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker Hub account:
    https://hub.docker.com
    
    For more examples and ideas, visit:
    https://docs.docker.com/userguide/
    

  3. Теперь выполните docker ps -a что бы увидеть все контейнеры в системе.


    $ docker ps -a
    
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
    592376ff3eb8        hello-world         "/hello"            25 seconds ago      Exited (0) 24 seconds ago                       prickly_wozniak
    


    Вы увидите ваш hello-world контейнер в списке выведенном командой docker ps -a.


    Команда docker ps отображает только запущенные контейнеры. Поскольку hello-world уже выполнен и завершен, то соответствующий контейнер не отображается по команде docker ps.

Ищите решение проблем?

Как правило, вышеуказанные шаги работают «из коробки», но некоторые сценарии могут вызвать проблемы. Если при запуске docker run hello-world возникли ошибки, посетите раздел устранение неисправностей для исправления распространенных проблем.

Что дальше


Комментарии:

Комментариев нет, желаете стать первым?

Запуск первого контейнера Windows | Microsoft Docs



  • Чтение занимает 3 мин

В этой статье

В этой статье объясняется, как запустить первый контейнер Windows после настройки среды, описанной в статье Начало работы. Подготовка Windows для контейнеров. Чтобы запустить контейнер, сначала нужно установить базовый образ, который обеспечивает основу для контейнера в виде служб операционной системы. Затем создается и запускается образ контейнера, который основан на базовом образе. Дополнительные сведения см. далее в этой статье.

Установка базового образа контейнера

Все контейнеры создаются из образов контейнеров. Корпорация Майкрософт предоставляет для начала работы несколько образов, называемых базовыми образами (дополнительные сведения см. в статье о базовых образах контейнеров). Эти процедуры позволяют получить (скачать и установить) базовый образ Nano Server.

  1. Откройте окно командной строки (например, встроенную командную строку, PowerShell или терминал Windows), а затем выполните следующую команду, чтобы скачать и установить базовый образ:

    docker pull mcr.microsoft.com/windows/nanoserver:1809
    

    Совет

    Если вы увидите сообщение об ошибке с текстом no matching manifest for unknown in the manifest list entries, убедитесь, что в Docker не настроен запуск контейнеров Linux.

  2. Когда завершится скачивание образа (во время ожидания изучите лицензионное соглашение), проверьте его наличие в локальной системе, опросив локальный репозиторий образов docker. С помощью команды docker images выводится список установленных образов.

    Ниже приведен пример выходных данных с одним образом Nano Server.

    REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
    microsoft/nanoserver   latest              105d76d0f40e        4 days ago          652 MB
    

Выполнение контейнера Windows

В этом простом примере будет создан и развернут образ контейнера «Hello World». Для вашего удобства лучше выполнять эти команды в окне командной строки с повышенными привилегиями. Не используйте интегрированную среду сценариев Windows PowerShell, так как она не работает для интерактивных сеансов с контейнерами и в результате контейнеры перестают отвечать на запросы.

  1. Запустите контейнер с интерактивным сеансом из образа nanoserver. Для этого введите следующую команду в окне командной строки:

    docker run -it mcr.microsoft.com/windows/nanoserver:1809 cmd.exe
    
  2. После запуска контейнера окно командной строки переходит в контекст контейнера. Внутри контейнера мы создадим простой текстовый файл «Hello World», а затем выйдем из контейнера с помощью следующих команд:

    echo "Hello World!" > Hello.txt
    exit
    
  3. Получите идентификатор контейнера, из которого вы только что вышли, выполнив команду docker ps:

    docker ps -a
    
  4. Создайте новый образ HelloWorld с учетом тех изменений, которые внесли в первом запущенном контейнере. Для этого выполните команду docker commit, заменив <containerid> идентификатором реального контейнера:

    docker commit <containerid> helloworld
    

    После завершения вы получите пользовательский образ, содержащий скрипт «Привет мир». Это можно проверить с помощью команды docker images.

    docker images
    

    Ниже приведен пример выходных данных.

    REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
    helloworld                             latest              a1064f2ec798        10 seconds ago      258MB
    mcr.microsoft.com/windows/nanoserver   1809                2b9c381d0911        3 weeks ago         256MB
    
  5. Наконец, запустите новый контейнер с помощью команды docker run с параметром --rm, который позволяет автоматически удалить контейнер по завершении работы командной оболочки (cmd.exe).

    docker run --rm helloworld cmd.exe /s /c type Hello.txt
    

    В результате Docker создает контейнер на основе образа HelloWorld. В этом контейнере Docker запускает экземпляр командной строки cmd.exe, которая считывает указанный файл и выводит его содержимое в оболочку. В конце Docker приостанавливает работу контейнера и удаляет его.

Запуск контейнера Windows с помощью Windows Admin Center

Вы можете использовать Windows Admin Center для локального запуска контейнеров. А именно, вы можете использовать расширение «Контейнеры» своего экземпляра Windows Admin Center для запуска контейнеров. Сначала откройте узел контейнеров, которым требуется управлять, а затем в области «Сервис» выберите расширение Контейнеры. Затем откройте вкладку Образы в расширении «Контейнеры» в разделе Узел контейнеров.

Если базовый образ контейнера отсутствует для узла, выберите вариант Извлечь, чтобы открыть параметры Извлечение образа контейнера:

В разделе Извлечение образа контейнера укажите URL-адрес и тег образа. Если вы не уверены, какой образ нужно извлечь, ознакомьтесь со списком популярных образов от Майкрософт, предоставляемых в Windows Admin Center. Вы также можете указать учетные данные для извлечения образа из частного репозитория. Внеся необходимые сведения, щелкните Извлечь. Windows Admin Center запустит процесс извлечения на узле контейнеров. После завершения скачивания вы увидите новый образ на вкладке Образы.

Выберите образ для запуска и щелкните Запустить.

В меню Запуск настройте конфигурацию для контейнера, например имя контейнера, тип изоляции, порты для публикации, а также выделение памяти и ЦП. Кроме того, вы можете добавить команды запуска Docker, которые недоступны в пользовательском интерфейсе, такие как -v для постоянного тома. Дополнительные сведения о доступных параметрах запуска Docker см. в документации.

Завершив настройку контейнера, щелкните Запустить. Состояние выполняющихся контейнеров можно просмотреть на вкладке Контейнеры:

Дальнейшие действия



Docker не удается запустить hello-world от клиента

Я пытаюсь настроить Docker в первый раз. Поэтому, я следуя инструкциям здесь: https://docs.docker.com/машина/начальные/

Теперь, когда я доберусь до следующей команды:

docker run busybox echo hello world

Я получаю следующую ошибку:

$ docker run hello-world
C:\Program Files\Docker Toolbox\docker.exe: An error occurred trying to connect: Post https://192.168.99.101:2376/v1.23/containers/create: Service Unavailable.
See 'C:\Program Files\Docker Toolbox\docker.exe run --help'.

Теперь я стою за корпоративным прокси-сервером, так что это может быть причиной моей проблемы. Я настроил его в соответствии с тем, что упомянуто в этой статье: http://mflo.io/2015/08/13/docker-machine-behind-proxy/ . Я сделал:

docker-machine ssh default

  # now the command prompt will say something like:
  # docker@default:~$

  # we need root access:
  sudo -s

  # now the command prompt will say something like:
  # root@default:~$

  # now configure the proxy
  echo "export HTTP_PROXY=http://[uid]:[pw]@corporate.proxy.com:[port]" >> /var/lib/boot2docker/profile
  echo "export HTTPS_PROXY=http://[uid]:[pw]@corporate.proxy.com:[port]" >> /var/lib/boot2docker/profile

  # for verification
  cat /var/lib/boot2docker/profile

  # exit out of ssh session
  exit
  exit

  # restart
  docker-machine restart default

  # now you should be able to proceed with installation steps
  docker run hello-world

На машине Docker у меня не было абсолютно никаких проблем с "docker run hello-world" , а также с "docker run busybox echo hello world"

Однако на моем компьютере эта же команда всегда возвращает одну и ту же ошибку…

docker

docker-machine

Поделиться

Источник


Etienne Noël    

12 июля 2016 в 18:33

2 ответа


  • Docker hello-world on Ubuntu — разрешение отказано

    Я пытаюсь заставить docker (v 1.8.2) работать на Ubuntu 14_04, (используя опцию-g в конфигурационном файле docker — Ubuntu находится на ключе USB, и я получил ошибки вытягивания изображений без использования диска машины). В результате docker извлекает образ hello-world, но выполнение завершается…

  • Docker: при попытке запустить docker run hello-world getting-Forbidden

    Это машины windows 7, docker, установленных с помощью инструментов версия docker 1.8.2 Я нахожусь за корпоративным брандмауэром. Сначала я даже не смог запустить машину, поэтому добавил две новые переменные окружения: http_proxy, https_proxy и смог вызвать машину по умолчанию Теперь, когда я бегу,…



1

Попробуй:

docker-machine stop default
docker-machine start default

А затем запустите приложение, иногда перезагрузка не обновляет конфигурацию сети.

Поделиться


Fabián Bertetto    

12 июля 2016 в 19:04


Поделиться


Etienne Noël    

12 июля 2016 в 19:17


Похожие вопросы:

Docker hello-world: ошибка аутентификации

Я только начинаю с docker. Я следую инструкциям, указанным здесь https://docs.docker.com/windows/ step_one / Я установил docker (1.10.2) на windows 10 & ran docker run hello-world . Но я получаю…

Docker настройка — не удается запустить hello-world

Это первый раз, когда я пытаюсь настроить docker. Я следовал инструкциям, теперь я вижу, что машина docker работает.. (я нахожусь на mac, yosemite 10.10.5) docker-machine ls NAME ACTIVE URL STATE…

“Ошибка ответа от демона: не удается запустить контейнер … нет такого файла или каталога” на Oracle Linux работает hello-world

TLDR: я пытаюсь запустить контейнер hello-world на Oracle Linux и получаю сообщение об ошибке: ответ на ошибку от демона: не удается запустить контейнер…

Docker hello-world on Ubuntu — разрешение отказано

Я пытаюсь заставить docker (v 1.8.2) работать на Ubuntu 14_04, (используя опцию-g в конфигурационном файле docker — Ubuntu находится на ключе USB, и я получил ошибки вытягивания изображений без…

Docker: при попытке запустить docker run hello-world getting-Forbidden

Это машины windows 7, docker, установленных с помощью инструментов версия docker 1.8.2 Я нахожусь за корпоративным брандмауэром. Сначала я даже не смог запустить машину, поэтому добавил две новые…

docker запустить hello-world по-прежнему не удается, разрешение отказано

Я пытаюсь запустить docker, но это все равно не удается. Вот что я получаю root@c1170137:~# docker run hello-world Unable to find image ‘hello-world:latest’ locally latest: Pulling from…

Docker: не могу запустить hello-world. Windows 10

Я новичок в docker. Я пытаюсь бежать $ docker run hello-world И я получил эту ошибку: $ docker run hello-world Unable to find image ‘hello-world:latest’ locally Pulling repository…

Docker запуск hello-world не работает

Я установил Docker точно следуя документации на веб-сайте, но когда я пытаюсь запустить docker run hello-world , я получаю следующий вывод из terminal: Saved file tree to doc-filelist.js Copied JS…

docker run hello-world — не удается найти изображение

Я установил последнюю версию docker на remote Centos7.2 (версия 18.01.0.ce) в соответствии с инструкцией по установке docker. Мой клиент docker и сервер docker находятся на одной машине (виртуальной…

Не удается запустить пример docker ‘hello world’

Я только что установил docker на Mac ( docker toolbox отсюда ; по крайней мере, я надеюсь, что он установлен правильно), но, следуя учебнику , введите следующую команду docker run hello-world Я…

по ту сторону Hello World / Хабр

В мире программирования существуют технологии, must have для каждого разработчика, к числу которых относится и Docker. Подразумевается, что это просто, как таблица умножения, и известно всем. О том, зачем в 2021 году в 100500й раз заводить разговор про докер — статья Сергея Кушнарева, руководителя отдела разработки ZeBrains.

С одной стороны — про него все знают. С другой — если тебя устраивают небольшие веб-проекты, особенно на какой-то конкретной CMS, то докер очень часто оказывается тем самым «первым лишним», и все сводится к инструкции «возьми готовый докер-файл, запусти в терминале docker run и будет тебе счастье». А когда понимаешь, что этого уже недостаточно — натыкаешься на статьи, написанные по тому же принципу «скачайте-запустите-получите». Кому этого мало — читайте дальше.

Зачем программисту холодильник

Кто сказал: «Не люблю пить теплое»? Убираем емкость подальше и смотрим на принципиальную схему девайса:

Холодильник — это блок питания, компрессор, хладагент, конденсатор и камера, в одну из стенок которой спрятаны капиллярные трубки. Все это хозяйство утрамбовано в большой, в меру красивый шкаф с дверцей наружу, за которой и прячется то, что требуется пить охлажденным.

А теперь представим, что в доме программиста появилось существо противоположного пола, считающее, что в холодильнике можно хранить мясо. Что характерно — замороженное. Но при этом, как несложно догадаться, замерзнут до непотребного состояния и напитки, что нас в некотором смысле не совсем устраивает.

У нас два пути: купить второй холодильник или разделить тот, что у нас есть, на две камеры с датчиками температуры на входе, чтобы управлять клапаном подачи хладагента внутрь. Ура, мы только что изобрели двухкамерный холодильник. А заодно — разобрались с тем, для чего программистам понадобились виртуальные машины и докер. 

Проекты, которые мы делаем, не сильно отличаются от продуктов в холодильнике — каждому нужны свои условия. Для одного — PHP 7.4, база MySQL 7.6, Sphinx и мейлер на Golang. Для другого — нода 12 версии, Angular 7 и база MySQL 8.0. Проектов может быть не один десяток. Установить это все на одну машину — все равно, что запихнуть все продукты в одну камеру холодильника. 

Нужно как-то изолировать один проект (продукт) от другого. На помощь приходит или виртуальная машина (еще один холодильник), или докер (вторая камера со своими настройками). Давайте немного изменим схему нашего устройства:

Включаем воображение и смекалку, поехали!

Итак, у нас есть квартира (компьютер) со своей инфраструктурой, от которой нам требуется электричество (жесткий диск, сетевая плата, процессор, etc). Для установки второго холодильника (виртуальной машины) нам нужен разветвитель розеток (hypervisor). Довольно просто, но мы видим, что для изоляции мяса от напитков нам потребовалось два комплекта оборудования (Guest OS), хотя по факту условия хранения определяет только датчик, управляющий клапаном к капиллярной системе (bins/lib). 

В случае, когда мы физически разделяем холодильную и морозильную камеры (container engine), нам не нужна вторая розетка (hypervisor) и место для второго холодильника (полноценная Guest OS). Мы получили два независимых контейнера — каждый со своими условиями (bins/lib), которые подходят нужному продукту (app).

Что ты, черт возьми, такое, Докер?

Разделим вопрос на две части: «как с этим работать» и «как это работает». Эта статья посвящена ответу на первую часть. Если интересно углубиться в детали, пишите в комментариях — поговорим про изоляцию процессов, пространства имен и прочее. А может быть, напишу еще одну статью.

Из схемы выше очевидно, что ответ на вопрос «что такое докер» спрятан в блоке «Container/Docker engine», иначе говоря — движок контейнеризации. Давайте посмотрим на него внимательней:

Первым делом нам потребуется некий сервис (Docker daemon), который будет управлять всем процессом — набор инструкций, как создавать изолированные пространства. Поселим его на своем компьютере!

Сам процесс установки прост и у вас не должно возникнуть трудностей.

Неважно, какую операционную систему вы выберете — все равно выполнение произойдет на Linux. В Windows и Mac будет запускаться виртуализированное ядро Линукса для докера.  

Для того, чтобы мы могли как-то управлять этим сервисом, воспользуемся REST API, а команды будем выдавать посредством CLI, назовем его для удобства клиентом (Docker client). 

Сами приложения и нужные для их работы библиотеки мы будем хранить в виде файлов-образов (Docker-images). Можете воспринимать их по аналогии с ISO-образами DVD-дисков или как специфический вид архива с данными.

Чтобы все заработало, мы должны с помощью клиента попросить Docker daemon взять конкретный образ и развернуть его в работающий контейнер. Но откуда он его возьмет? Добавим немного логики и инфраструктуры — пусть Docker daemon создаст на нашем компьютере реестр образов и при запросе находит нужный. А если не нашел — отправляется в сеть, находит Docker Hub (сетевой реестр), находит там нужный образ и копирует к нам на локальный компьютер. 

Указать, какой конкретно образ нам нужен, мы можем или при запуске контейнера из готового образа (docker run), или при создании нового образа (docker build), или просто запросив скачивание (docker pull).

Получив нужный образ, докер-демон запустит на его основе контейнер, и мы получим работающее приложение. Заодно докер пробросит внутрь изолированного контейнера сеть (network), чтобы мы смогли увидеть результаты работы приложения, и при необходимости «прикрутит» к нему хранилище для сохранения данных (data volumes).

Повторение — мать учения

Теперь все вышеизложенное — но на примере демонстрационного приложения Hello World. Считаем, что демона мы на своем компе уже поселили, ссылка на установку — чуть выше по тексту.

Выполняем команду docker run hello-world и видим следующий результат:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete 
Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working
correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker
 Hub.
    (amd64)
 3. The Docker daemon created a new container from that image
 which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which
 sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Давайте разбираться.

Первое что произошло после команды «докер, запусти образ с именем hello-world», это попытка найти его локально и запустить.

Unable to find image 'hello-world:latest' locally

Попытка не увенчалась успехом (у меня была чистая установка докера), причем, обратите внимание, искался образ не hello-world, а hello-world:latest.
Через двоеточие указывается тег — что-то вроде версии или модификации образа. Если его не указать, будет искаться самая свежая версия с общепринятым тегом latest.

latest: Pulling from library/hello-world

Тогда докер решает поискать этот образ на docker hub`е и скачать его оттуда.
https://hub.docker.com/_/hello-world

b8dfde127a29: Pulling fs layer
b8dfde127a29: Downloading 488B/977B
b8dfde127a29: Extracting 977B/977B
b8dfde127a29: Pull complete

Примерно такие строки будут друг друга заменять, но это может произойти очень быстро, так как образ очень мал. Вы будете их чаще видеть при загрузке больших и многослойных (про слои чуть позже) образов.

А далее видим следующие строки:

b8dfde127a29: Pull complete 
Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
Status: Downloaded newer image for hello-world:latest

Тут нам сообщают хэш образа и статус, говорящий, что загружен новый образ. Также в этот момент выводится и приветствие с сообщением. Но перед этим происходит еще кое-что.

А именно — из только что скачанного образа был создан контейнер. Если перевести на язык ООП, создался объект sleepy_antonelli (контейнер) экземпляр класса hello-world (образа). Sleepy_antonelli — это рандомно сгенерированное имя контейнера, поскольку мы не указали его явно.

Ну и, наконец, сам текст появляется на экране. Он, кстати, и есть результат работы приложения в контейнере.

Hello from Docker!
This message shows that your installation appears to be working
correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker
 Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which
 runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which
 sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Собственно, это тут и написано (вместе с призывом не останавливаться на достигнутом и ссылкой на документацию). Но давайте проверим сами.

Если выполнить команду docker images, мы увидим скачанный образ.

REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
hello-world   latest    d1165f221234   3 weeks ago   13.3kB

А если выполнить команду docker ps -a флаг «a» показывает все образы, даже те, что остановлены в данный момент — то увидим и сам контейнер, как раз с именем  sleepy_antonelli.

CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS          PORTS     NAMES
01d1bc18db71   hello-world   "/hello"  18 seconds ago   Exited (0) 17    seconds ago             sleepy_antonelli

Имена можно задавать и самим, но нам пока это не нужно, поэтому докер сам генерирует для имени два рандомных слова. Также тут видны его ID, образ, с которого он был сделан, команду, ради которой был запущен (в данном случае — написать приветствие), когда был создан, код завершения работы (0 — это штатное завершение) со временем, порты (в данном случае они никак не пробрасывались, потому и пусто) и, наконец, имя.

Из одного образа можно создать много контейнеров. Также их можно останавливать, запускать и удалять. Но важно помнить, что образ — это шаблон. Он создается один раз и не меняется, а контейнеры можно модифицировать индивидуально. Это то же самое, что получить с завода (образа) 10 одинаковых контейнеров для перевозок грузов, но перекрасить каждый в разный цвет, повесить разные замки, и по-разному назвать.

«Людоеды — как лук, многослойные!»

Осталась еще одна тонкость, которую следует рассказать. Если образ неизменен, а контейнеры смертны, то тогда придется под каждую задачу создавать свой образ? 

Нет, для этого придуманы слои. Каждое изменение образа можно выносить в отдельный слой. Это позволяет комбинировать их в разные итоговые образы. И вдобавок, уже готовый образ можно взять за основу и «наслоить» что-то свое.

Это можно представить в виде стопки блинов — тех, что железные. Мы надеваем на гриф блины, чтобы получить нужную нам конфигурацию (вес). Но при этом мы не можем вынуть или заменить какой-то блин в середине — придется пересобрать конфигурацию или довесить новые поверх имеющихся.

Если выполнить предложенную команду из hello world:

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

То мы увидим, что там несколько слоев:

Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
04a5f4cda3ee: Pull complete 
ff496a88c8ed: Pull complete 
0ce83f459fe7: Pull complete 
Digest: sha256:a15789d24a386e7487a407274b80095c329f89b1f830e8ac6a9323aa61803964
Status: Downloaded newer image for ubuntu:latest
root@61f60707bdbe:/#

Подведем итоги

Что же дает нам докер? Во-первых, это изоляция — мы можем запускать что угодно на своем компьютере, не опасаясь за целостность как системы, так и приложения. Они просто не пересекаются. 

Во-вторых — чистота. Образ на диске — это самые обычные «инертные» файлы, которые «оживают» только при создании контейнера. Контейнеры же изолированы от внешнего мира.  

В-третьих — скорость. Благодаря тому, что мы пользуемся операционной системой хоста, не требуется тратить время на полноценную инициализацию гостевой OS, как это происходит в виртуальной машине. Кроме того, можно удалить из сборки образа весь функционал, не относящийся к конкретному приложению, что тоже уменьшает и размер сборки, и время запуска.

Наконец, это предсказуемость. Контейнеру все равно, что находится снаружи. Поэтому если ваше приложение работало в контейнере на вашем локальном компьютере, оно заработает на любом другом. Забудьте про dependencies hell — эта фраза дорогого стоит! 

Можно, конечно, вспомнить еще и  о том, что тот же Kubernetes является развитием идеи контейнеров, перенесенной на уровень DevOps, но достаточно и того, что изложено выше.  

Вопросы, уточнения и комментарии можно оставлять прямо под текстом — буду рад пообщаться.

Ошибка При Запуске Hello World Через Docker Toolbox В Windows: «Docker Daemon Не Работает»

Я новичок в Docker. Я установил Docker Toolbox и столкнулся с проблемой запуска Hello Hello, например:

Начал работу Docker QuickStart Terminal с результатом ниже:

             ##         .
## ## ## ==
## ## ## ## ## ===
/"""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\_______/
Error getting IP address: ssh command error:
command : ip addr show
err : exit status 255
output : Warning: Identity file C:\Users#.lp.docker\machine\machines\default\id_rsa -p 22 "ip addr show" not accessible: No such file or directory.
docker is configured to use the default machine with IP
For help getting started, check out the docs at https://docs.docker.com

Start interactive shell

$ docker run hello-world
C:\Program Files\Docker Toolbox\docker.exe: error during connect: Post http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.35/containers/create: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.
See 'C:\Program Files\Docker Toolbox\docker.exe run --help'.

$ docker --version
Docker version 18.01.0-ce, build 03596f51b1

Нижеприведенная команда работает вечно,

PS C:\Users\'#.lp> docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default virtualbox Timeout

Я тестирую Docker Toolbox выше, потому что я не могу запустить Docker для Windows из-за других ошибок.

Окружающая среда: Windows 10 Pro.

Обновлено Я удалил все виртуальные машины из Virtual Box и открыл Docker QuickStart Terminal, но он работает навсегда, пытаясь получить IP, как показано ниже:

Running pre-create checks...
Creating machine...
(default) Copying C:\Users\'#.lp\.docker\machine\cache\boot2docker.iso to C:\Users\'#.lp\.docker\machine\machines\default\boot2docker.iso...
(default) Creating VirtualBox VM...
(default) Creating SSH key...
(default) Starting the VM...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
(default) Waiting for an IP...

Docker Desktop для Windows. Руководство пользователя

Приблизительное время прочтения: 16 минут

Добро пожаловать в Docker Desktop! В руководстве пользователя Docker Desktop для Windows содержится информация о том, как настраивать параметры рабочего стола Docker и управлять ими.

Для получения информации о загрузке Docker Desktop, системных требованиях и инструкциях по установке см. Установка Docker Desktop.

Настройки

Меню Docker Desktop позволяет открывать панель мониторинга Docker, запускать краткое руководство, настраивать параметры Docker, такие как установка, обновления, каналы версий, вход в Docker Hub и многое другое.

В этом разделе объясняются параметры конфигурации, доступные из диалогового окна Настройки .

  1. Чтобы открыть меню рабочего стола Docker, щелкните правой кнопкой мыши значок Docker в области уведомлений (или на панели задач):

  2. Выберите Настройки , чтобы открыть диалоговое окно настроек:

Общие

На вкладке Общие диалогового окна Параметры вы можете настроить, когда запускать и обновлять Docker.

  • Автоматически проверять наличие обновлений : по умолчанию Docker Desktop настроен на автоматическую проверку наличия новых версий. Если вы установили Docker Desktop как часть организации, возможно, вы не сможете обновить Docker Desktop самостоятельно. В этом случае обновите существующую организацию до группового плана и снимите этот флажок, чтобы отключить автоматическую проверку обновлений.

  • Запускать Docker при входе в систему. : выберите этот параметр, чтобы автоматически запускать Docker Desktop при входе в систему с Windows.

  • Открыть демон на tcp: // localhost: 2375 без TLS : выберите этот параметр, чтобы разрешить устаревшим клиентам подключаться к демону Docker. Вы должны использовать эту опцию с осторожностью, поскольку раскрытие демона без TLS может привести к атакам с удаленным выполнением кода.

  • Используйте механизм на основе WSL 2 : WSL 2 обеспечивает лучшую производительность, чем устаревший серверный модуль Hyper-V. Дополнительные сведения см. В разделе Серверная часть Docker Desktop WSL 2.

  • Отправлять статистику использования : по умолчанию Docker Desktop отправляет диагностику,
    отчеты о сбоях и данные об использовании.Эта информация помогает Docker улучшать и
    устранить неполадки в приложении. Снимите флажок, чтобы отказаться. Docker может периодически запрашивать дополнительную информацию.

  • Показывать еженедельные советы. : Показывает полезные советы и предложения по использованию Docker.

  • Открыть панель мониторинга Docker Desktop при запуске : автоматически открывает панель мониторинга при запуске Docker Desktop.

  • Использовать Docker Compose V2 : выберите этот параметр, чтобы разрешить команде docker-compose использовать Docker Compose V2.Дополнительные сведения см. В разделе Docker Compose V2.

Ресурсы

Вкладка Resources позволяет настраивать ЦП, память, диск, прокси-серверы,
сеть и другие ресурсы. Для
конфигурация в зависимости от того, используете ли вы контейнеры Linux в WSL 2
режим, контейнеры Linux в режиме Hyper-V или контейнеры Windows.

Продвинутый

Примечание

Вкладка «Дополнительно» доступна только в режиме Hyper-V, поскольку в режиме WSL 2 и
В контейнерном режиме Windows этими ресурсами управляет Windows.В WSL 2
режим, вы можете настроить ограничения на память, ЦП и размер подкачки, выделенный
в служебную виртуальную машину WSL 2.

Используйте вкладку Advanced , чтобы ограничить ресурсы, доступные Docker.

  • ЦП : по умолчанию Docker Desktop использует половину числа процессоров.
    доступно на хост-машине. Чтобы увеличить вычислительную мощность, установите для этого параметра значение
    большее число; для уменьшения уменьшите число.

  • Память : по умолчанию Docker Desktop настроен на использование 2 ГБ оперативной памяти,
    выделяется из общей доступной памяти на вашем компьютере.Чтобы увеличить ОЗУ, установите более высокое значение. Чтобы уменьшить его, уменьшите число.

  • Swap : Настройте размер файла подкачки по мере необходимости. По умолчанию — 1 ГБ.

  • Размер образа диска : укажите размер образа диска.

  • Расположение образа диска : укажите расположение тома Linux, где хранятся контейнеры и образы.

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

Обмен файлами

Примечание

Вкладка «Общий доступ к файлам» доступна только в режиме Hyper-V, поскольку в режиме WSL 2
и в режиме контейнера Windows все файлы автоматически открываются для общего доступа Windows.

Используйте общий доступ к файлам, чтобы разрешить совместное использование локальных каталогов в Windows с контейнерами Linux.Это особенно полезно для
редактирование исходного кода в среде IDE на хосте во время выполнения и тестирование кода в контейнере.
Обратите внимание, что настройка общего доступа к файлам не требуется для контейнеров Windows, только для контейнеров Linux.
Если каталог не используется совместно с контейнером Linux, вы можете получить файл, который не найден. или не могут запустить службу. Ошибки во время выполнения. См. Раздел Для подключения тома требуются общие папки для контейнеров Linux.

Настройки файлового ресурса:

  • Добавить каталог : щелкните + и перейдите в каталог, который вы хотите добавить.

  • Применить и перезапустить делает каталог доступным для контейнеров, использующих Docker
    привязать крепление ( -v ).

Советы по общим папкам, разрешениям и монтированию томов

  • Делитесь с контейнером только нужными каталогами. Обмен файлами
    вводит накладные расходы, поскольку о любых изменениях файлов на хосте необходимо уведомлять
    к виртуальной машине Linux. Совместное использование слишком большого количества файлов может привести к высокой загрузке процессора и замедлению работы
    производительность файловой системы.

  • Общие папки предназначены для редактирования кода приложения на хосте во время его выполнения в контейнерах. Для товаров без кода
    таких как каталоги кеша или базы данных, производительность будет намного лучше, если они будут храниться в
    виртуальная машина Linux, используя том данных
    (именованный том) или контейнер данных.

  • Docker Desktop устанавливает разрешения на чтение / запись / выполнение для пользователей, групп и других пользователей 0777 или + rwx.
    Это не настраивается.См. Ошибки прав доступа к каталогам данных для общих томов.

  • Windows представляет для приложений вид файловой системы без учета регистра, в то время как в Linux учитывается регистр. В Linux можно создать 2 отдельных файла: test и Test , тогда как в Windows эти имена файлов будут фактически относиться к одному и тому же базовому файлу. Это может привести к проблемам, когда приложение работает правильно на компьютере разработчика с Windows (на котором используется общий доступ к содержимому файла), но не работает при запуске в Linux в производственной среде (где содержимое файла отличается).Чтобы избежать этого, Docker Desktop настаивает на том, чтобы доступ ко всем общим файлам осуществлялся в исходном порядке. Поэтому, если создается файл с именем test , его нужно открывать как test . Попытки открыть Тест завершатся ошибкой с сообщением «Нет такого файла или каталога». Точно так же после создания файла с именем test попытки создать второй файл с именем Test завершатся ошибкой.

Общие папки по запросу

Вы можете предоставить общий доступ к папке «по запросу» при первом использовании конкретной папки контейнером.

Если вы запускаете команду Docker из оболочки с подключением тома (как показано на
пример ниже) или запустите файл Compose, который включает в себя монтирования томов, вы получите
всплывающее окно с вопросом, хотите ли вы предоставить общий доступ к указанной папке.

Вы можете выбрать Поделиться , и в этом случае он будет добавлен в список общих папок Docker Desktop и доступен для
контейнеры. Кроме того, вы можете отказаться от предоставления доступа, выбрав Отменить .

Прокси

Docker Desktop позволяет настраивать параметры прокси-сервера HTTP / HTTPS и
автоматически распространяет их в Docker.Например, если вы настроили прокси
settings на http://proxy.example.com , Docker использует этот прокси при извлечении контейнеров.

Однако ваши настройки прокси не будут перенесены в запускаемые вами контейнеры.
Если вы хотите установить настройки прокси для ваших контейнеров, вам необходимо определить
переменные среды для них, как и в Linux, например:

 > docker run -e HTTP_PROXY = https: //proxy.example.com: 3128 alpine env

ПУТЬ = / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin
HOSTNAME = b7edf988b2b5
TERM = xterm
ГЛАВНАЯ = / корень
HTTP_PROXY = http: // прокси.example.com:3128
  

Для получения дополнительной информации о настройке переменных среды для запуска контейнеров,
см. Установка переменных среды.

Сеть

Примечание

Вкладка Сеть недоступна в режиме контейнера Windows, так как сеть
под управлением Windows.

Вы можете настроить сеть Docker Desktop для работы в виртуальной частной сети (VPN). Укажите префикс преобразования сетевых адресов (NAT) и маску подсети, чтобы включить подключение к Интернету.

DNS-сервер : вы можете настроить DNS-сервер для использования динамической или статической IP-адресации.

Примечание

Некоторые пользователи сообщали о проблемах с подключением к Docker Hub на Docker Desktop. Это проявится как ошибка при попытке запустить
docker команды, которые извлекают образы из Docker Hub, которые еще не
загружено, например, при первом запуске docker run hello-world . если ты
столкнувшись с этим, сбросьте DNS-сервер на использование фиксированного адреса Google DNS:
8.8.8.8 . Для получения дополнительной информации см.
Проблемы с сетью при устранении неполадок.

Для обновления этих параметров требуется перенастройка и перезагрузка виртуальной машины Linux.

Интеграция WSL

В режиме WSL 2 вы можете настроить, в каких дистрибутивах WSL 2 будет
Интеграция WSL.

По умолчанию интеграция будет включена в вашем распространении WSL по умолчанию.
Чтобы изменить дистрибутив WSL по умолчанию, запустите wsl --set-default <имя дистрибутива> .(Например,
чтобы установить Ubuntu в качестве дистрибутива WSL по умолчанию, запустите wsl --set-default ubuntu ).

Вы также можете выбрать любые дополнительные дистрибутивы, в которых вы хотите включить WSL 2.
интеграция на.

Подробнее о настройке Docker Desktop для использования WSL 2 см.
Серверная часть Docker Desktop WSL 2.

Движок Докера

Страница Docker Engine позволяет вам настроить демон Docker, чтобы определить, как работают ваши контейнеры.

Введите файл конфигурации JSON в поле, чтобы настроить параметры демона.Полный список параметров см. В Docker Engine.
Справочник по командной строке dockerd.

Нажмите Применить и перезапустить , чтобы сохранить настройки и перезапустить Docker Desktop.

Командная строка

На странице «Командная строка» вы можете указать, следует ли включать экспериментальные функции.

Вы можете включать и выключать экспериментальные функции в Docker Desktop. Если вы отключите экспериментальные функции, Docker Desktop будет использовать текущую общедоступную версию Docker Engine.

Экспериментальные особенности

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

Список текущих экспериментальных функций Docker CLI см. В разделе Docker CLI Experimental features.

Запустите докер версии , чтобы проверить, включены ли экспериментальные функции. Экспериментальный режим
находится в списке данных Server . Если Experimental — это истинный , то Docker
работает в экспериментальном режиме, как показано здесь:

 > версия докера

Клиент: Docker Engine - Сообщество
 Версия: 19.03.1
 Версия API: 1.40
 Версия Go: go1.12.5
 Git commit: 74b1e89
 Построен: 25 июл, 21:17:08 2019
 ОС / Arch: windows / amd64
 Экспериментально: правда

Сервер: Docker Engine - Сообщество
 Двигатель:
  Версия: 19.03.1
  Версия API: 1.40 (минимальная версия 1.12)
  Версия Go: go1.12.5
  Git commit: 74b1e89
  Построен: Чт 25 июл, 21:17:52 2019
  ОС / Arch: Linux / amd64
  Экспериментально: правда
 containerd:
  Версия: v1.2.6
  GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Версия: 1.0.0-rc8
  GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Версия: 0.18.0
  GitCommit: fec3683
  

Кубернетес

Примечание

Вкладка Kubernetes недоступна в режиме контейнера Windows.

Docker Desktop включает в себя автономный сервер Kubernetes, который работает на вашем компьютере с Windows, поэтому
что вы можете протестировать развертывание рабочих нагрузок Docker в Kubernetes. Чтобы включить поддержку Kubernetes и установить автономный экземпляр Kubernetes, работающий как контейнер Docker, выберите Включить Kubernetes .

Дополнительные сведения об использовании интеграции Kubernetes с Docker Desktop см. В разделе «Развертывание в Kubernetes».

Обновления программного обеспечения

Раздел «Обновления программного обеспечения» уведомляет вас обо всех обновлениях, доступных для Docker Desktop.Вы можете сразу загрузить обновление или щелкнуть опцию Release Notes , чтобы узнать, что включено в обновленную версию.

Если вы состоите в группе Docker или подписке Business, вы можете отключить проверку обновлений, сняв флажок Автоматически проверять наличие обновлений в общих настройках. Это также отключит значок уведомления, который отображается на панели инструментов Docker.

Сброс

Restart Docker Desktop и Сброс до заводских настроек по умолчанию Параметры теперь доступны в меню Устранение неполадок .Для получения информации см. Журналы и устранение неполадок.

Устранение неполадок

Посетите наши журналы и руководство по устранению неполадок для получения более подробной информации.

Войдите на наш форум Docker Desktop для Windows, чтобы получить помощь от сообщества, просмотреть текущие темы пользователей или присоединиться к обсуждению.

Войдите в Docker Desktop для проблем Windows на GitHub, чтобы сообщать об ошибках или проблемах и просматривать проблемы, о которых сообщает сообщество.

Информацию о том, как оставить отзыв о документации или обновить ее самостоятельно, см. В разделе Содействие документации.

Переключение между контейнерами Windows и Linux

В меню рабочего стола Docker вы можете выбрать, какой демон (Linux или Windows)
интерфейс командной строки Docker. Выберите Перейти на контейнеры Windows , чтобы использовать Windows
контейнеры или выберите Перейти на контейнеры Linux , чтобы использовать контейнеры Linux
(по умолчанию).

Дополнительные сведения о контейнерах Windows см. В следующей документации:

Диалоговое окно настроек изменяется с контейнерами Windows

Когда вы переключаетесь на контейнеры Windows, в диалоговом окне настроек отображаются только те вкладки, которые активны и применяются к вашим контейнерам Windows:

Если вы устанавливаете прокси или конфигурацию демона в режиме контейнеров Windows, эти
применяется только к контейнерам Windows.Если вы вернетесь к контейнерам Linux,
конфигурации прокси и демонов возвращаются к тому, что вы установили для Linux
контейнеры. Настройки вашего контейнера Windows сохраняются и становятся доступными
снова при переключении обратно.

Панель приборов

Docker Desktop Dashboard позволяет вам взаимодействовать с контейнерами и приложениями и управлять жизненным циклом ваших приложений прямо с вашего компьютера. Пользовательский интерфейс панели мониторинга показывает все запущенные, остановленные и запущенные контейнеры с их состоянием.Он предоставляет интуитивно понятный интерфейс для выполнения стандартных действий по проверке контейнеров и приложений Docker Compose и управлению ими. Дополнительные сведения см. В разделе Docker Desktop Dashboard.

Докер-концентратор

Выберите Войти / Создать Docker ID в меню Docker Desktop, чтобы получить доступ к своей учетной записи Docker Hub. После входа в систему вы можете получить доступ к своим репозиториям Docker Hub прямо из меню рабочего стола Docker.

Дополнительные сведения см. В следующих разделах о Docker Hub:

Двухфакторная аутентификация

Docker Desktop позволяет входить в Docker Hub с помощью двухфакторной аутентификации.Двухфакторная аутентификация обеспечивает дополнительный уровень безопасности при доступе к вашей учетной записи Docker Hub.

Вы должны включить двухфакторную аутентификацию в Docker Hub перед входом в свою учетную запись Docker Hub через Docker Desktop. Инструкции см. В разделе Включение двухфакторной аутентификации для Docker Hub.

После включения двухфакторной аутентификации:

  1. Перейдите в меню рабочего стола Docker и выберите Войти / Создать идентификатор Docker .

  2. Введите свой Docker ID и пароль и нажмите Войти .

  3. После того, как вы успешно вошли в систему, Docker Desktop предложит вам ввести код аутентификации. Введите шестизначный код со своего телефона и нажмите Проверить .

После успешной аутентификации вы можете получить доступ к своим организациям и репозиториям прямо из меню Docker Desktop.

Добавление сертификатов TLS

Вы можете добавить доверенных центров сертификации (CA) к своему демону Docker для проверки сертификатов сервера реестра и клиентских сертификатов для аутентификации в реестрах.

Как добавить собственные сертификаты ЦС?

Docker Desktop поддерживает все доверенные центры сертификации (ЦС) (корневые или
средний). Docker распознает сертификаты, хранящиеся в Trust Root
Центры сертификации или промежуточные центры сертификации.

Docker Desktop создает пакет сертификатов всех доверенных пользователей ЦС на основе
хранилище сертификатов Windows и добавляет его в доверенные сертификаты Moby. Таким образом, если корпоративный сертификат SSL является доверенным для пользователя на хосте, Docker Desktop доверяет ему.

Для получения дополнительных сведений об установке корневого сертификата ЦС для реестра см.
Проверить клиент репозитория с сертификатами
в темах Docker Engine.

Как мне добавить клиентские сертификаты?

Вы можете добавить свои клиентские сертификаты
в ~ / .docker / certs.d / : /client.cert и
~ / .docker / certs.d / : /client.key . Вам не нужно продвигать свои сертификаты с помощью команд git .

Когда приложение Docker Desktop запускается, оно копирует
~ / .docker / certs.d в вашей системе Windows на /etc/docker/certs.d
каталог на Moby (виртуальная машина Docker Desktop, работающая на Hyper-V).

Вам необходимо перезапустить Docker Desktop после внесения любых изменений в связку ключей.
или в каталог ~ / .docker / certs.d , чтобы изменения вступили в силу.

Реестр не может быть указан как незащищенный реестр (см.
Docker Daemon).Docker Desktop игнорирует
сертификаты, перечисленные в незащищенных реестрах, и не отправляют клиенту
сертификаты. Такие команды, как docker, запускают , которые пытаются извлечь из реестра
создавать сообщения об ошибках в командной строке, а также в реестре.

Чтобы узнать больше о том, как настроить клиентский TLS-сертификат для проверки, см.
Проверить клиент репозитория с сертификатами
в темах Docker Engine.

Куда пойти дальше

windows, edge, tutorial, run, docker, local, machine

Сетевые функции в Docker Desktop для Windows

Расчетное время чтения: 4 минуты

Docker Desktop предоставляет несколько сетевых функций, облегчающих
использовать.

Особенности

Сквозная передача VPN

Docker Desktop может работать при подключении к VPN. Сделать это,
Docker Desktop перехватывает трафик из контейнеров и внедряет его в
Windows, как если бы она возникла из приложения Docker.

Отображение портов

При запуске контейнера с аргументом -p , например:

  $ docker run -p 80:80 -d nginx
  

Docker Desktop делает все, что запущено на порту 80 в контейнере (в
в данном случае nginx ), доступный на порту 80 локального хоста .В этом примере
порты хоста и контейнера совпадают. Что делать, если вам нужно указать другой
порт хоста? Если, например, у вас уже есть что-то, работающее на 80-м порту
ваш хост-компьютер, вы можете подключить контейнер к другому порту:

  $ docker run -p 8000: 80 -d nginx
  

Теперь соединения с localhost: 8000 отправляются на порт 80 в контейнере. В
синтаксис для -p : HOST_PORT: CLIENT_PORT .

Поддержка прокси HTTP / HTTPS

См. Прокси.

Известные ограничения, варианты использования и обходные пути

Ниже приводится сводка текущих ограничений рабочего стола Docker для Windows.
сетевой стек, а также некоторые идеи обходных путей.

Нет моста docker0 в Windows

Из-за того, как сеть реализована в Docker Desktop для Windows, вы не можете
см. интерфейс docker0 на хосте. Этот интерфейс фактически находится внутри
виртуальная машина.

Я не могу проверить связь с моими контейнерами

Docker Desktop для Windows не может направлять трафик в контейнеры Linux.Однако вы можете
пинговать контейнеры Windows.

IP-адресация для каждого контейнера невозможна

Сеть моста докеров (Linux) недоступна с хоста Windows.
Однако он работает с контейнерами Windows.

Варианты использования и обходные пути

Существуют два сценария, на которые влияют указанные выше ограничения:

Я хочу подключиться из контейнера к службе на хосте

Хост имеет изменяющийся IP-адрес (или его нет, если у вас нет доступа к сети).Мы рекомендуем вам подключиться к особому DNS-имени
host.docker.internal , который преобразуется во внутренний IP-адрес, используемый
хозяин. Это сделано для целей разработки и не будет работать в производственной среде за пределами Docker Desktop для Windows.

Вы также можете подключиться к шлюзу с помощью gateway.docker.internal .

Если вы установили Python на свой компьютер, используйте следующие инструкции в качестве примера для подключения из контейнера к службе на хосте:

  1. Выполните следующую команду, чтобы запустить простой HTTP-сервер на порту 8000.

    python -m http.server 8000

    Если вы установили Python 2.x, запустите python -m SimpleHTTPServer 8000 .

  2. Теперь запустите контейнер, установите curl и попробуйте подключиться к хосту с помощью следующих команд:

      $ docker run --rm -it alpine sh
     # apk добавить завиток
     # curl http: //host.docker.internal: 8000
     # выход
      
Я хочу подключиться к контейнеру из Windows

Проброс портов работает для localhost ; - опубликуйте , -p или -P все работают.Открытые из Linux порты перенаправляются на хост.

Наша текущая рекомендация — опубликовать порт или подключиться из другого
контейнер. Это то, что вам нужно сделать даже в Linux, если контейнер находится на
наложенная сеть, а не мостовая, поскольку они не маршрутизируются.

Например, для запуска веб-сервера nginx :

  $ docker run -d -p 80:80 --name webserver nginx
  

Для пояснения синтаксиса следующие две команды публикуют порт контейнера 80 в порт хоста 8000 :

  $ docker run --publish 8000: 80 - имя веб-сервера nginx

$ docker run -p 8000: 80 - имя веб-сервера nginx
  

Чтобы опубликовать все порты, используйте флаг -P .Например, следующая команда
запускает контейнер (в отдельном режиме), а флаг -P публикует все открытые порты
контейнер к случайным портам на хосте.

  $ docker run -d -P --name веб-сервер nginx
  

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

windows, сеть

Запустите свой первый контейнер Windows

  • 3 минуты на чтение

В этой статье

В этом разделе описывается, как запустить свой первый контейнер Windows после настройки среды, как описано в разделе Начало работы: подготовка Windows для контейнеров.Чтобы запустить контейнер, вы сначала устанавливаете базовый образ, который обеспечивает базовый уровень служб операционной системы для вашего контейнера. Затем вы создаете и запускаете образ контейнера, основанный на базовом образе. Подробности читайте дальше.

Установить базовый образ контейнера

Все контейнеры созданы из образов контейнеров. Microsoft предлагает на выбор несколько начальных образов, называемых базовыми образами (дополнительные сведения см. В разделе Базовые образы контейнеров). Эта процедура извлекает (загружает и устанавливает) легкий базовый образ сервера Nano Server.

  1. Откройте окно командной строки (например, встроенную командную строку, PowerShell или Windows Terminal), а затем выполните следующую команду, чтобы загрузить и установить базовый образ:

      docker pull mcr.microsoft.com/windows/nanoserver:ltsc2022
      

    Подсказка

    Если вы видите сообщение об ошибке, в котором говорится, что нет соответствующего манифеста для неизвестного в записях списка манифестов , убедитесь, что Docker не настроен для запуска контейнеров Linux.

  2. После завершения загрузки образа — пока ждете, прочтите лицензионное соглашение — проверьте его наличие в вашей системе, запросив локальный репозиторий образов Docker.Выполнение команды docker images возвращает список установленных образов.

    Вот пример вывода изображения Nano Server.

      РЕПОЗИТОРНЫЙ ТЕГ ИДЕНТИФИКАТОР ИЗОБРАЖЕНИЯ СОЗДАННЫЙ РАЗМЕР
    microsoft / nanoserver последнее 105d76d0f40e 4 дня назад 652 МБ
      

Запустить контейнер Windows

В этом простом примере будет создан и развернут образ контейнера «Hello World».Для наилучшего взаимодействия выполняйте эти команды в окне командной строки с повышенными привилегиями (но не используйте Windows PowerShell ISE — она ​​не работает для интерактивных сеансов с контейнерами, поскольку контейнеры кажутся зависшими).

  1. Запустите контейнер с интерактивным сеансом из образа наносервера , введя следующую команду в окне командной строки:

      docker run -it mcr.microsoft.com/windows/nanoserver:ltsc2022 cmd.exe
      
  2. После запуска контейнера окно командной строки меняет контекст на контейнер.Внутри контейнера мы создадим простой текстовый файл «Hello World», а затем выйдем из контейнера, введя следующие команды:

      эхо "Hello World!" > Hello.txt
    выход
      
  3. Получите идентификатор контейнера, из которого вы только что вышли, запустив команду docker ps:

      докер ps -a
      
  4. Создайте новый образ «HelloWorld», который включает изменения в первом запущенном контейнере. Для этого запустите команду docker commit, заменив на идентификатор вашего контейнера:

      docker commit  helloworld
      

    По завершении у вас есть собственный образ, содержащий сценарий hello world.Это можно увидеть с помощью команды docker images.

      образы докеров
      

    Вот пример вывода:

      РЕПОЗИТОРНЫЙ ТЕГ ИДЕНТИФИКАТОР ИЗОБРАЖЕНИЯ СОЗДАННЫЙ РАЗМЕР
    helloworld последнее a1064f2ec798 10 секунд назад 258MB
    mcr.microsoft.com/windows/nanoserver 2022 2b9c381d0911 3 недели назад 256MB
      
  5. Наконец, запустите новый контейнер с помощью команды docker run с параметром --rm , который автоматически удаляет контейнер после того, как командная строка (cmd.exe) останавливается.

      docker run --rm helloworld cmd.exe / s / c тип Hello.txt
      

    В результате Docker создал контейнер из образа HelloWorld, Docker запустил экземпляр cmd.exe в контейнере, а cmd.exe прочитал наш файл и отправил содержимое в оболочку. В качестве последнего шага Докер остановил и удалил контейнер.

Запуск контейнера Windows с помощью Windows Admin Center

Вы можете использовать Windows Admin Center для локального запуска контейнеров.В частности, вы используете расширение Containers экземпляра Windows Admin Center для запуска контейнеров. Сначала откройте узел контейнера, которым хотите управлять, и на панели инструментов выберите расширение Containers . Затем выберите вкладку Images внутри расширения контейнера в разделе Container Host .

Если на вашем хосте нет базового образа контейнера, выберите опцию Pull , чтобы открыть настройки Pull Container Image :

В настройках Pull Container Image укажите URL-адрес изображения и тег.Если вы не уверены, какой образ извлечь, Windows Admin Center предоставляет список распространенных образов от Microsoft. Вы также можете предоставить учетные данные для получения изображения из частного репозитория. После того, как вы заполните необходимую информацию, нажмите Pull . Центр администрирования Windows запустит процесс извлечения на узле контейнера. После завершения загрузки вы должны увидеть новое изображение на вкладке Images .

Выберите образ, который нужно запустить, и щелкните Выполнить .

В меню Run настройте конфигурацию контейнера, такую ​​как имя контейнера, тип изоляции, порты для публикации, а также выделение памяти и ЦП. Кроме того, вы можете добавить команды запуска Docker, которых нет в пользовательском интерфейсе, например -v для постоянного тома. Дополнительные сведения о доступных параметрах запуска Docker см. В документации.

После завершения настройки контейнера нажмите Выполнить . Вы можете увидеть статус запущенных контейнеров на вкладке Контейнеры :

Следующие шаги

Ваш первый докер-контейнер (Windows)

Сегодня я хотел бы показать вам, как запустить ваш первый док-контейнер, с какими проблемами мне пришлось столкнуться, чтобы его запустить, и какие команды вам могут понадобиться…

Сначала я подумал, что все очень просто.
Небольшая однострочная строка, и мы достигли цели ….

  # Запуск вашего первого контейнера докеров -> "Hello World"
Докер запускает привет-мир
  

Итак, проблема с контейнером, потому что он не соответствует операционной системе хоста ….

Очевидно, образ для «hello-world» предполагает операционную систему на базе Linux.

В итоге я пытаюсь здесь что-то построить самостоятельно.

Вытягивание изображения в Windows…

  # Проведение изображения вниз
docker pull mcr.microsoft.com/windows/nanoserver:1903
  

Отображение загруженных / созданных / установленных образов …

  # Вывод списка всех загруженных / созданных / установленных образов
образы докеров
# или
образ докера ls
# или
образы докеров -a
  

Удаление ненужных изображений ….

  # Удаление изображений
docker rmi <ИД ИЗОБРАЖЕНИЯ>
докер rmi 01ede58bc7b8

# Принудительное удаление изображений
докер rmi 01ede58bc7b8 -f
  

Запуск контейнера…

  # Пытаюсь запустить контейнер и подключиться к нему в интерактивном режиме
docker run -it mcr.microsoft.com/windows/nanoserver:1903 cmd.exe
  

Любопытно, что здесь тоже есть проблема совместимости, хотя образ основан на windows.

Попытка запустить другой контейнер Windows в зависимости от ядра сервера.

  # Вытягивание другого изображения
docker pull mcr.microsoft.com/windows/servercore:ltsc2019
# Пытаемся запустить контейнер
docker run -it mcr.microsoft.com/windows/servercore:ltsc2019 cmd.exe  

К сожалению, это снова приводит к той же ошибке ….

Я только что определил, какую именно версию Windows я использую.

  # Start cmd
cmd
вер
  

Попытка запустить другой контейнер Windows на основе ядра сервера (которое было идентифицировано ранее).

Снова потянуть вниз …

  # Потянуть изображение вниз
docker pull mcr.microsoft.com/windows/nanoserver:1903
  
  # Вытягивание другого изображения
докер тянуть mcr.microsoft.com/windows/servercore:10.0.19041.264
# Пометка изображения
тег докера mcr.microsoft.com/windows/servercore:10.0.19041.264 microsoft / windowsservercore
  

Запуск контейнера ….

  # Пытаемся запустить контейнер и подключиться к нему в интерактивном режиме
docker run -it microsoft / windowsservercore cmd.exe
  

Теперь это сработало. Поэтому очень важно, чтобы контейнер соответствовал хост-системе.

Список всех контейнеров ….

  # Отображение всех контейнеров и связанного статуса
докер ps -a
  

Создание собственного образа…

  Создание нового образа из запущенного измененного контейнера
docker commit  helloworld
  

Повторное отображение загруженных / созданных / установленных образов …

  # Вывод списка всех установленных / созданных / загруженных образов
образы докеров
  

Удаление ненужных контейнеров …

  # Удаление работающего контейнера
докер RM 23933d090f26
  

Запуск нового образа в новом контейнере …

  # Запуск нового образа
docker run --rm helloworld cmd.exe / s / c типа Hello.txt
  

Источник:

Запустите свой первый контейнер Windows

Краткое руководство по развертыванию контейнера

Исходный код

Основы контейнеров Windows

Изучите докер с помощью онлайн-тренингов на сайте training.play-with-docker.com

manomarksPlay with Docker classroom

404 | Микро Фокус

  • Профессиональные услуги

    Сформируйте свою стратегию и преобразуйте гибридную ИТ-среду.


  • Профессиональные услуги по продуктам
  • Аналитика и большие данные

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

  • Компьютерная безопасность

    Помогите вам быстрее реагировать и получить конкурентное преимущество благодаря гибкости предприятия.

  • DevOps

    Ускорьте получение результатов гибридного облака с помощью услуг по консультированию, трансформации и внедрению.

  • Консультации по цепочке создания стоимости IT4IT

    Службы управления приложениями, которые позволяют поручить управление решениями экспертам, разбирающимся в вашей среде.

  • Управление доставкой приложений

    Услуги стратегического консалтинга для разработки вашей программы цифровой трансформации.

  • Жизненный цикл мобильного приложения

    Полнофункциональное моделирование сценариев использования с предустановленной интеграцией всего портфеля программного обеспечения Micro Focus, демонстрирующее реальный сценарий использования

  • Управление гибридным облаком и брокерские услуги

    Услуги экспертной аналитики безопасности, которые помогут вам быстро спроектировать, развернуть и проверить реализацию технологии безопасности Micro Focus.

  • Автоматизация ЦОД

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

  • Управление операциями

    Анализируйте большие данные с помощью аналитики в реальном времени и ищите неструктурированные данные.

  • Управление услугами

    Анализируйте большие данные с помощью аналитики в реальном времени и ищите неструктурированные данные.

  • Vertica

    Анализируйте большие данные с помощью аналитики в реальном времени и ищите неструктурированные данные.

  • Глобальная аутентификация продукта

    Мобильные услуги, которые обеспечивают производительность и ускоряют вывод на рынок без ущерба для качества.

  • Управляемые службы

    Анализируйте большие данные с помощью аналитики в реальном времени и ищите неструктурированные данные.

  • Модельные офисы

    Комплексные услуги по работе с большими данными для продвижения вашего предприятия.

  • Учебное пособие по Docker для начинающих

    Введение

    Что такое докер?

    Википедия определяет Docker как

    — проект с открытым исходным кодом, который автоматизирует развертывание программных приложений внутри контейнеров , обеспечивая дополнительный уровень абстракции и автоматизации виртуализации на уровне ОС в Linux.

    Вау! Это полный рот. Проще говоря, Docker — это инструмент, который позволяет разработчикам, системным администраторам и т. Д. Легко развертывать свои приложения в песочнице (называемой контейнерами ) для запуска в операционной системе хоста, то есть Linux. Ключевым преимуществом Docker является то, что он позволяет пользователям упаковать приложение со всеми его зависимостями в стандартизированный модуль для разработки программного обеспечения. В отличие от виртуальных машин, контейнеры не имеют больших накладных расходов и, следовательно, позволяют более эффективно использовать базовую систему и ресурсы.

    Что такое контейнеры?

    Сегодня отраслевым стандартом является использование виртуальных машин (ВМ) для запуска программных приложений. Виртуальные машины запускают приложения внутри гостевой операционной системы, которая работает на виртуальном оборудовании, работающем под управлением ОС хоста сервера.

    Виртуальные машины

    отлично подходят для обеспечения полной изоляции процессов для приложений: существует очень мало способов, которыми проблема в операционной системе хоста может повлиять на программное обеспечение, работающее в гостевой операционной системе, и наоборот. Но эта изоляция обходится очень дорого — вычислительные затраты, затрачиваемые на виртуализацию оборудования для использования гостевой ОС, значительны.

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

    Зачем нужны контейнеры?

    Контейнеры

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

    С точки зрения операций, помимо переносимости, контейнеры также предоставляют более детальный контроль над ресурсами, повышая эффективность вашей инфраструктуры, что может привести к лучшему использованию ваших вычислительных ресурсов.

    Google Trends для Docker

    Благодаря этим преимуществам контейнеры (и Docker) получили широкое распространение.Такие компании, как Google, Facebook, Netflix и Salesforce, используют контейнеры, чтобы сделать большие группы инженеров более продуктивными и улучшить использование вычислительных ресурсов. Фактически, Google считает, что контейнеры избавили от необходимости в центре обработки данных.

    Чему меня научит этот учебник?

    Этот учебник призван стать универсальным средством, позволяющим запачкать руки с помощью Docker. Помимо демистификации ландшафта Docker, он даст вам практический опыт создания и развертывания собственных веб-приложений в облаке.Мы будем использовать Amazon Web Services для развертывания статического веб-сайта и двух динамических веб-приложений на EC2 с использованием Elastic Beanstalk и Elastic Container Service. Даже если у вас нет предыдущего опыта развертывания, это руководство должно быть всем, что вам нужно для начала работы.


    Начало работы

    Этот документ состоит из нескольких разделов, каждый из которых объясняет определенный аспект Docker. В каждом разделе мы будем вводить команды (или писать код). Весь код, использованный в руководстве, доступен в репозитории Github.

    Примечание. В этом руководстве используется Docker версии 18.05.0-ce . Если вы обнаружите, что какая-либо часть учебника несовместима с будущей версией, поднимите вопрос. Спасибо!

    Предварительные требования

    Для этого учебника не требуются какие-либо специальные навыки, кроме базового удобства работы с командной строкой и использования текстового редактора. В этом руководстве используется git clone для локального клонирования репозитория. Если в вашей системе не установлен Git, либо установите его, либо не забудьте вручную загрузить zip-файлы с Github.Предыдущий опыт разработки веб-приложений будет полезен, но не обязателен. По мере продвижения по руководству мы будем использовать несколько облачных сервисов. Если вы хотите продолжить, создайте учетную запись на каждом из этих веб-сайтов:

    Настройка компьютера

    Установка всех инструментов на вашем компьютере может быть сложной задачей, но, к счастью, поскольку Docker стал стабильным, настроить Docker и запустить его на вашей любимой ОС стало очень легко.

    До нескольких выпусков назад запуск Docker в OSX и Windows был довольно сложной задачей.Однако в последнее время Docker вложил значительные средства в улучшение процесса адаптации своих пользователей к этим ОС, поэтому запуск Docker теперь — легкая прогулка. Руководство по началу работы с по Docker содержит подробные инструкции по настройке Docker на Mac, Linux и Windows.

    По завершении установки Docker протестируйте установку Docker, выполнив следующее:

      $ docker run hello-world
    
    Привет из Докера.
    Это сообщение показывает, что ваша установка работает правильно....  

    Привет, мир

    Игра с Busybox

    Теперь, когда у нас все настроено, пришло время испачкать руки. В этом разделе мы собираемся запустить контейнер Busybox в нашей системе и познакомиться с командой docker run .

    Для начала запустим в нашем терминале:

      $ docker pull busybox  

    Примечание. В зависимости от того, как вы установили докер в своей системе, вы можете увидеть ошибку , в которой отказано в разрешении , после выполнения указанной выше команды.Если вы используете Mac, убедитесь, что движок Docker запущен. Если вы работаете в Linux, добавьте к командам docker префикс sudo . В качестве альтернативы вы можете создать группу докеров, чтобы избавиться от этой проблемы.

    Команда pull извлекает образ busybox из реестра Docker и сохраняет его в нашей системе. Вы можете использовать команду docker images , чтобы просмотреть список всех образов в вашей системе.

      $ образы докеров
    РЕПОЗИТОРНЫЙ ТЕГ ИДЕНТИФИКАТОР ИЗОБРАЖЕНИЯ СОЗДАН ВИРТУАЛЬНЫЙ РАЗМЕР
    busybox latest c51f86c28340 4 недели назад 1.109 МБ  

    Запуск Docker

    Отлично! Давайте теперь запустим контейнер Docker на основе этого образа. Для этого мы собираемся использовать всемогущую команду docker run .

      $ docker run busybox
    $  

    Подождите, ничего не произошло! Это ошибка? Ну нет. За кулисами произошло много всего. Когда вы вызываете run , клиент Docker находит образ (в данном случае busybox), загружает контейнер и затем запускает команду в этом контейнере.Когда мы запускаем docker run busybox , мы не предоставляли команду, поэтому контейнер загрузился, выполнил пустую команду и затем вышел. Ну да — облом вроде. Попробуем что-нибудь поинтереснее.

      $ docker run busybox echo "привет от busybox"
    привет от busybox  

    Красиво — наконец-то мы видим какой-то вывод. В этом случае клиент Docker послушно выполнил команду echo в нашем контейнере busybox, а затем вышел из нее. Если вы заметили, все это произошло довольно быстро.Представьте, что вы загружаете виртуальную машину, выполняете команду, а затем завершаете ее работу. Теперь вы знаете, почему говорят, что контейнеры быстрые! Хорошо, теперь пора увидеть команду docker ps . Команда docker ps показывает все запущенные в данный момент контейнеры.

      $ докер пс
    КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАЕТ СОСТОЯНИЕ ИМЕНА ПОРТОВ  

    Поскольку ни один контейнер не запущен, мы видим пустую строку.Попробуем более полезный вариант: docker ps -a

      $ docker ps -a
    КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАЕТ СОСТОЯНИЕ НАЗВАНИЯ ПОРТОВ
    305297d7a235 busybox "uptime" 11 минут назад Завершился (0) 11 минут назад distracted_goldstine
    ff0a5c3750b9 busybox "sh" 12 минут назад Завершился (0) 12 минут назад elated_ramanujan
    14e5bd11d164 hello-world "/ hello" 2 минуты назад Завершился (0) 2 минуты назад thirsty_euclid  

    Итак, то, что мы видим выше, — это список всех запущенных нами контейнеров.Обратите внимание, что столбец STATUS показывает, что эти контейнеры закрылись несколько минут назад.

    Вы, наверное, задаетесь вопросом, есть ли способ выполнить в контейнере более одной команды. Давайте попробуем это сейчас:

      $ docker run -it busybox sh
    /
    bin dev и т. д. home proc root sys tmp usr var
    /
     05:45:21 до 5:58, 0 пользователей, средняя нагрузка: 0,00, 0,01, 0,04  

    Выполнение команды run с флагами -it подключает нас к интерактивному tty в контейнере.Теперь мы можем запускать в контейнере столько команд, сколько захотим. Найдите время, чтобы выполнить свои любимые команды.

    Опасная зона : Если вы любите приключения, вы можете попробовать rm -rf bin в контейнере. Убедитесь, что вы запускаете эту команду в контейнере, а , а не на своем ноутбуке / настольном компьютере. Это приведет к тому, что любые другие команды, такие как ls , uptime , не будут работать. Как только все перестанет работать, вы можете выйти из контейнера (введите exit и нажмите Enter), а затем снова запустить его с помощью команды docker run -it busybox sh .Поскольку Docker каждый раз создает новый контейнер, все должно снова заработать.

    На этом завершается бурный тур по мощной команде docker run , которая, скорее всего, будет той командой, которую вы будете использовать чаще всего. Имеет смысл потратить некоторое время на то, чтобы освоиться с этим. Чтобы узнать больше о run , используйте команду docker run --help , чтобы увидеть список всех поддерживаемых им флагов. По мере продвижения мы увидим еще несколько вариантов docker run .

    Прежде чем двигаться дальше, давайте быстро поговорим об удалении контейнеров. Выше мы видели, что мы все еще можем видеть остатки контейнера даже после выхода, запустив docker ps -a . На протяжении всего этого руководства вы будете запускать docker run несколько раз, и оставление бродячих контейнеров будет занимать место на диске. Следовательно, как правило, я очищаю контейнеры после того, как закончу с ними. Для этого вы можете запустить команду docker rm . Просто скопируйте идентификаторы контейнеров сверху и вставьте их вместе с командой.

      $ докер rm 305297d7a235 ff0a5c3750b9
    305297d7a235
    ff0a5c3750b9  

    При удалении вы должны увидеть, как вам будут возвращены идентификаторы. Если вам нужно удалить сразу несколько контейнеров, копирование идентификаторов может оказаться утомительным занятием. В этом случае вы можете просто запустить —

      $ docker rm $ (docker ps -a -q -f status = exited)  

    Эта команда удаляет все контейнеры со статусом , завершился . Если вам интересно, флаг -q возвращает только числовые идентификаторы, а -f фильтрует вывод на основе предоставленных условий.Последнее, что будет полезно, — это флаг --rm , который можно передать в docker run , который автоматически удаляет контейнер при выходе из него. Для однократных запусков докеров очень полезен флаг --rm .

    В более поздних версиях Docker для достижения того же эффекта можно использовать команду docker container prune .

      $ докер контейнер для чернослива
    ПРЕДУПРЕЖДЕНИЕ! Это удалит все остановленные контейнеры.
    Вы уверены что хотите продолжить? [да / нет] г
    Удаленные контейнеры:
    4a7f7eebae0f63178aff7eb0aa39f0627a203ab2df258c1a00b456cf20063
    f98f9c2aa1eaf727e4ec9c0283bcaa4762fbdba7f26191f26c97f640

    Общая мелиорированная площадь: 212 B

    Наконец, вы также можете удалить изображения, которые вам больше не нужны, запустив docker rmi .

    Терминология

    В последнем разделе мы использовали много специфичного для Docker жаргона, который некоторых может сбить с толку. Итак, прежде чем мы двинемся дальше, позвольте мне прояснить некоторую терминологию, которая часто используется в экосистеме Docker.

    • Изображения — Чертежи нашего приложения, которые составляют основу контейнеров. В приведенной выше демонстрации мы использовали команду docker pull для загрузки образа busybox .
    • Контейнеры — создаются из образов Docker и запускают собственное приложение.Мы создаем контейнер, используя docker run , который мы сделали, используя загруженный нами образ busybox. Список запущенных контейнеров можно увидеть с помощью команды docker ps .
    • Docker Daemon — фоновая служба, работающая на хосте, которая управляет сборкой, запуском и распространением контейнеров Docker. Демон — это процесс, который выполняется в операционной системе, с которой общаются клиенты.
    • Docker Client — инструмент командной строки, который позволяет пользователю взаимодействовать с демоном.В более общем плане могут быть и другие формы клиентов, такие как Kitematic, которые предоставляют пользователям графический интерфейс.
    • Docker Hub — Реестр образов Docker. Вы можете рассматривать реестр как каталог всех доступных образов Docker. При необходимости можно разместить собственные реестры Docker и использовать их для получения образов.

    Веб-приложения с Docker

    Отлично! Итак, теперь мы посмотрели на docker run , поигрались с контейнером Docker, а также поняли некоторую терминологию.Вооружившись всеми этими знаниями, мы готовы приступить к реальной работе, то есть к развертыванию веб-приложений с помощью Docker!

    Статические сайты

    Начнем с маленьких шагов. Первое, что мы собираемся рассмотреть, это то, как мы можем запустить абсолютно простой статический веб-сайт. Мы собираемся получить образ Docker из Docker Hub, запустить контейнер и посмотреть, насколько легко запустить веб-сервер.

    Начнем. Образ, который мы собираемся использовать, представляет собой одностраничный веб-сайт, который я уже создал для этой демонстрации и размещен в реестре — prakhar1989 / static-site .Мы можем загрузить и запустить образ прямо за один раз, используя docker run . Как отмечалось выше, флаг --rm автоматически удаляет контейнер при выходе.

      $ docker run --rm prakhar1989 / static-site  

    Поскольку образ не существует локально, клиент сначала извлекает образ из реестра, а затем запускает образ. Если все пойдет хорошо, вы должны увидеть сообщение Nginx is running ... в вашем терминале. Хорошо, теперь, когда сервер запущен, как увидеть веб-сайт? На каком порту он работает? И что еще более важно, как получить доступ к контейнеру непосредственно с нашего хост-компьютера? Нажмите Ctrl + C, чтобы остановить контейнер.

    Что ж, в этом случае клиент не предоставляет никаких портов, поэтому нам нужно повторно запустить команду docker run для публикации портов. Пока мы это делаем, мы также должны найти способ, чтобы наш терминал не был привязан к работающему контейнеру. Таким образом, вы можете закрыть свой терминал и оставить контейнер работающим. Это называется режимом , отсоединенным, .

      $ docker run -d -P --name static-site prakhar1989 / static-site
    e61d12292d69556eabe2a44c16cbd54486b2527e2ce4f95438e504afb7b02810  

    В приведенной выше команде -d отсоединит наш терминал, -P опубликует все открытые порты в случайные порты и, наконец, --name соответствует имени, которое мы хотим дать.Теперь мы можем увидеть порты, выполнив команду docker port [CONTAINER] command

      $ порт докера static-site
    80 / TCP -> 0.0.0.0:32769
    443 / TCP -> 0.0.0.0:32768  

    Вы можете открыть http: // localhost: 32769 в своем браузере.

    Примечание. Если вы используете docker-toolbox, вам может потребоваться использовать docker-machine ip default для получения IP.

    Вы также можете указать настраиваемый порт, на который клиент будет перенаправлять подключения к контейнеру.

      $ docker run -p 8888: 80 prakhar1989 / статический сайт
    Nginx работает ...  

    Чтобы остановить отсоединенный контейнер, запустите docker stop , указав идентификатор контейнера. В этом случае мы можем использовать имя static-site , которое мы использовали для запуска контейнера.

      $ docker stop static-site
    статический сайт  

    Я уверен, вы согласны, что это было очень просто. Чтобы развернуть это на реальном сервере, вам просто нужно установить Docker и выполнить указанную выше команду Docker.Теперь, когда вы увидели, как запустить веб-сервер внутри образа Docker, вы, должно быть, задаетесь вопросом — как мне создать свой собственный образ Docker? Это вопрос, который мы рассмотрим в следующем разделе.

    Образы Docker

    Мы уже рассматривали образы и раньше, но в этом разделе мы углубимся в то, что такое образы Docker, и создадим свой собственный образ! Наконец, мы также будем использовать этот образ для локального запуска нашего приложения и, наконец, развернуть его на AWS, чтобы поделиться им с нашими друзьями! В восторге? Большой! Давайте начнем.

    Docker-образов являются основой контейнеров. В предыдущем примере мы вытащили образ Busybox из реестра и попросили клиент Docker запустить контейнер , основанный на на этом образе. Чтобы просмотреть список образов, доступных локально, используйте команду docker images .

      $ образы докеров
    РЕПОЗИТОРНЫЙ ТЕГ ИДЕНТИФИКАТОР ИЗОБРАЖЕНИЯ СОЗДАН ВИРТУАЛЬНЫЙ РАЗМЕР
    prakhar1989 / catnip последнее c7ffb5626a50 2 часа назад 697.9 МБ
    prakhar1989 / static-site latest b270625a1631 21 часов назад 133.9 МБ
    python 3-onbuild cf4002b2c383 5 дней назад 688,8 МБ
    martin / docker-cleanup-volume последнее b42990daaca2 7 недель назад 22,14 МБ
    ubuntu latest e9ae3c220b23 7 недель назад 187,9 МБ
    busybox latest c51f86c28340 9 недель назад 1.109 МБ
    hello-world последнее 0a6ba66e537a 11 недель назад 960 B  

    Выше приведен список образов, которые я извлек из реестра, а также образы, которые я создал сам (мы вскоре увидим, как это сделать). МЕТКА относится к конкретному снимку изображения, а ИДЕНТИФИКАТОР ИЗОБРАЖЕНИЯ является соответствующим уникальным идентификатором для этого изображения.

    Для простоты вы можете представить изображение как репозиторий git — изображения могут быть зафиксированы с изменениями и иметь несколько версий.Если вы не укажете конкретный номер версии, клиент будет использовать по умолчанию , последняя версия . Например, вы можете вытащить определенную версию ubuntu image

      $ docker pull ubuntu: 18.04  

    Чтобы получить новый образ Docker, вы можете либо получить его из реестра (например, Docker Hub), либо создать свой собственный. В Docker Hub доступны десятки тысяч образов. Вы также можете искать изображения прямо из командной строки, используя docker search .

    Важное различие, о котором следует помнить, когда дело касается изображений, — это разница между базовыми и дочерними изображениями.

    • Базовые образы — это образы, у которых нет родительского образа, обычно это образы с такой ОС, как ubuntu, busybox или debian.

    • Дочерние образы — это образы, основанные на базовых образах и добавляющие дополнительные функции.

    Далее идут официальные и пользовательские образы, которые могут быть как базовыми, так и дочерними.

    • Официальные образы — это образы, которые официально поддерживаются и поддерживаются людьми в Docker. Обычно это одно слово. В приведенном выше списке изображений изображения python , ubuntu , busybox и hello-world являются официальными изображениями.

    • Изображения пользователей — это изображения, созданные и опубликованные такими пользователями, как вы и я. Они основаны на базовых образах и добавляют дополнительную функциональность.Обычно они имеют формат имя-пользователя / изображения .

    Наше первое изображение

    Теперь, когда мы лучше понимаем изображения, пришло время создать наши собственные. Нашей целью в этом разделе будет создание образа, который помещает в песочницу простое приложение Flask. Для целей этого семинара я уже создал забавное маленькое приложение Flask, которое отображает случайную кошку .gif при каждой загрузке — потому что вы знаете, кто не любит кошек? Если вы еще этого не сделали, продолжайте и клонируйте репозиторий локально, например,

      $ git clone https: // github.com / prakhar1989 / docker-curriculum.git
    $ cd docker-curriculum / flask-app  

    Это должно быть клонировано на машине, на которой вы выполняете команды докера, а , а не внутри контейнера докера.

    Теперь следующим шагом будет создание изображения с помощью этого веб-приложения. Как упоминалось выше, все пользовательские изображения основаны на базовом изображении. Поскольку наше приложение написано на Python, базовым образом, который мы собираемся использовать, будет Python 3.

    Dockerfile

    Dockerfile — это простой текстовый файл, содержащий список команд, которые клиент Docker вызывает при создании образа.Это простой способ автоматизировать процесс создания изображений. Самое приятное то, что команды, которые вы пишете в Dockerfile, на почти на идентичны их эквивалентным командам Linux. Это означает, что вам действительно не нужно изучать новый синтаксис для создания собственных файлов докеров.

    Каталог приложения действительно содержит Dockerfile, но, поскольку мы делаем это впервые, мы создадим его с нуля. Для начала создайте новый пустой файл в нашем любимом текстовом редакторе и сохраните его в той же папке , что и приложение flask, под именем Dockerfile .

    Начнем с указания нашего базового образа. Для этого используйте ключевое слово FROM

      ОТ python: 3  

    Следующим шагом обычно является написание команд копирования файлов и установки зависимостей. Сначала мы устанавливаем рабочий каталог, а затем копируем все файлы для нашего приложения.

     
    РАБОЧИЙ КАТАЛОГ / usr / src / app
    
    
    КОПИРОВАТЬ. .  

    Теперь, когда у нас есть файлы, мы можем установить зависимости.

     
    RUN pip install --no-cache-dir -r requirements.txt  

    Следующее, что нам нужно указать, — это номер порта, который необходимо предоставить. Поскольку наше приложение flask работает на порту 5000 , мы укажем именно это.

      EXPOSE 5000  

    Последний шаг — написать команду для запуска приложения, которая просто — python ./app.py . Для этого мы используем команду CMD —

      CMD ["питон", "./app.py"]  

    Основная цель CMD — сообщить контейнеру, какую команду он должен запускать при запуске.Итак, наш Dockerfile готов. Вот как это выглядит —

      ОТ python: 3
    
    
    РАБОЧИЙ КАТАЛОГ / usr / src / app
    
    
    КОПИРОВАТЬ. .
    
    
    ЗАПУСТИТЬ pip install --no-cache-dir -r requirements.txt
    
    
    EXPOSE 5000
    
    
    CMD ["питон", "./app.py"]  

    Теперь, когда у нас есть наш Dockerfile , мы можем создать наш образ. Команда docker build выполняет тяжелую работу по созданию образа Docker из файла Dockerfile .

    В разделе ниже показаны результаты выполнения того же самого.Прежде чем запускать команду самостоятельно (не забывайте точку), обязательно замените мое имя пользователя на свое. Это имя пользователя должно быть тем же, которое вы создали при регистрации в Docker Hub. Если вы еще этого не сделали, пожалуйста, создайте учетную запись. Команда docker build довольно проста — она ​​принимает необязательное имя тега с -t и расположение каталога, содержащего Dockerfile .

      $ docker build -t yourusername / catnip.Отправка контекста сборки демону Docker 8,704 КБ
    Шаг 1: ОТ python: 3
    
    Шаг 1. Скопируйте файл requirements.txt / usr / src / app /
     ---> Использование кеша
    Шаг 1: ЗАПУСТИТЕ pip install --no-cache-dir -r requirements.txt
     ---> Использование кеша
    Шаг 1: КОПИРОВАТЬ. / USR / SRC / приложение
     ---> 1d61f639ef9e
    Снятие промежуточного контейнера 4de6ddf5528c
    Шаг 2: ЭКСПОЗИРУЙТЕ 5000
     ---> Запуск в 12cfcf6d67ee
     ---> f423c2f179d1
    Снятие промежуточного контейнера 12cfcf6d67ee
    Шаг 3: CMD python ./app.py
     ---> Запуск в f01401a5ace9
     ---> 13e87ed1fbc2
    Снятие промежуточного контейнера f01401a5ace9
    Успешно построено 13e87ed1fbc2  

    Если у вас нет образа python: 3 , клиент сначала извлечет образ, а затем создаст его.Следовательно, ваш результат выполнения команды будет отличаться от моего. Если все прошло удачно, ваш образ должен быть готов! Запустите docker images и посмотрите, отображается ли ваше изображение.

    Последний шаг в этом разделе — запустить образ и посмотреть, действительно ли он работает (заменив мое имя пользователя на ваше).

      $ docker run -p 8888: 5000 имя пользователя / кошачья мята
     * Запуск по http://0.0.0.0:5000/ (для выхода нажмите CTRL + C)  

    Команда, которую мы только что выполнили, использовала порт 5000 для сервера внутри контейнера и предоставила его извне через порт 8888.Перейдите по URL-адресу с портом 8888, где должно быть размещено ваше приложение.

    Поздравляем! Вы успешно создали свой первый образ докера.

    Docker на AWS

    Что хорошего в приложении, которым нельзя поделиться с друзьями? Итак, в этом разделе мы увидим, как мы можем развернуть наше замечательное приложение в облаке, чтобы мы могли поделиться им с нашими друзьями! Мы собираемся использовать AWS Elastic Beanstalk, чтобы запустить наше приложение за несколько кликов. Мы также увидим, насколько легко сделать наше приложение масштабируемым и управляемым с помощью Beanstalk!

    Docker push

    Первое, что нам нужно сделать перед развертыванием нашего приложения в AWS, — это опубликовать наш образ в реестре, к которому AWS может получить доступ.Есть много разных реестров Docker, которые вы можете использовать (вы даже можете разместить свой собственный). А пока воспользуемся Docker Hub для публикации образа.

    Если вы запускаете изображение впервые, клиент попросит вас войти в систему. Предоставьте те же учетные данные, которые вы использовали для входа в Docker Hub.

      $ докер логин
    Войдите в систему со своим идентификатором Docker, чтобы отправлять и получать изображения из Docker Hub. Если у вас нет Docker ID, перейдите на https://hub.docker.com, чтобы создать его.
    Имя пользователя: yourusername
    Пароль:
    ПРЕДУПРЕЖДЕНИЕ! Ваш пароль будет храниться в незашифрованном виде в / Users / yourusername /.докер / config.json
    Настройте помощник по учетным данным, чтобы удалить это предупреждение. Видеть
    https://docs.docker.com/engine/reference/commandline/login/credential-store
    
    Войти успешно  

    Для публикации просто введите команду ниже, не забывая заменить имя тега изображения выше на свое. Важно иметь формат yourusername / image_name , чтобы клиент знал, где публиковать.

      $ docker push yourusername / catnip  

    Как только это будет сделано, вы сможете просмотреть свой образ в Docker Hub.Например, вот веб-страница моего изображения.

    Примечание. Прежде чем мы продолжим, я хотел бы уточнить, что не обязательно, , размещать образ в общедоступном реестре (или любом другом реестре) для развертывания в AWS. Если вы пишете код для следующего запуска единорога стоимостью в миллион долларов, вы можете полностью пропустить этот шаг. Причина, по которой мы публикуем наши образы публично, заключается в том, что это упрощает развертывание за счет пропуска нескольких промежуточных шагов настройки.

    Теперь, когда ваш образ размещен в сети, любой, у кого установлен докер, может играть с вашим приложением, набрав всего одну команду.

      $ docker run -p 8888: 5000 имя пользователя / кошачья мята  

    Если вы раньше ломали голову над настройкой локальных сред разработки / совместного использования конфигурации приложений, вы прекрасно знаете, насколько это круто. Вот почему Докер такой крутой!

    Бобовый стебель

    AWS Elastic Beanstalk (EB) — это PaaS (платформа как услуга), предлагаемая AWS.Если вы использовали Heroku, Google App Engine и т. Д., Вы почувствуете себя как дома. Как разработчик, вы просто говорите EB, как запускать ваше приложение, а он позаботится обо всем остальном, включая масштабирование, мониторинг и даже обновления. В апреле 2014 года EB добавила поддержку для запуска развертываний Docker с одним контейнером, что мы будем использовать для развертывания нашего приложения. Хотя EB имеет очень интуитивно понятный интерфейс командной строки, он требует некоторой настройки, и для простоты мы будем использовать веб-интерфейс для запуска нашего приложения.

    Для продолжения вам понадобится работающая учетная запись AWS.Если вы еще этого не сделали, сделайте это сейчас — вам нужно будет ввести данные своей кредитной карты. Но не волнуйтесь, это бесплатно, и все, что мы делаем в этом уроке, также будет бесплатным! Давайте начнем.

    Вот шаги:

    • Войдите в консоль AWS.
    • Щелкните «Эластичный бобовый стебель». Он будет в разделе вычислений в левом верхнем углу. Кроме того, вы можете получить доступ к консоли Elastic Beanstalk.
    • Нажмите «Создать новое приложение» в правом верхнем углу.
    • Дайте своему приложению запоминающееся (но уникальное) имя и предоставьте (необязательно) описание
    • На экране New Environment создайте новую среду и выберите Web Server Environment .
    • Введите информацию о среде, выбрав домен. Этим URL-адресом вы поделитесь со своими друзьями, поэтому убедитесь, что его легко запомнить.
    • В разделе базовой конфигурации. Выберите Docker из предопределенной платформы .
    • Теперь нам нужно загрузить код нашего приложения. Но поскольку наше приложение упаковано в контейнер Docker, нам просто нужно сообщить EB о нашем контейнере. Откройте файл Dockerrun.aws.json , расположенный в папке flask-app , и измените Name изображения на имя вашего изображения.Не волнуйтесь, я вскоре объясню содержимое файла. Когда вы закончите, установите переключатель «Загрузить свой код», выберите этот файл и нажмите «Загрузить».
    • Теперь нажмите «Создать среду». На последнем экране, который вы увидите, будет несколько счетчиков, указывающих, что ваша среда настраивается. Обычно первая настройка занимает около 5 минут.

    Пока мы ждем, давайте быстро посмотрим, что содержится в файле Dockerrun.aws.json . По сути, этот файл представляет собой специальный файл AWS, который сообщает EB о конфигурации нашего приложения и докера.

      {
      "AWSEBDockerrunVersion": "1",
      "Изображение": {
        «Имя»: «prakhar1989 / кошачья мята»,
        «Обновление»: «правда»
      },
      «Порты»: [
        {
          «КонтейнерПорт»: 5000, г.
          «HostPort»: 8000
        }
      ],
      «Ведение журнала»: «/ var / log / nginx»
    }  

    Файл должен быть понятным, но вы всегда можете обратиться к официальной документации для получения дополнительной информации. Мы предоставляем имя образа, который должен использовать EB, а также порт, который должен открывать контейнер.

    Надеюсь, к настоящему времени наш экземпляр должен быть готов.Перейдите на страницу EB, и вы должны увидеть зеленую галочку, указывающую, что ваше приложение работает и работает.

    Откройте URL-адрес в своем браузере, и вы увидите приложение во всей красе. Не стесняйтесь отправлять по электронной почте / IM / Snapchat эту ссылку своим друзьям и семье, чтобы они тоже могли насладиться несколькими гифками с кошками.

    Очистка

    После того, как вы закончите наслаждаться великолепием своего приложения, не забудьте завершить работу среды, чтобы не платить за дополнительные ресурсы.

    Поздравляем! Вы развернули свое первое приложение Docker! Это может показаться большим количеством шагов, но с помощью инструмента командной строки для EB вы можете почти имитировать функциональность Heroku за несколько нажатий клавиш! Надеюсь, вы согласны с тем, что Docker избавляет от многих проблем, связанных с созданием и развертыванием приложений в облаке. Я бы посоветовал вам прочитать документацию AWS по одноконтейнерным средам Docker, чтобы понять, какие функции существуют.

    В следующей (и последней) части руководства мы немного повысим ставку и развернем приложение, которое более точно имитирует реальный мир; приложение с постоянным уровнем внутреннего хранилища.Давайте прямо к делу!


    Многоконтейнерные среды

    В последнем разделе мы увидели, насколько легко и весело запускать приложения с помощью Docker. Мы начали с простого статического веб-сайта, а затем попробовали приложение Flask. И то, и другое мы могли запускать локально и в облаке с помощью всего нескольких команд. У обоих этих приложений было одно общее: они работали в одном контейнере .

    Те из вас, у кого есть опыт использования сервисов в производственной среде, знают, что в наши дни с приложениями обычно не все так просто.Почти всегда задействована база данных (или любое другое постоянное хранилище). Такие системы, как Redis и Memcached, стали de rigueur большинства архитектур веб-приложений. Следовательно, в этом разделе мы собираемся потратить некоторое время на изучение того, как Dockerize приложения, которые зависят от запуска различных сервисов.

    В частности, мы увидим, как мы можем запускать и управлять многоконтейнерными средами Docker и управлять ими. Вы спросите, почему именно мультиконтейнер? Что ж, одним из ключевых моментов Docker является то, как он обеспечивает изоляцию.Идея объединения процесса с его зависимостями в песочнице (называемой контейнерами) делает это таким мощным.

    Точно так же, как это хорошая стратегия для разделения уровней приложений, разумно хранить контейнеры для каждой из служб отдельно. У каждого уровня, вероятно, будут разные потребности в ресурсах, и эти потребности могут расти с разной скоростью. Разделив уровни на разные контейнеры, мы можем составить каждый уровень, используя наиболее подходящий тип экземпляра на основе различных потребностей в ресурсах.Это также очень хорошо сочетается со всем движением микросервисов, что является одной из основных причин, почему Docker (или любая другая контейнерная технология) находится на переднем крае современных архитектур микросервисов.

    SF Food Trucks

    Приложение, которое мы собираемся Dockerize, называется SF Food Trucks. Моя цель при создании этого приложения состояла в том, чтобы иметь что-то полезное (в том смысле, что оно напоминает реальное приложение), полагающееся хотя бы на одну службу, но не слишком сложное для целей этого руководства.Это то, что я придумал.

    Серверная часть приложения написана на Python (Flask) и для поиска использует Elasticsearch. Как и все остальное в этом руководстве, весь исходный код доступен на Github. Мы будем использовать это приложение в качестве кандидата, чтобы узнать, как создавать, запускать и развертывать многоконтейнерную среду.

    Сначала давайте клонируем репозиторий локально.

      $ git clone https://github.com/prakhar1989/FoodTrucks
    $ cd FoodTrucks
    $ tree -L 2
    .
    ├── Dockerfile
    ├── README.мкр
    ├── aws-compose.yml
    ├── docker-compose.yml
    ├── flask-app
    │ ├── app.py
    │ ├── package-lock.json
    │ ├── package.json
    │ ├── requirements.txt
    │ ├── статический
    │ ├── шаблоны
    │ └── webpack.config.js
    ├── setup-aws-ecs.sh
    ├── setup-docker.sh
    ├── shot.png
    └── утилиты
        ├── generate_geojson.py
        └── trucks.geojson  

    Папка flask-app содержит приложение Python, а папка utils содержит некоторые утилиты для загрузки данных в Elasticsearch.Каталог также содержит некоторые файлы YAML и Dockerfile, каждый из которых мы рассмотрим более подробно по мере прохождения этого руководства. Если вам интересно, не стесняйтесь взглянуть на файлы.

    Теперь, когда вы взволнованы (надеюсь), давайте подумаем о том, как мы можем сделать приложение Dockerize. Мы видим, что приложение состоит из внутреннего сервера Flask и службы Elasticsearch. Естественным способом разделить это приложение было бы наличие двух контейнеров: один запускает процесс Flask, а другой — процесс Elasticsearch (ES).Таким образом, если наше приложение станет популярным, мы сможем масштабировать его, добавляя больше контейнеров в зависимости от того, где находится узкое место.

    Отлично, нам нужно два контейнера. Это не должно быть сложно, правда? В предыдущем разделе мы уже создали собственный контейнер Flask. Что касается Elasticsearch, давайте посмотрим, сможем ли мы что-нибудь найти на хабе.

      $ поиск докеров elasticsearch
    НАЗВАНИЕ ОПИСАНИЕ ЗВЕЗДЫ ОФИЦИАЛЬНЫЙ АВТОМАТ
    elasticsearch Elasticsearch - это мощный инструмент с открытым исходным кодом... 697 [ОК]
    itzg / elasticsearch Предоставляет легко настраиваемый Elasticsea ... 17 [OK]
    tutum / elasticsearch Образ Elasticsearch - прослушивает порт 9200. 15 [OK]
    barnybug / elasticsearch Последняя версия Elasticsearch 1.7.2 и предыдущая версия ... 15 [OK]
    digitalwonderland / elasticsearch Последняя версия Elasticsearch с Marvel и Kibana 12 [OK]
    monsantoco / elasticsearch Образ Docker для ElasticSearch 9 [OK]  

    Неудивительно, что существует официально поддерживаемый образ для Elasticsearch.Чтобы запустить ES, мы можем просто использовать docker run и мгновенно запустить локально одноузловой контейнер ES.

    Примечание. Elastic, компания, стоящая за Elasticsearch, ведет собственный реестр продуктов Elastic. Рекомендуется использовать образы из этого реестра, если вы планируете использовать Elasticsearch.

    Давайте сначала потянем изображение

      $ docker pull docker.elastic.co/elasticsearch/elasticsearch:6.3.2  

    , а затем запустите его в режиме разработки, указав порты и установив переменную среды, которая настраивает кластер Elasticsearch для работы как одноузловой.

      $ docker run -d --name es -p 9200: 9200 -p 9300: 9300 -e "discovery.type = single-node" docker.elastic.co/elasticsearch/elasticsearch:6.3.2
    277451c15ec183dd939e80298ea4bcf55050328a39b04124b387d668e3ed3943  

    Примечание. Если в вашем контейнере возникают проблемы с памятью, вам может потребоваться настроить некоторые флаги JVM, чтобы ограничить потребление памяти.

    Как видно выше, мы используем --name es , чтобы дать нашему контейнеру имя, которое упрощает использование в последующих командах.После запуска контейнера мы можем просмотреть журналы, запустив журналы контейнера докеров с именем (или идентификатором) контейнера для проверки журналов. Если Elasticsearch успешно запустился, вы должны увидеть журналы, подобные приведенным ниже.

    Примечание. Запуск Elasticsearch занимает несколько секунд, поэтому вам может потребоваться подождать, прежде чем вы увидите инициализированный в журналах.

      $ док-контейнер ls
    КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАЕТ СОСТОЯНИЕ НАЗВАНИЯ ПОРТОВ
    277451c15ec1 докер.elastic.co/elasticsearch/elasticsearch:6.3.2 "/ usr / local / bin / dock…" 2 минуты назад вверх на 2 минуты 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp es
    
    $ docker контейнерные журналы es
    [2018-07-29T05: 49: 09,304] [INFO] [o.e.n.Node] [] инициализация ...
    [2018-07-29T05: 49: 09,385] [INFO] [oeeNodeEnvironment] [L1VMyzt] с использованием [1] путей к данным, монтирования [[/ (overlay)]], net usable_space [54,1gb], net total_space [62,7gb ], типы [оверлей]
    [2018-07-29T05: 49: 09,385] [ИНФОРМАЦИЯ] [o.e.e.NodeEnvironment] [L1VMyzt] размер кучи [990,7 МБ], сжатые указатели обычных объектов [true]
    [2018-07-29T05: 49: 11,979] [INFO] [o.e.p.PluginsService] [L1VMyzt] загруженный модуль [x-pack-security]
    [2018-07-29T05: 49: 11,980] [INFO] [o.e.p.PluginsService] [L1VMyzt] загруженный модуль [x-pack-sql]
    [2018-07-29T05: 49: 11,980] [INFO] [o.e.p.PluginsService] [L1VMyzt] загруженный модуль [x-pack-upgrade]
    [2018-07-29T05: 49: 11,980] [INFO] [o.e.p.PluginsService] [L1VMyzt] загруженный модуль [x-pack-watcher]
    [2018-07-29T05: 49: 11,981] [ИНФОРМАЦИЯ] [o.e.p.PluginsService] [L1VMyzt] загруженный плагин [ingest-geoip]
    [2018-07-29T05: 49: 11,981] [INFO] [o.e.p.PluginsService] [L1VMyzt] загруженный плагин [ingest-user-agent]
    [2018-07-29T05: 49: 17,659] [INFO] [o.e.d.DiscoveryModule] [L1VMyzt] с использованием типа обнаружения [одноузловой]
    [2018-07-29T05: 49: 18,962] [INFO] [o.e.n.Node] [L1VMyzt] инициализирован
    [2018-07-29T05: 49: 18,963] [INFO] [o.e.n.Node] [L1VMyzt] запускается ...
    [2018-07-29T05: 49: 19,218] [INFO] [o.e.t.TransportService] [L1VMyzt] publish_address {172.17.0.2: 9300}, bound_addresses {0.0.0.0:9300}
    [2018-07-29T05: 49: 19,302] [INFO] [o.e.x.s.t.n.SecurityNetty4HttpServerTransport] [L1VMyzt] publish_address {172.17.0.2:9200}, bound_addresses {0.0.0.0:9200}
    [2018-07-29T05: 49: 19,303] [INFO] [o.e.n.Node] [L1VMyzt] началось
    [2018-07-29T05: 49: 19,439] [WARN] [o.e.x.s.a.s.m.NativeRoleMappingStore] [L1VMyzt] Не удалось очистить кеш для миров [[]]
    [2018-07-29T05: 49: 19,542] [INFO] [например, GatewayService] [L1VMyzt] восстановил [0] индексов в cluster_state  

    Теперь попробуем проверить, можно ли отправить запрос в контейнер Elasticsearch.Мы используем порт 9200 для отправки запроса cURL в контейнер.

      $ curl 0.0.0.0:9200
    {
      "name": "ijJDAOm",
      "имя_кластера": "докер-кластер",
      "cluster_uuid": "a_nSV3XmTCqpzYYzb-LhNw",
      "версия": {
        "number": "6.3.2",
        "build_flavor": "по умолчанию",
        "build_type": "tar",
        "build_hash": "053779d",
        "build_date": "2018-07-20T05: 20: 23.451332Z",
        "build_snapshot": ложь,
        "lucene_version": "7.3.1",
        "minimum_wire_compatibility_version": "5.6.0 ",
        "minimum_index_compatibility_version": "5.0.0"
      },
      "слоган": "Знаешь, для поиска"
    }  

    Sweet! Выглядит хорошо! Пока мы на этом, давайте также запустим наш контейнер Flask. Но прежде чем мы дойдем до этого, нам понадобится Dockerfile . В последнем разделе мы использовали изображение python: 3 в качестве базового изображения. Однако на этот раз, помимо установки зависимостей Python через pip , мы хотим, чтобы наше приложение также генерировало наш миниатюрный файл Javascript для производства.Для этого нам потребуется Nodejs. Поскольку нам нужен специальный этап сборки, мы начнем с базового образа ubuntu , чтобы создать наш Dockerfile с нуля.

    Примечание: если вы обнаружите, что существующий образ не соответствует вашим потребностям, не стесняйтесь начать с другого базового образа и настроить его самостоятельно. Для большинства образов в Docker Hub вы сможете найти соответствующий Dockerfile на Github. Чтение существующих файлов Docker — один из лучших способов научиться создавать собственные.

    Наш Dockerfile для приложения Flask выглядит так, как показано ниже —

     
    ОТ ubuntu: 18.04
    
    ТЕХНИЧЕСКИЙ ОБСЛУЖИВАНИЕ Пракхар Шривастав 
    
    
    ЗАПУСТИТЬ apt-get -yqq update
    ЗАПУСТИТЬ apt-get -yqq установить python3-pip python3-dev curl gnupg
    ВЫПОЛНИТЬ curl -sL https://deb.nodesource.com/setup_10.x | трепать
    ЗАПУСТИТЬ apt-get install -yq nodejs
    
    
    ДОБАВИТЬ приложение flask-app / opt / flask-app
    WORKDIR / opt / flask-app
    
    
    ЗАПУСТИТЬ npm install
    ЗАПУСТИТЬ npm запустить сборку
    ЗАПУСТИТЬ pip3 install -r requirements.txt
    
    
    EXPOSE 5000
    
    
    CMD ["python3", "./app.py "]  

    Здесь довольно много нового, так что давайте быстро рассмотрим этот файл. Мы начинаем с базового образа Ubuntu LTS и используем диспетчер пакетов apt-get для установки зависимостей, а именно Python и Node. Флаг yqq используется для подавления вывода и предполагает «Да» на все запросы.

    Затем мы используем команду ADD , чтобы скопировать наше приложение в новый том в контейнере — / opt / flask-app . Здесь будет находиться наш код.Мы также устанавливаем это как наш рабочий каталог, так что следующие команды будут выполняться в контексте этого местоположения. Теперь, когда наши общесистемные зависимости установлены, мы приступаем к установке зависимостей для конкретных приложений. Прежде всего, мы взялись за Node, установив пакеты из npm и выполнив команду сборки, как определено в нашем файле package.json . Мы завершаем работу над файлом, устанавливая пакеты Python, открывая порт и определяя запуск CMD , как мы это делали в предыдущем разделе.

    Наконец, мы можем создать образ и запустить контейнер (замените prakhar1989 своим именем пользователя ниже).

      $ docker build -t prakhar1989 / foodtrucks-web.  

    При первом запуске это займет некоторое время, так как клиент Docker загрузит образ ubuntu, выполнит все команды и подготовит ваш образ. Повторный запуск docker build после любых последующих изменений, внесенных в код приложения, будет практически мгновенным.Теперь попробуем запустить наше приложение.

      $ docker run -P --rm prakhar1989 / foodtrucks-web
    Невозможно подключиться к ES. Повтор через 5 секунд ...
    Невозможно подключиться к ES. Повтор через 5 секунд ...
    Невозможно подключиться к ES. Повтор через 5 секунд ...
    Нет повторов. Спасение ...  

    Ой! Наше приложение flask не могло работать, так как оно не могло подключиться к Elasticsearch. Как мы рассказываем одному контейнеру о другом контейнере и заставляем их разговаривать друг с другом? Ответ кроется в следующем разделе.

    Сеть Докеров

    Прежде чем мы поговорим о функциях, которые Docker предоставляет специально для работы с такими сценариями, давайте посмотрим, сможем ли мы найти способ обойти проблему. Надеюсь, это должно дать вам представление о конкретной функции, которую мы собираемся изучить.

    Хорошо, давайте запустим docker container ls (который совпадает с docker ps ) и посмотрим, что у нас получилось.

      $ док-контейнер ls
    КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАЕТ СОСТОЯНИЕ НАЗВАНИЯ ПОРТОВ
    277451c15ec1 докер.elastic.co/elasticsearch/elasticsearch:6.3.2 "/ usr / local / bin / dock…" 17 минут назад вверх на 17 минут 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp es  

    Итак, у нас есть один контейнер ES, работающий на порту 0.0.0.0:9200 , к которому мы можем получить прямой доступ. Если мы можем указать нашему приложению Flask подключиться к этому URL-адресу, оно должно иметь возможность подключаться и разговаривать с ES, верно? Давайте углубимся в наш код Python и посмотрим, как определяются детали подключения.

      es = Elasticsearch (host = 'es')  

    Чтобы это сработало, нам нужно сообщить контейнеру Flask, что контейнер ES работает на 0.0.0.0 host (порт по умолчанию 9200 ), и это должно заставить его работать, верно? К сожалению, это неверно, поскольку IP 0.0.0.0 — это IP-адрес для доступа к контейнеру ES с хост-машины , то есть с моего Mac. Другой контейнер не сможет получить к нему доступ с того же IP-адреса. Хорошо, если не этот IP-адрес, то по какому IP-адресу должен быть доступен контейнер ES? Я рад, что вы задали этот вопрос.

    Сейчас хорошее время, чтобы начать наше исследование сетей в Docker.Когда докер установлен, он автоматически создает три сети.

      $ докер сеть ls
    ИМЯ СЕТЕВОГО ИДЕНТИФИКАЦИИ ДРАЙВЕРА ОБЪЕМ
    c2c695315b3a мост мост местный
    a875bec5d6fd host host local
    ead0e804a67b нет null локальный  

    Мост Сеть — это сеть, в которой по умолчанию запускаются контейнеры. Это означает, что когда я запускал контейнер ES, он работал в этой сети моста.Чтобы убедиться в этом, давайте проверим сеть.

      $ docker network осмотреть мост
    [
        {
            «Название»: «мост»,
            «Id»: «c2c695315b3aaf8fc30530bb3c6b8f6692cedd5cc7579663f0550dfdd21c9a26»,
            «Создано»: «2018-07-28T20: 32: 39.405687265Z»,
            «Область действия»: «местный»,
            «Водитель»: «мост»,
            «EnableIPv6»: ложь,
            "IPAM": {
                "Драйвер": "по умолчанию",
                «Параметры»: ноль,
                "Конфиг": [
                    {
                        «Подсеть»: «172.17.0.0 / 16 ",
                        «Шлюз»: «172.17.0.1»
                    }
                ]
            },
            «Внутренний»: ложь,
            "Присоединяемый": ложь,
            "Ingress": ложь,
            "ConfigFrom": {
                "Сеть": ""
            },
            "ConfigOnly": ложь,
            "Контейнеры": {
                "277451c15ec183dd939e80298ea4bcf55050328a39b04124b387d668e3ed3943": {
                    «Имя»: «es»,
                    "EndpointID": "5c417a2fc6b13d8ec97b76bbd54aaf3ee2d48f328c3f7279ee335174fbb4d6bb",
                    "MacAddress": "02: 42: ac: 11: 00: 02",
                    «IPv4Address»: «172.17.0.2 / 16 ",
                    "IPv6Address": ""
                }
            },
            "Параметры": {
                "com.docker.network.bridge.default_bridge": "истина",
                "com.docker.network.bridge.enable_icc": "правда",
                "com.docker.network.bridge.enable_ip_masquerade": "правда",
                "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
                "com.docker.network.bridge.name": "docker0",
                "com.docker.network.driver.mtu": "1500"
            },
            "Ярлыки": {}
        }
    ]  

    Вы можете видеть, что наш контейнер 277451c15ec1 указан в разделе Контейнеры в выходных данных.Мы также видим IP-адрес, выделенный этому контейнеру — 172.17.0.2 . Это тот IP-адрес, который мы ищем? Давайте узнаем, запустив наш контейнер фляги и попробовав получить доступ к этому IP.

      $ docker run -it --rm prakhar1989 / foodtrucks-web bash
    корень @ 35180ccc206a: / opt / flask-app
    {
      "name": "Джейн Фостер",
      "имя_кластера": "elasticsearch",
      "версия": {
        "number": "2.1.1",
        "build_hash": "40e2c53a6b6c2972b3d13846e450e66f4375bd71",
        "build_timestamp": "2015-12-15T13: 05: 55Z",
        "build_snapshot": ложь,
        "lucene_version": "5.3,1 дюйма
      },
      "слоган": "Знаешь, для поиска"
    }
    корень @ 35180ccc206a: / opt / flask-app  

    Теперь это должно быть для вас довольно просто. Запускаем контейнер в интерактивном режиме с процессом bash . --rm — удобный флаг для запуска одноразовых команд, поскольку контейнер очищается, когда его работа завершается. Мы пробуем curl , но сначала нам нужно его установить. Как только мы это сделаем, мы увидим, что действительно можем поговорить с ES по телефону 172.17.0.2: 9200 . Потрясающие!

    Хотя мы придумали способ заставить контейнеры взаимодействовать друг с другом, у этого подхода все еще есть две проблемы —

    1. Как мы сообщаем контейнеру Flask, что имя хоста es означает 172.17.0.2 или какой-то другой IP-адрес, поскольку IP-адрес может измениться?

    2. Поскольку сеть bridge используется всеми контейнерами по умолчанию, этот метод небезопасен . Как изолировать нашу сеть?

    Хорошая новость в том, что у Docker есть отличный ответ на наши вопросы.Это позволяет нам определять наши собственные сети, сохраняя их изолированными с помощью команды docker network .

    Давайте сначала создадим нашу собственную сеть.

      $ docker network создать foodtrucks-net
    0815b2a3bb7a6608e850d05553cc0bda98187c4528d94621438f31d97a6fea3c
    
    $ docker network ls
    ИМЯ СЕТЕВОГО ИДЕНТИФИКАЦИИ ДРАЙВЕРА ОБЪЕМ
    c2c695315b3a мост мост местный
    0815b2a3bb7a фудтраки-сеть мост местный
    a875bec5d6fd host host local
    ead0e804a67b нет null локальный  

    Команда network create создает новый мост bridge network, что нам и нужно в данный момент.С точки зрения Docker, мостовая сеть использует программный мост, который позволяет контейнерам, подключенным к одной и той же мостовой сети, обмениваться данными, обеспечивая изоляцию от контейнеров, которые не подключены к этой мостовой сети. Драйвер моста Docker автоматически устанавливает правила на хост-машине, чтобы контейнеры в разных сетях моста не могли напрямую взаимодействовать друг с другом. Существуют и другие типы сетей, которые вы можете создавать, и вам рекомендуется прочитать о них в официальной документации.

    Теперь, когда у нас есть сеть, мы можем запускать наши контейнеры внутри этой сети, используя флаг --net . Давайте сделаем это — но сначала, чтобы запустить новый контейнер с тем же именем, мы остановим и удалим наш контейнер ES, который работает в сети моста (по умолчанию).

      $ docker container stop es
    es
    
    $ docker контейнер rm es
    es
    
    $ docker run -d --name es --net foodtrucks-net -p 9200: 9200 -p 9300: 9300 -e "discovery.type = single-node" docker.elastic.co / elasticsearch / elasticsearch: 6.3.2
    13d6415f73c8d88bddb1f236f584b63dbaf2c3051f09863a3f1ba219edba3673
    
    $ docker network проверить foodtrucks-net
    [
        {
            «Название»: «foodtrucks-net»,
            «Id»: «0815b2a3bb7a6608e850d05553cc0bda98187c4528d94621438f31d97a6fea3c»,
            «Создано»: «2018-07-30T00: 01: 29.1500984Z»,
            «Область действия»: «местный»,
            «Водитель»: «мост»,
            «EnableIPv6»: ложь,
            "IPAM": {
                "Драйвер": "по умолчанию",
                "Параметры": {},
                "Конфиг": [
                    {
                        «Подсеть»: «172.18.0.0 / 16 ",
                        «Шлюз»: «172.18.0.1»
                    }
                ]
            },
            «Внутренний»: ложь,
            "Присоединяемый": ложь,
            "Ingress": ложь,
            "ConfigFrom": {
                "Сеть": ""
            },
            "ConfigOnly": ложь,
            "Контейнеры": {
                "13d6415f73c8d88bddb1f236f584b63dbaf2c3051f09863a3f1ba219edba3673": {
                    «Имя»: «es»,
                    "EndpointID": "29ba2d33f9713e57eb6b38db41d656e4ee2c53e4a2f7cf636bdca0ec59cd3aa7",
                    "MacAddress": "02: 42: ac: 12: 00: 02",
                    «IPv4Address»: «172.18.0.2 / 16 ",
                    "IPv6Address": ""
                }
            },
            "Параметры": {},
            "Ярлыки": {}
        }
    ]  

    Как видите, наш контейнер es теперь работает внутри мостовой сети foodtrucks-net . Теперь давайте посмотрим, что происходит при запуске в нашей сети foodtrucks-net .

      $ docker run -it --rm --net foodtrucks-net prakhar1989 / foodtrucks-web bash
    корень @ 9d2722cf282c: / opt / flask-app
    {
      "name": "wWALl9M",
      "имя_кластера": "докер-кластер",
      "cluster_uuid": "BA36XuOiRPaghPNBLBHleQ",
      "версия": {
        «число»: «6.3,2 ",
        "build_flavor": "по умолчанию",
        "build_type": "tar",
        "build_hash": "053779d",
        "build_date": "2018-07-20T05: 20: 23.451332Z",
        "build_snapshot": ложь,
        "lucene_version": "7.3.1",
        "minimum_wire_compatibility_version": "5.6.0",
        "minimum_index_compatibility_version": "5.0.0"
      },
      "слоган": "Знаешь, для поиска"
    }
    корень @ 53af252b771a: / opt / flask-app
    app.py node_modules package.json requirements.txt статические шаблоны webpack.config.js
    корень @ 53af252b771a: / opt / flask-app
    Индекс не найден...
    Загрузка данных в elasticsearch ...
    Всего загружено грузовиков: 733
     * Запуск на http://0.0.0.0:5000/ (нажмите CTRL + C, чтобы выйти)
    корень @ 53af252b771a: / opt / flask-app  

    Wohoo! Это работает! В пользовательских сетях, таких как foodtrucks-net, контейнеры могут связываться не только по IP-адресу, но также могут преобразовывать имя контейнера в IP-адрес. Эта возможность называется автоматическим обнаружением службы . Большой! Запустим наш контейнер Flask прямо сейчас —

      $ docker run -d --net foodtrucks-net -p 5000: 5000 --name foodtrucks-web prakhar1989 / foodtrucks-web
    852fc74de2954bb72471b858dce64d764181dca0cf7693fed201d76da33df794
    
    $ docker container ls
    КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАЕТ СОСТОЯНИЕ НАЗВАНИЯ ПОРТОВ
    852fc74de295 prakhar1989 / foodtrucks-web "python3./app.py "Около минуты назад Вверх Около минуты 0.0.0.0:5000->5000/tcp foodtrucks-web
    13d6415f73c8 docker.elastic.co/elasticsearch/elasticsearch:6.3.2 "/ usr / local / bin / dock…" 17 минут назад Вверх 17 минут 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300 / tcp es
    
    $ curl -I 0.0.0.0:5000
    HTTP / 1.0 200 ОК
    Тип содержимого: текст / html; charset = utf-8
    Длина содержимого: 3697
    Сервер: Werkzeug / 0.11.2 Python / 2.7.6
    Дата: вс, 10 января 2016 г., 23:58:53 GMT  

    Перейдите по адресу http: // 0.0.0.0: 5000 и посмотрите свое великолепное приложение вживую! Хотя это могло показаться большим трудом, на самом деле мы просто набрали 4 команды, чтобы перейти от нуля к работе. Я собрал команды в сценарии bash.

      #! / Bin / bash
    
    
    сборка докеров -t prakhar1989 / foodtrucks-web.
    
    
    сеть докеров создать foodtrucks-net
    
    
    docker run -d --name es --net foodtrucks-net -p 9200: 9200 -p 9300: 9300 -e "discovery.type = single-node" docker.elastic.co/elasticsearch/elasticsearch:6.3.2
    
    
    docker run -d --net foodtrucks-net -p 5000: 5000 --name foodtrucks-web prakhar1989 / foodtrucks-web  

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

      $ git clone https://github.com/prakhar1989/FoodTrucks
    $ cd FoodTrucks
    $ ./setup-docker.sh  

    И все! Если вы спросите меня, я считаю, что это очень крутой и мощный способ совместного использования и запуска ваших приложений!

    Docker Compose

    До сих пор мы тратили все свое время на изучение клиента Docker. Однако в экосистеме Docker есть множество других инструментов с открытым исходным кодом, которые очень хорошо работают с Docker.Некоторые из них —

    1. Docker Machine — Создайте хосты Docker на вашем компьютере, у облачных провайдеров и внутри вашего собственного центра обработки данных
    2. Docker Compose — инструмент для определения и запуска многоконтейнерных приложений Docker.
    3. Docker Swarm — собственное решение кластеризации для Docker
    4. Kubernetes — Kubernetes — это система с открытым исходным кодом для автоматизации развертывания, масштабирования и управления контейнерными приложениями.

    В этом разделе мы рассмотрим один из этих инструментов, Docker Compose, и посмотрим, как он может упростить работу с многоконтейнерными приложениями.

    История создания Docker Compose довольно интересна. Примерно в январе 2014 года компания OrchardUp запустила инструмент под названием Fig. Идея Fig заключалась в том, чтобы заставить изолированные среды разработки работать с Docker. Проект был очень хорошо принят Hacker News — я, как ни странно, помню, как читал об этом, но не совсем понял.

    Первый комментарий на форуме действительно хорошо объясняет, что такое Fig.

    Итак, на данный момент Docker и занимается именно этим: запуском процессов.Теперь Docker предлагает довольно богатый API для запуска процессов: общие тома (каталоги) между контейнерами (т. Е. Запущенные образы), порт пересылки от хоста к контейнеру, отображение журналов и т. Д. Но это все: Docker на данный момент остается на уровне процесса.

    Хотя он предоставляет возможности для оркестровки нескольких контейнеров для создания единого «приложения», он не обращается к управлению такой группой контейнеров как единым целым.
    И здесь на помощь приходят такие инструменты, как Fig: речь идет о группе контейнеров как о едином объекте.Подумайте «запустить приложение» (т.е. «запустить оркестрованный кластер контейнеров») вместо «запустить контейнер».

    Оказывается, многие люди, использующие докер, согласны с этим мнением. Постепенно и неуклонно по мере того, как Fig стал популярным, Docker Inc. обратила на это внимание, приобрела компанию и переименовала Fig в Docker Compose.

    Итак, для чего используется Compose ? Compose — это инструмент, который используется для простого определения и запуска многоконтейнерных приложений Docker. Он предоставляет файл конфигурации под названием docker-compose.yml , который можно использовать для вызова приложения и набора служб, от которых оно зависит, с помощью всего одной команды. Compose работает во всех средах: производственная, промежуточная, разработка, тестирование, а также рабочие процессы CI, хотя Compose идеально подходит для сред разработки и тестирования.

    Давайте посмотрим, сможем ли мы создать файл docker-compose.yml для нашего приложения SF-Foodtrucks и оценить, оправдывает ли Docker Compose свое обещание.

    Однако первым шагом является установка Docker Compose.Если вы используете Windows или Mac, Docker Compose уже установлен, поскольку он входит в панель инструментов Docker. Пользователи Linux могут легко получить доступ к Docker Compose, следуя инструкциям в документации. Поскольку Compose написан на Python, вы также можете просто выполнить pip install docker-compose . Проверьте свою установку с помощью —

      $ docker-compose --version
    docker-compose версия 1.21.2, сборка a133471  

    Теперь, когда он установлен, мы можем перейти к следующему шагу i.е. файл Docker Compose docker-compose.yml . Синтаксис YAML довольно прост, и репозиторий уже содержит файл docker-compose, который мы будем использовать.

      версия: "3"
    Сервисы:
      es:
        изображение: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
        имя_контейнера: es
        среда:
          - discovery.type = одноузловой
        порты:
          - 9200: 9200
        объемы:
          - esdata1: / usr / share / elasticsearch / data
      Интернет:
        изображение: prakhar1989 / foodtrucks-web
        команда: приложение python3.ру
        зависит от:
          - es
        порты:
          - 5000: 5000
        объемы:
          - ./flask-app:/opt/flask-app
    объемы:
      esdata1:
        водитель: местный  

    Позвольте мне объяснить, что означает файл выше. На родительском уровне мы определяем названия наших сервисов — es и web . Параметр image требуется всегда, и для каждой службы, которую мы хотим, чтобы Docker запускал, мы можем добавить дополнительные параметры. Для es мы просто ссылаемся на образ elasticsearch , доступный в реестре Elastic.Для нашего приложения Flask мы ссылаемся на изображение, которое мы создали в начале этого раздела.

    Другие параметры, такие как команда и порты , предоставляют дополнительную информацию о контейнере. Параметр volume указывает точку монтирования в нашем контейнере web , где будет находиться код. Это совершенно необязательно и полезно, если вам нужен доступ к журналам и т. Д. Позже мы увидим, как это может быть полезно во время разработки. Обратитесь к онлайн-ссылке, чтобы узнать больше о параметрах, которые поддерживает этот файл.Мы также добавляем тома для контейнера es , чтобы данные, которые мы загружаем, сохранялись между перезапусками. Мы также указываем depends_on , который сообщает докеру, что нужно запустить контейнер es до web . Вы можете узнать больше об этом в docker compose docs.

    Примечание. Вы должны находиться внутри каталога с файлом docker-compose.yml , чтобы выполнять большинство команд Compose.

    Отлично! Теперь файл готов, давайте посмотрим, как работает docker-compose .Но прежде чем мы начнем, нам нужно убедиться, что порты и имена свободны. Так что, если у вас запущены контейнеры Flask и ES, давайте отключим их.

      $ docker stop es foodtrucks-web
    es
    foodtrucks-сеть
    
    $ docker rm es foodtrucks-сеть
    es
    foodtrucks-web  

    Теперь мы можем запустить docker-compose . Перейдите в каталог фургонов с едой и запустите docker-compose up .

      $ docker-compose up
    Создание сети foodtrucks_default с драйвером по умолчанию
    Создание foodtrucks_es_1
    Создание foodtrucks_web_1
    Присоединение к foodtrucks_es_1, foodtrucks_web_1
    es_1 | [2016-01-11 03: 43: 50,300] [ИНФОРМАЦИЯ] [узел] [Комета] версия [2.1.1], pid [1], build [40e2c53 / 2015-12-15T13: 05: 55Z]
    es_1 | [2016-01-11 03: 43: 50,307] [INFO] [узел] [Comet] инициализация ...
    es_1 | [2016-01-11 03: 43: 50,366] [ИНФОРМАЦИЯ] [плагины] [Комета] загружены [], сайты []
    es_1 | [2016-01-11 03: 43: 50,421] [INFO] [env] [Comet] с использованием [1] путей к данным, монтирует [[/ usr / share / elasticsearch / data (/ dev / sda1)]], net usable_space [16gb], net total_space [18,1gb], спины? [возможно], типы [ext4]
    es_1 | [2016-01-11 03: 43: 52,626] [INFO] [узел] [Comet] инициализирован
    es_1 | [2016-01-11 03: 43: 52,632] [ИНФОРМАЦИЯ] [узел] [Комета] запускается...
    es_1 | [2016-01-11 03: 43: 52,703] [WARN] [common.network] [Comet] адрес публикации: {0.0.0.0} - это групповой адрес, возвращающийся к первому без петлевого тестирования: {172.17.0.2}
    es_1 | [2016-01-11 03: 43: 52,704] [INFO] [транспорт] [Comet] publish_address {172.17.0.2:9300}, bound_addresses {[::]: 9300}
    es_1 | [2016-01-11 03: 43: 52,721] [ИНФОРМАЦИЯ] [открытие] [Комета] elasticsearch / cEk4s7pdQ-evRc9MqS2wqw
    es_1 | [2016-01-11 03: 43: 55,785] [ИНФОРМАЦИЯ] [cluster.service] [Comet] new_master {Comet} {cEk4s7pdQ-evRc9MqS2wqw} {172.17.0.2} {172.17.0.2:9300}, причина: zen-disco-join (selected_as_master, [0] присоединений получено)
    es_1 | [2016-01-11 03: 43: 55,818] [WARN] [common.network] [Comet] опубликовать адрес: {0.0.0.0} - это групповой адрес, возвращающийся к первому без петлевого тестирования: {172.17.0.2}
    es_1 | [2016-01-11 03: 43: 55,819] [INFO] [http] [Comet] publish_address {172.17.0.2:9200}, bound_addresses {[::]: 9200}
    es_1 | [2016-01-11 03: 43: 55,819] [INFO] [узел] [Comet] запущен
    es_1 | [2016-01-11 03: 43: 55,826] [INFO] [gateway] [Comet] восстановили [0] индексов в cluster_state
    es_1 | [2016-01-11 03: 44: 01,825] [ИНФОРМАЦИЯ] [кластер.метаданные] [Комета] [sfdata] создание индекса, причина [auto (index api)], шаблоны [], сегменты [5] / [1], сопоставления [грузовик]
    es_1 | [2016-01-11 03: 44: 02,373] [ИНФОРМАЦИЯ] [cluster.metadata] [Comet] [sfdata] update_mapping [грузовик]
    es_1 | [2016-01-11 03: 44: 02,510] [ИНФОРМАЦИЯ] [cluster.metadata] [Comet] [sfdata] update_mapping [truck]
    es_1 | [2016-01-11 03: 44: 02,593] [ИНФОРМАЦИЯ] [cluster.metadata] [Comet] [sfdata] update_mapping [truck]
    es_1 | [2016-01-11 03: 44: 02,708] [ИНФОРМАЦИЯ] [cluster.metadata] [Comet] [sfdata] update_mapping [грузовик]
    es_1 | [2016-01-11 03: 44: 03,047] [ИНФОРМАЦИЯ] [кластер.метаданные] [Комета] [sfdata] update_mapping [грузовик]
    web_1 | * Запуск по http://0.0.0.0:5000/ (для выхода нажмите CTRL + C)  

    Зайдите на IP-адрес, чтобы увидеть свое приложение вживую. Это было потрясающе, не правда ли? Всего несколько строк конфигурации, и у нас есть два контейнера Docker, успешно работающих в унисон. Остановим службы и перезапустим их в автономном режиме.

      web_1 | * Запуск на http://0.0.0.0:5000/ (нажмите CTRL + C, чтобы выйти)
    Убиваем foodtrucks_web_1 ... готово
    Убийство foodtrucks_es_1... сделано
    
    $ docker-compose up -d
    Создание es ... готово
    Создание foodtrucks_web_1 ... готово
    
    $ docker-compose ps
          Имя команды Состояние портов
    -------------------------------------------------- ------------------------------------------
    es / usr / local / bin / docker-entr ... До 0.0.0.0:9200->9200/tcp, 9300 / tcp
    foodtrucks_web_1 python3 app.py Up 0.0.0.0:5000->5000/tcp  

    Неудивительно, что оба контейнера работают успешно.Откуда взялись имена? Они были созданы Compose автоматически. Но разве Compose также автоматически создает сеть? Хороший вопрос! Давайте разберемся.

    Прежде всего, остановим работу служб. Мы всегда можем вернуть их обратно с помощью одной команды. Тома данных сохранятся, поэтому можно снова запустить кластер с теми же данными с помощью docker-compose up. Чтобы уничтожить кластер и тома данных, просто введите docker-compose down -v .

      $ docker-compose down -v
    Остановка foodtrucks_web_1 ... выполнено
    Остановка es ... сделано
    Удаление foodtrucks_web_1 ... выполнено
    Удаление es ... сделано
    Удаление сети foodtrucks_default
    Снятие объема foodtrucks_esdata1  

    Пока мы это делаем, мы также удалим сеть foodtrucks , которую мы создали в прошлый раз.

      $ докер сеть rm foodtrucks-net
    $ docker network ls
    ИМЯ СЕТЕВОГО ИДЕНТИФИКАЦИИ ДРАЙВЕРА ОБЪЕМ
    c2c695315b3a мост мост местный
    a875bec5d6fd host host local
    ead0e804a67b нет null локальный  

    Отлично! Теперь, когда у нас есть чистый лист, давайте повторно запустим наши службы и посмотрим, творит чудеса Compose .

      $ docker-compose up -d
    Воссоздание foodtrucks_es_1
    Воссоздание foodtrucks_web_1
    
    $ docker container ls
    КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНО СОСТОЯНИЕ НАЗВАНИЯ ПОРТОВ
    f50bb33a3242 prakhar1989 / foodtrucks-web "python3 app.py" 14 секунд назад Вверх на 13 секунд 0.0.0.0:5000->5000/tcp foodtrucks_web_1
    e299ceeb4caa elasticsearch "/docker-entrypoint.s" 14 секунд назад Up 14 секунд 9200 / tcp, 9300 / tcp foodtrucks_es_1  

    Пока все хорошо.Пора посмотреть, были ли созданы какие-нибудь сети.

      $ докер сеть ls
    ИМЯ СЕТИ ИМЯ ДРАЙВЕР
    c2c695315b3a мост мост местный
    f3b80f381ed3 foodtrucks_default мост местный
    a875bec5d6fd host host local
    ead0e804a67b нет null локальный  

    Вы можете видеть, что compose пошел дальше и создал новую сеть с именем foodtrucks_default и подключил обе новые службы в этой сети, так что каждая из них может быть обнаружена другой.Каждый контейнер для службы присоединяется к сети по умолчанию и одновременно доступен другим контейнерам в этой сети и может быть обнаружен ими по имени хоста, совпадающему с именем контейнера.

      $ докер пс
    КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНО СОСТОЯНИЕ НАЗВАНИЯ ПОРТОВ
    8c6bb7e818ec docker.elastic.co/elasticsearch/elasticsearch:6.3.2 "/ usr / local / bin / dock…" Около минуты назад вверх Около минуты 0.0.0.0: 9200-> 9200 / tcp, 9300 / tcp es
    7640cec7feb7 prakhar1989 / foodtrucks-web "python3 app.py" Около минуты назад Вверх Около минуты 0.0.0.0:5000->5000/tcp foodtrucks_web_1
    
    $ docker network проверить foodtrucks_default
    [
        {
            "Name": "foodtrucks_default",
            «Id»: «f3b80f381ed3e03b3d5e605e42c4a576e32d38ba24399e963d7dad848b3b4fe7»,
            «Создано»: «2018-07-30T03: 36: 06.0384826Z»,
            «Область действия»: «местный»,
            «Водитель»: «мост»,
            «EnableIPv6»: ложь,
            "IPAM": {
                "Драйвер": "по умолчанию",
                «Параметры»: ноль,
                "Конфиг": [
                    {
                        «Подсеть»: «172.19.0.0 / 16 ",
                        «Шлюз»: «172.19.0.1»
                    }
                ]
            },
            «Внутренний»: ложь,
            "Присоединяемый": правда,
            "Ingress": ложь,
            "ConfigFrom": {
                "Сеть": ""
            },
            "ConfigOnly": ложь,
            "Контейнеры": {
                "7640cec7feb7f5615eaac376271a93fb8bab2ce54c7257256bf16716e05c65a5": {
                    "Имя": "foodtrucks_web_1",
                    "EndpointID": "b1aa3e735402abafea3edfbba605eb4617f81d94f1b5f8fcc566a874660a0266",
                    "MacAddress": "02: 42: ac: 13: 00: 02",
                    «IPv4Address»: «172.19.0.2 / 16 ",
                    "IPv6Address": ""
                },
                "8c6bb7e818ec1f88c37f375c18f00beb030b31f4b10aee5a0952aad753314b57": {
                    «Имя»: «es»,
                    "EndpointID": "649b3567d38e5e6f03fa6c004a4302508c14a5f2ac086ee6dcf13ddef936de7b",
                    "MacAddress": "02: 42: ac: 13: 00: 03",
                    «IPv4Address»: «172.19.0.3/16»,
                    "IPv6Address": ""
                }
            },
            "Параметры": {},
            "Ярлыки": {
                "com.docker.compose.сеть ":" по умолчанию ",
                "com.docker.compose.project": "foodtrucks",
                "com.docker.compose.version": "1.21.2"
            }
        }
    ]  

    Рабочий процесс разработки

    Прежде чем мы перейдем к следующему разделу, я хотел бы рассказать еще об одной вещи, касающейся docker-compose. Как было сказано ранее, docker-compose действительно отлично подходит для разработки и тестирования. Итак, давайте посмотрим, как мы можем настроить compose, чтобы упростить нам жизнь во время разработки.

    На протяжении всего этого руководства мы работали с готовыми образами докеров.Хотя мы создавали образы с нуля, мы еще не касались кода приложений и в основном ограничивались редактированием файлов Docker и конфигураций YAML. Вам, должно быть, интересно, как выглядит рабочий процесс во время разработки? Следует ли создавать образы Docker для каждого изменения, затем публиковать их, а затем запускать, чтобы проверить, работают ли изменения должным образом? Я уверен, что это звучит очень утомительно. Там должен быть лучший способ. В этом разделе мы собираемся изучить это.

    Давайте посмотрим, как мы можем внести изменения в только что запущенное приложение Foodtrucks. Убедитесь, что у вас запущено приложение,

      $ док-контейнер ls
    КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАЕТ СОСТОЯНИЕ НАЗВАНИЯ ПОРТОВ
    5450ebedd03c prakhar1989 / foodtrucks-web "python3 app.py" 9 секунд назад Вверх на 6 секунд 0.0.0.0:5000->5000/tcp foodtrucks_web_1
    05d408b25dfe докер.elastic.co/elasticsearch/elasticsearch:6.3.2 "/ usr / local / bin / dock…" 10 часов назад Вверх 10 часов 0.0.0.0:9200->9200/tcp, 9300 / tcp es  

    Теперь давайте посмотрим, сможем ли мы изменить это приложение, чтобы отображать Hello world! Сообщение при запросе на маршрут / hello . В настоящее время приложение отвечает 404.

      $ curl -I 0.0.0.0:5000/hello
    HTTP / 1.0 404 НЕ НАЙДЕН
    Тип содержимого: текст / html
    Длина содержимого: 233
    Сервер: Werkzeug / 0.11.2 Python / 2.7.15rc1
    Дата: Пн, 30 июля 2018 г. 15:34:38 ​​GMT  

    Почему это происходит? Поскольку наше приложение является Flask, мы можем увидеть app.py (ссылка) для ответов. Во Flask маршруты определяются с помощью синтаксиса @ app.route. В этом файле вы увидите, что у нас определены только три маршрута — /, / debug и / search . Маршрут / отображает основное приложение, отладочный маршрут используется для возврата некоторой отладочной информации и, наконец, search используется приложением для запроса elasticsearch.

      $ curl 0.0.0.0:5000/debug
    {
      "msg": "желтый открытый sfdata Ibkx7WYjSt-g8NZXOEtTMg 5 1 618 0 1,3 МБ 1,3 МБ \ n",
      "статус": "успех"
    }  

    Учитывая этот контекст, как нам добавить новый маршрут для hello ? Ты угадал! Давайте откроем flask-app / app.py в нашем любимом редакторе и внесем следующие изменения

      @ app.route ('/')
    def index ():
      вернуть render_template ("index.html")
    
    
    @ app.route ('/ привет')
    def привет ():
      ответьте "привет, мир!"  

    А теперь попробуем сделать запрос еще раз

      $ локон -I 0.0.0.0: 5000 / привет
    HTTP / 1.0 404 НЕ НАЙДЕН
    Тип содержимого: текст / html
    Длина содержимого: 233
    Сервер: Werkzeug / 0.11.2 Python / 2.7.15rc1
    Дата: Пн, 30 июля 2018 г. 15:34:38 ​​GMT  

    О нет! Это не сработало! Что мы сделали не так? Хотя мы внесли изменения в app.py , файл находится на нашей машине (или на хост-машине), но поскольку Docker запускает наши контейнеры на основе образа prakhar1989 / foodtrucks-web , он не знает об этом изменении. Чтобы проверить это, давайте попробуем следующее —

      $ docker-compose запустить web bash
    Запуск es... сделано
    корень @ 581e351c82b0: / opt / flask-app
    app.py package-lock.json шаблоны requirements.txt
    node_modules package.json статический webpack.config.js
    корень @ 581e351c82b0: / opt / flask-app
    корень @ 581e351c82b0: / opt / flask-app  

    То, что мы здесь пытаемся сделать, — это проверить, что наши изменения не внесены в файл app.py , который выполняется в контейнере. Мы делаем это, выполняя команду docker-compose run , которая похожа на ее двоюродного брата docker run , но принимает дополнительные аргументы для службы (в нашем случае это web ).Как только мы запускаем bash , оболочка открывается в / opt / flask-app , как указано в нашем Dockerfile. По команде grep мы видим, что наших изменений нет в файле.

    Давайте посмотрим, как мы можем это исправить. Во-первых, нам нужно указать docker compose не использовать изображение, а вместо этого использовать файлы локально. Мы также установим режим отладки на true , чтобы Flask знал, что нужно перезагрузить сервер при изменении app.py . Замените web часть файла docker-compose .yml файл так:

      версия: "3"
    Сервисы:
      es:
        изображение: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
        имя_контейнера: es
        среда:
          - discovery.type = одноузловой
        порты:
          - 9200: 9200
        объемы:
          - esdata1: / usr / share / elasticsearch / data
      Интернет:
        строить: .
        команда: python3 app.py
        среда:
          - DEBUG = True
        зависит от:
          - es
        порты:
          - «5000: 5000»
        объемы:
          - ./flask-app:/opt/flask-app
    объемы:
      esdata1:
        водитель: местный  

    С этим изменением (diff) давайте остановим и запустим контейнеры.

      $ docker-compose down -v
    Остановка foodtrucks_web_1 ... выполнено
    Остановка es ... сделано
    Удаление foodtrucks_web_1 ... выполнено
    Удаление es ... сделано
    Удаление сети foodtrucks_default
    Удаление тома foodtrucks_esdata1
    
    $ docker-compose up -d
    Создание сети foodtrucks_default с драйвером по умолчанию
    Создание тома foodtrucks_esdata1 с локальным драйвером
    Создание es ... готово
    Создание foodtrucks_web_1 ... выполнено  

    В качестве последнего шага внесем изменения в приложение .py , добавив новый маршрут. Теперь пробуем завить

      $ curl 0.0.0.0:5000/hello
    привет мир  

    Wohoo! Получаем обоснованный ответ! Попробуйте поиграться, внося больше изменений в приложение.

    На этом мы завершаем обзор Docker Compose. С помощью Docker Compose вы также можете приостанавливать работу служб, запускать одноразовую команду для контейнера и даже масштабировать количество контейнеров. Я также рекомендую вам ознакомиться с несколькими другими вариантами использования Docker compose. Надеюсь, мне удалось показать вам, насколько легко управлять многоконтейнерными средами с помощью Compose.В последнем разделе мы собираемся развернуть наше приложение на AWS!

    AWS Elastic Container Service

    В последнем разделе мы использовали docker-compose для локального запуска нашего приложения с помощью одной команды: docker-compose up . Теперь, когда у нас есть работающее приложение, мы хотим поделиться им со всем миром, привлечь пользователей, заработать кучу денег и купить большой дом в Майами. Выполнение последних трех выходит за рамки учебного пособия, поэтому вместо этого мы потратим время на выяснение того, как мы можем развернуть наши многоконтейнерные приложения в облаке с помощью AWS.

    Если вы дочитали до этого места, то в значительной степени уверены, что Docker — довольно крутая технология. И вы не одиноки. Увидев стремительный рост Docker, почти все поставщики облачных услуг начали работать над добавлением поддержки для развертывания приложений Docker на своей платформе. На сегодняшний день вы можете развертывать контейнеры на Google Cloud Platform, AWS, Azure и многих других. У нас уже есть учебник по развертыванию приложений с одним контейнером с помощью Elastic Beanstalk, и в этом разделе мы рассмотрим Elastic Container Service (или ECS) от AWS.

    AWS ECS — это масштабируемая и сверхгибкая служба управления контейнерами, которая поддерживает контейнеры Docker. Он позволяет управлять кластером Docker поверх экземпляров EC2 через простой в использовании API. В то время как Beanstalk поставляется с разумными настройками по умолчанию, ECS позволяет полностью настроить среду в соответствии с вашими потребностями. На мой взгляд, это делает ECS довольно сложной задачей для начала работы.

    К счастью для нас, у ECS есть удобный инструмент командной строки, который понимает файлы Docker Compose и автоматически подготавливает кластер к ECS! Поскольку у нас уже есть действующий файл docker-compose.yml , установка и запуск на AWS не потребуют больших усилий. Итак, приступим!

    Первым шагом является установка интерфейса командной строки. Инструкции по установке CLI на Mac и Linux очень четко объяснены в официальных документах. Идите вперед, установите CLI, и когда вы закончите, проверьте установку, запустив

      $ ecs-cli --версия
    ecs-cli версия 1.18.1 (7e9df84)  

    Далее мы будем работать над настройкой интерфейса командной строки, чтобы мы могли общаться с ECS.Мы будем следовать инструкциям, подробно описанным в официальном руководстве по документации AWS ECS. В случае возникновения недоразумений, смело обращайтесь к этому руководству.

    Первый шаг будет включать создание профиля, который мы будем использовать до конца урока. Чтобы продолжить, вам понадобятся AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY . Чтобы получить их, выполните действия, описанные в разделе «Ключ доступа и секретный ключ доступа » на этой странице.

      $ ecs-cli configure profile --profile-name ecs-foodtrucks --access-key $ AWS_ACCESS_KEY_ID --secret-key $ AWS_SECRET_ACCESS_KEY  

    Затем нам нужно получить пару ключей, которую мы будем использовать для входа в экземпляры.Перейдите в консоль EC2 и создайте новую пару ключей. Загрузите пару ключей и храните ее в надежном месте. Еще одна вещь, на которую следует обратить внимание, прежде чем уходить с этого экрана, — это название региона. В моем случае я назвал свой ключ — ecs и установил свой регион как us-east-1 . Это то, что я предполагаю до конца этого пошагового руководства.

    Следующим шагом является настройка интерфейса командной строки.

      $ ecs-cli configure --region us-east-1 --cluster foodtrucks
    ИНФОРМАЦИЯ [0000] Сохраненная конфигурация интерфейса командной строки ECS для кластера (foodtrucks)  

    Мы предоставляем команде configure имя региона, в котором должен находиться наш кластер, и имя кластера.Убедитесь, что вы предоставили то же имя региона , которое вы использовали при создании пары ключей. Если вы раньше не настраивали интерфейс командной строки AWS на своем компьютере, вы можете использовать официальное руководство, в котором все подробно объясняется, как все работает.

    Следующий шаг позволяет CLI создать шаблон CloudFormation.

      $ ecs-cli up --keypair ecs --capability-iam --size 1 --instance-type t2.medium
    ИНФОРМАЦИЯ [0000] Использование рекомендованного AMI Amazon Linux 2 с агентом ECS 1.39.0 и Docker версии 18.09.9-ce
    ИНФОРМАЦИЯ [0000] Созданный кластер cluster = foodtrucks
    ИНФОРМАЦИЯ [0001] Ожидание создания ресурсов кластера.
    ИНФОРМАЦИЯ [0001] Статус стека облачной информации stackStatus = CREATE_IN_PROGRESS
    ИНФОРМАЦИЯ [0062] Статус стека облачной информации stackStatus = CREATE_IN_PROGRESS
    ИНФОРМАЦИЯ [0122] Статус стека облачной информации stackStatus = CREATE_IN_PROGRESS
    ИНФОРМАЦИЯ [0182] Статус стека облачной информации stackStatus = CREATE_IN_PROGRESS
    ИНФОРМАЦИЯ [0242] Статус стека облачной информации stackStatus = CREATE_IN_PROGRESS
    VPC создан: vpc-0bbed8536930053a6
    Создана группа безопасности: sg-0cf767fb4d01a3f99
    Подсеть создана: subnet-05de1db2cb1a50ab8
    Подсеть создана: subnet-01e1e8bc95d49d0fd
    Кластер создан. 

    Здесь мы указываем имя пары ключей, которую мы загрузили изначально ( ecs в моем случае), количество экземпляров, которые мы хотим использовать ( - размер ), и тип экземпляров, на которых мы хотим, чтобы контейнеры запускались. . Флаг --capability-iam сообщает CLI, что мы подтверждаем, что эта команда может создавать ресурсы IAM.

    Последний и последний шаг — это то, где мы будем использовать наш файл docker-compose.yml . Нам нужно будет внести несколько незначительных изменений, поэтому вместо изменения оригинала давайте сделаем его копию.Содержимое этого файла (после внесения изменений) выглядит (ниже) —

      версия: '2'
    Сервисы:
      es:
        изображение: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
        cpu_shares: 100
        mem_limit: 3621440000
        среда:
          - discovery.type = одноузловой
          - bootstrap.memory_lock = true
          - "ES_JAVA_OPTS = -Xms512m -Xmx512m"
        протоколирование:
          драйвер: awslogs
          параметры:
            awslogs-group: фудтраки
            awslogs-region: us-east-1
            префикс-поток-awslogs: es
      Интернет:
        изображение: prakhar1989 / foodtrucks-web
        cpu_shares: 100
        mem_limit: 262144000
        порты:
          - «80: 5000»
        ссылки:
          - es
        протоколирование:
          драйвер: awslogs
          параметры:
            awslogs-group: фудтраки
            awslogs-region: us-east-1
            префикс-потока-awslogs: веб- 

    Единственные изменения, которые мы внесли по сравнению с исходным файлом docker-compose.yml предоставляют значения mem_limit (в байтах) и cpu_shares для каждого контейнера и добавляют некоторую конфигурацию журналирования. Это позволяет нам просматривать журналы, созданные нашими контейнерами, в AWS CloudWatch. Перейдите в CloudWatch, чтобы создать группу журналов под названием foodtrucks . Обратите внимание, что, поскольку ElasticSearch обычно занимает больше памяти, мы предоставили лимит памяти около 3,4 ГБ. Еще одна вещь, которую нам нужно сделать, прежде чем мы перейдем к следующему шагу, — это опубликовать наш образ в Docker Hub.

      $ docker push prakhar1989 / foodtrucks-web  

    Отлично! Теперь давайте запустим последнюю команду, которая развернет наше приложение на ECS!

      $ cd aws-ecs
    $ ecs-cli создать
    ИНФОРМАЦИЯ [0000] Использование определения задачи ECS TaskDefinition = ecscompose-foodtrucks: 2
    ИНФОРМАЦИЯ [0000] Запуск контейнера ... container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / es
    ИНФОРМАЦИЯ [0000] Запуск контейнера ... container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / web
    ИНФОРМАЦИЯ [0000] Описание состояния контейнера ECS container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / web desireStatus = RUNNING lastStatus = PENDING taskDefinition = ecscompose-foodtrucks: 2
    ИНФОРМАЦИЯ [0000] Описание состояния контейнера ECS container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / es desireStatus = RUNNING lastStatus = PENDING taskDefinition = ecscompose-foodtrucks: 2
    ИНФОРМАЦИЯ [0036] Описание состояния контейнера ECS container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / es желаемыйStatus = RUNNING lastStatus = PENDING taskDefinition = ecscompose-foodtrucks: 2
    ИНФОРМАЦИЯ [0048] Описание состояния контейнера ECS container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / web desireStatus = RUNNING lastStatus = PENDING taskDefinition = ecscompose-foodtrucks: 2
    ИНФОРМАЦИЯ [0048] Описание состояния контейнера ECS container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / es желаемыйStatus = RUNNING lastStatus = PENDING taskDefinition = ecscompose-foodtrucks: 2
    ИНФОРМАЦИЯ [0060] Запущенный контейнер... container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / web desireStatus = RUNNING lastStatus = RUNNING taskDefinition = ecscompose-foodtrucks: 2
    ИНФОРМАЦИЯ [0060] Запущенный контейнер ... container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / es desireStatus = RUNNING lastStatus = RUNNING taskDefinition = ecscompose-foodtrucks: 2  

    Не случайно, что приведенный выше вызов похож на тот, который мы использовали с Docker Compose . Если все прошло хорошо, вы должны увидеть желаемый статус = РАБОТАЕТ lastStatus = РАБОТАЮЩИЙ в качестве последней строки.

    Отлично! Наше приложение работает, но как мы можем получить к нему доступ?

      ecs-cli пс
    Имя Состояние Порты Задача Определение
    845e2368-170d-44a7-bf9f-84c7fcd9ae29 / web RUNNING 54.86.14.14:80->5000/tcp ecscompose-foodtrucks: 2
    845e2368-170d-44a7-bf9f-84c7fcd9ae29 / es РАБОТАЮЩИЕ ecscompose-foodtrucks: 2  

    Идите вперед и откройте http://54.86.14.14 в своем браузере, и вы увидите Food Trucks во всей его черно-желтой красе!
    Раз уж мы затронули тему, давайте посмотрим, как выглядит наша консоль AWS ECS.

    Выше мы видим, что наш кластер ECS под названием «foodtrucks» был создан и теперь выполняет 1 задачу с 2 экземплярами контейнеров. Потратьте некоторое время на просмотр этой консоли, чтобы ознакомиться со всеми опциями, которые здесь есть.

    Очистка

    После того, как вы поигрались с развернутым приложением, не забудьте выключить кластер —

      $ ecs-cli вниз - форс
    ИНФОРМАЦИЯ [0001] Ожидание удаления ресурсов кластера ...
    ИНФОРМАЦИЯ [0001] Статус стека облачной информации stackStatus = DELETE_IN_PROGRESS
    ИНФОРМАЦИЯ [0062] Статус стека облачной информации stackStatus = DELETE_IN_PROGRESS
    ИНФОРМАЦИЯ [0124] Статус стека облачной информации stackStatus = DELETE_IN_PROGRESS
    ИНФОРМАЦИЯ [0155] Удаленный кластер cluster = foodtrucks  

    Итак, вот оно.С помощью всего нескольких команд мы смогли развернуть наше потрясающее приложение в облаке AWS!


    Заключение

    Вот и все! После долгого, исчерпывающего, но увлекательного урока вы теперь готовы штурмовать контейнерный мир! Если вы следовали до самого конца, то вам определенно стоит гордиться собой. Вы узнали, как настроить Docker, запустить свои собственные контейнеры, поиграть со статическими и динамическими веб-сайтами, и, что наиболее важно, получили практический опыт развертывания приложений в облаке!

    Я надеюсь, что завершение этого урока сделает вас более уверенными в своих способностях работать с серверами.Когда у вас есть идея создать свое следующее приложение, вы можете быть уверены, что сможете донести его до людей с минимальными усилиями.

    Следующие шаги

    Ваше путешествие в мир контейнеров только началось! Моей целью в этом руководстве было пробудить ваш аппетит и показать вам мощь Docker. В море новых технологий может быть сложно ориентироваться в воде в одиночку, и такие учебные пособия, как этот, могут помочь вам. Это руководство по Docker, которое я хотел бы иметь, когда только начинал.Надеюсь, это послужило своей цели — заинтересовать вас контейнерами, чтобы вам больше не приходилось наблюдать за происходящим со стороны.

    Ниже приведены несколько дополнительных ресурсов, которые будут полезны. Для вашего следующего проекта я настоятельно рекомендую вам использовать Docker. Помните — практика ведет к совершенству!

    Дополнительные ресурсы

    Давай, молодой падаван!

    Оставить отзыв

    Теперь, когда урок окончен, моя очередь задавать вопросы.Как вам урок? Вы нашли этот учебник полным беспорядком или вы повеселились и чему-то научились?

    Отправьте свои мысли прямо мне или просто создайте проблему. Я тоже в Твиттере, так что если это ваша сделка, не стесняйтесь кричать там!

    Мне очень хотелось бы услышать о вашем опыте работы с этим руководством. Дайте предложения, как это исправить, или сообщите мне о моих ошибках. Я хочу, чтобы это руководство было одним из лучших вводных руководств в Интернете, и я не смогу сделать это без вашей помощи.


    Docker hello-world контейнер не запускается на Windows Server 2016 поверх VMWare

    Я пытался установить и запустить Docker на виртуальной машине Windows, чтобы лучше понять среду выполнения для последующей работы, и у меня возникают проблемы с запуском контейнера hello-world .

    Окружающая среда:

    • Виртуальное оборудование VMWare:
      • 4 ГБ ОЗУ
      • Процессор Intel Xenon (2 ядра)
    • Windows Server 2016 Standard (версия 1607)
    • Некоторые соображения по поводу антивируса и брандмауэра (я получаю больше информации по ним)

    Вывод из версии докера :

      Клиент:
     Версия: 17.06.2-ее-6
     Версия API: 1.30
     Версия Go: go1.8.3
     Git commit: e75fdb8
     Построен: 27 ноя, пн, 22:46:09, 2017
     ОС / Arch: windows / amd64
    
    Сервер:
     Версия: 17.06.2-ee-6
     Версия API: 1.30 (минимальная версия 1.24)
     Версия Go: go1.8.3
     Git commit: e75fdb8
     Построен: 27 ноя, пн, 22:55:16, 2017
     ОС / Arch: windows / amd64
     Экспериментальный: ложь
      

    Что работали:

    Чего нет:

    Запуск любого контейнера. Мы пробовали несколько:

    • привет-мир: наносервер
    • привет-мир: последние новости
    • microsoft / nanoserver: последняя версия
    • microsoft / windowsservercore: последняя версия

    Что я уже пробовал (безуспешно):

    • Ослабление настроек нашей групповой политики
    • Включение дополнительного компонента Hyper-V Windows

    Что происходит на самом деле:

    Когда я пытаюсь запустить контейнер с помощью docker run {container-name-here} , PowerShell зависает на значительное время (пару минут) и выводит следующее сообщение:

      C: \ Program Files \ docker \ docker.exe: ответ об ошибке от демона: контейнер
        {container-id-here} обнаружил ошибку при запуске: сбой в
        Системный вызов Windows: эта операция вернулась из-за тайм-аута.
        срок истек. (0x5b4).
      

    В журнале событий докеров я получаю одновременно следующие сообщения:

      2018-04-18T09: 36: 27.881680400-04: 00 создание контейнера {container-id-here} (image = hello-world: nanoserver, name = sure_ardinghelli)
    2018-04-18T09: 36: 27.883680800-04: 00 прикрепление контейнера {идентификатор-контейнера} (image = hello-world: nanoserver, name = sure_ardinghelli)
    2018-04-18T09: 36: 28.753726900-04: 00 подключение к сети {идентификатор-сети-здесь} (контейнер = {идентификатор-контейнера-здесь}, имя = nat, тип = nat)
    2018-04-18T09: 40: 21.373395500-04: 00 отключение сети {network-id-here} (container = {container-id-here}, name = nat, type = nat)
      

    Мы получаем сообщение о тайм-ауте между сетевым подключением и отключением сети .

    Ссылки, которые я нашел при поиске (здесь и здесь), указывают на то, что это может быть проблема с антивирусом, но мне не удалось найти никакой документации о том, как подтвердить, что это проблема с антивирусом или какой антивирусный компонент может быть проблема заключается в отключении антивируса и повторной попытке.Я работаю над тем, чтобы связаться с людьми, у которых есть доступ к этой части системы, и попробую еще раз, я обновлю результаты.

    • Кто-нибудь еще сталкивался с этой или подобной проблемой раньше? Какие шаги вы смогли предпринять, чтобы диагностировать основную причину, и что в итоге стало проблемой в вашем случае?
    • Есть ли другие журналы Docker или Windows, которые мне следует изучить, чтобы лучше диагностировать причину проблемы?
    • Какие еще «кадры в темноте» стоит попробовать? У нас заканчиваются идеи после того, как мы прошли отладку системы безопасности.

    Мы поговорили с командой безопасности и обсудили включение и отключение различных антивирусных компонентов. Когда мы отключили McAfee Host IPS (HIPS), мы смогли запустить любой из наших контейнеров, как и ожидалось. Когда мы включаем его снова, контейнеры снова ломаются! Мы обнаружили в журнале HIPS предупреждение об отказе в чтении реестра, которое по времени совпадает с нашим сеансом отладки, и отследили этот доступ к реестру обратно к процессу docker.exe с помощью Process Monitor от Microsoft Sysinternals.Похоже, у нас есть виновник!

    Я сообщу, когда мы добавим запись в белый список для правила и подтвердим исправление.

    .

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *