Запуск простого приложения

В примере Hello world в контейнере вы запустили свои первые контейнеры с помощью команды docker run. Вы запустили интерактивный контейнер работающий в консоли. А также фоновый контейнер работающий как демон. В процессе вы выучили несколько Docker команд:

  • docker ps - Список запущенных контейнеров.
  • docker logs - Показывает стандартный вывод контейнера.
  • docker stop - Останавливает запущенные контейнеры.

Подробнее о клиенте Docker

Если вы еще не догадались, вы использовали Docker клиент каждый раз когда набирали команду docker в вашем терминале. Клиент командной строки также известен как интерфейс командной строки (CLI). Каждое действие выполняемое клиентом вызывается с помощью специальной команды, каждая команда принимает набор флагов и аргументов.

# Usage:  [sudo] docker [subcommand] [flags] [arguments] ..
# Example:
$ docker run -i -t ubuntu /bin/bash

Вы можете увидеть все это в действии выполнив команду docker versionкоторая возвращает информацию о версии установленного Docker клиента и сервера (demon).

$ docker version

Эта команда не только покажет вам версию Докер клиента и демона, но и версию Go (язык программирования на котором написан Docker).

Client:
  Version:      1.8.1
  API version:  1.20
  Go version:   go1.4.2
  Git commit:   d12ea79
  Built:        Thu Aug 13 02:35:49 UTC 2015
  OS/Arch:      linux/amd64

Server:
  Version:      1.8.1
  API version:  1.20
  Go version:   go1.4.2
  Git commit:   d12ea79
  Built:        Thu Aug 13 02:35:49 UTC 2015
  OS/Arch:      linux/amd64

Получение справки

Вы можете отобразить справку по определенным командам Docker. Помощь отображает информацию по использованию команд. Чтобы увидеть список всех возможных команд выполните в командной строке:

$ docker --help

Что бы увидеть справку по конкретной команде, выполните команду с флагом --help:

$ docker attach --help

Usage: docker attach [OPTIONS] CONTAINER

Attach to a running container

Options:
  --detach-keys string   Override the key sequence for detaching a container
  --help                 Print usage
  --no-stdin             Do not attach STDIN
  --sig-proxy            Proxy all received signals to the process (default true)

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

Запуск web-приложения в Docker

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

Для нашего веб-приложения мы собираемся запустить Python Flask. Начнем с команды docker run.

$ docker run -d -P training/webapp python app.py

Проверьте, что команда выполнена. Вы указали два флага: -d и -P. Вы уже видели флаг -d, который указывает Docker запустить контейнер в фоновом режиме. Флаг -P говорит Докер связывать любые необходимые сетевые порты внутри нашего контейнера с портами родительской машины. Это позволяет нам просматривать наш веб-приложение.

Вы использовали образ: training/webapp. Этот образ является преднастроенным образом содержащим простое веб-приложение Python Flask.

В конце вы определяете команду для запуска контейнера python app.py. Она запускает веб-приложение.

Примечание: дополнительную информацию о команде docker run вы найдете в разделах справка по командам и справка по Docker run.

Просмотр нашего веб-приложения

Теперь вы можете увидеть запущенный контейнер выполнив команду docker ps.

$ docker ps -l

CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES
bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse

Вы можете заметить, что мы использовали новый флаг, -l, для команды docker ps. С этим флагом команда docker ps вернет информацию о последнем запущенном контейнере.

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

Мы можем увидеть ту же информацию что мы видели в примере запуск hello world в контейнере, с одним важным дополнением колонкой PORTS.

PORTS
0.0.0.0:49155->5000/tcp

Когда мы добавили флаг -P к команде docker run Докер связывает все порты открытые в образе с хостом.

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

В этом примере Docker открывает порт 5000 (порт по умолчанию для Python Flask) и связывает его с портом 49155 машины на которой запущен Докер.

В Docker очень удобно настраивать связки сетевых портов. В нашем последнем примере флаг -P является краткой записью -p 5000 которая связывает 5000 порт внутри контейнера (с одним из диапазона временных портов от 32768 до 61000) на локальном Docker хосте. Мы можем связывать порты контейнеров Docker используя флаг -p, к примеру:

$ docker run -d -p 80:5000 training/webapp python app.py

