В примере Hello world в контейнере вы запустили свои первые контейнеры с помощью команды docker run
. Вы запустили интерактивный контейнер работающий в консоли. А также фоновый контейнер работающий как демон. В процессе вы выучили несколько Docker команд:
docker ps
- Список запущенных контейнеров.docker logs
- Показывает стандартный вывод контейнера.docker stop
- Останавливает запущенные контейнеры.Если вы еще не догадались, вы использовали 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)
Примечание: Более подробную информацию и примеры каждой команды вы найдете в разделе руководство по командам.
Итак, вы узнали немного больше о клиенте 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 порту.
.
Наше приложение работает!
Примечание: Если вы используете виртуальную машину на 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 порту.
В дополнение к логам контейнера, мы также можем посмотреть процессы запущенные в нем использовав команду docker top
.
$ docker top nostalgic_morse
PID USER COMMAND
854 root python app.py
Здесь мы можем увидеть нашу команду python app.py
это единственный процесс запущенный внутри контейнера.
И, наконец мы можем заглянуть в наш 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
Хорошо, мы убедились что наше приложение работает. Теперь можно остановить его использовав команду docker stop
и название контейнера: nostalgic_morse
.
$ docker stop nostalgic_morse
nostalgic_morse
Теперь можно выполнить команду docker ps
что бы убедиться что контейнер остановлен.
$ docker ps -l
Опс! Сразу же после остановки контейнера другой разработчик просит вас снова запустить его. Здесь у вас есть два варианта: создать новый контейнер или перезапустить старый. Начнем с повторного запуска старого контейнера.
$ 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. Далее, вы можете научиться строить и расшаривать собственные образы.
перейдите к разделу создание собственных образов Docker.
Комментарии:
Пожалуйста, авторизуйтесь что бы оставлять комментарии.