Свяжет порт 5000 внутри нашего контейнера с 80 портом на локальном хосте. вы можете спросить: почему бы всегда не связывать порты 1 к 1? Но это может быть не всегда удобным, поскольку одни и те же порты могут быть открыты в нескольких запущенных контейнерах.

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

Итак, теперь вы можете посмотреть в браузере работу приложения на 49155 порту.

Viewing the web application.

Наше приложение работает!

Примечание: Если вы используете виртуальную машину на OS X, Windows или Linux, вам необходимо получить IP-адрес виртуального хоста вместо использования localhost. Вы можете сделать это выполнив команду docker-machine ip your_vm_name из командной строки, к примеру:

$ docker-machine ip my-docker-vm
192.168.99.100

В этом случае вам нужно перейти по адресу http://192.168.99.100:49155 для проверки работы приложения.

Ярлыки для сетевых портов

Использование команды docker ps не всегда удобно, по этому Docker имеет полезную команду: docker port. Для использования docker port мы указываем ID или имя контейнера и порт, который мы хотим открыть.

$ docker port nostalgic_morse 5000

0.0.0.0:49155

В этом примере мы видим номер внешнего порта привязанного к внутреннему 5000 порту в контейнере.

Просмотр логов веб-приложения

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

$ docker logs -f nostalgic_morse

* Running on http://0.0.0.0:5000/
10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 -
10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -

В этот раз мы используем флаг, -f. Это приводит к тому, что команда docker logs ведет себя как Linux команда tail -f и показывает стандартный вывод команды. Мы можем видеть логи из приложения Flask запущенного на 5000 порту.

Просмотр процессов контейнера с web-приложением

В дополнение к логам контейнера, мы также можем посмотреть процессы запущенные в нем использовав команду docker top.

$ docker top nostalgic_morse

PID                 USER                COMMAND
854                 root                python app.py

Здесь мы можем увидеть нашу команду python app.py это единственный процесс запущенный внутри контейнера.

Просмотр конфигурации контейнера web-приложения

И, наконец мы можем заглянуть в наш Docker контейнер на "низком" уровне использовав команду docker inspect. Она возвращает JSON документ содержащий конфигурацию и другую полезную информацию о выбранном контейнере.

$ docker inspect nostalgic_morse

Вот пример возвращаемого JSON.

[{
    "ID": "bc533791f3f500b280a9626688bc79e342e3ea0d528efe3a86a51ecb28ea20",
    "Created": "2014-05-26T05:52:40.808952951Z",
    "Path": "python",
    "Args": [
       "app.py"
    ],
    "Config": {
       "Hostname": "bc533791f3f5",
       "Domainname": "",
       "User": "",
. . .

Мы можем также конкретизировать информацию, которую мы хотим вернуть, запрашивая определенный элемент, например, для возврата IP-адреса контейнера:

$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nostalgic_morse

172.17.0.5

Остановка контейнера с web-приложением

Хорошо, мы убедились что наше приложение работает. Теперь можно остановить его использовав команду docker stop и название контейнера: nostalgic_morse.

$ docker stop nostalgic_morse

nostalgic_morse

Теперь можно выполнить команду docker ps что бы убедиться что контейнер остановлен.

$ docker ps -l

Перезапуск контейнера с web-приложением

Опс! Сразу же после остановки контейнера другой разработчик просит вас снова запустить его. Здесь у вас есть два варианта: создать новый контейнер или перезапустить старый. Начнем с повторного запуска старого контейнера.

$ docker start nostalgic_morse

nostalgic_morse

Теперь выполним docker ps -l и убедимся что контейнер снова запущен и URL приложения отвечает.

Примечание: Также можно использовать команду docker restart которая сначала останавливает, а потом вновь запускает контейнер.

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

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

$ docker rm nostalgic_morse

Error: Impossible to remove a running container, please stop it first or use -f
2014/05/24 08:12:56 Error: failed to remove one or more containers

Что произошло? Мы не можем удалить запущенный контейнер. Это защищает от случайного удаления используемого контейнера Вы можете попробовать снова предварительно остановив контейнер.

$ docker stop nostalgic_morse

nostalgic_morse

$ docker rm nostalgic_morse

nostalgic_morse

Наконец наш контейнер остановлен и удален.

Примечание: Всегда помните, что удаление контейнера окончательно!

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

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


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

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

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