вівторок, 31 травня 2016 р.

Докер-команда `info`

Тепер розглянемо, одну з найпростіших докер-команд, команду `info`:

$ docker info --help

Usage:  docker info [OPTIONS]

Display system-wide information

  --help             Print usage

Жодних додаткових параметрів ця команда не потребує. Єдиний додатковий
(не обов"язковий) параметр, який може бути задіяний – це `--help`,
який ми щойно використали. Виконання команди:

$ docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.10.3
Storage Driver: devicemapper
 Pool Name: docker-8:7-8602006-pool
 Pool Blocksize: 65.54 kB
 Base Device Size: 10.74 GB
 Backing Filesystem: ext4
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 305.7 MB
 Data Space Total: 107.4 GB
 Data Space Available: 17.26 GB
 Metadata Space Used: 733.2 kB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.147 GB
 Udev Sync Supported: true
 Deferred Removal Enabled: false
 Deferred Deletion Enabled: false
 Deferred Deleted Device Count: 0
 Data loop file: /str/data-storage/docker20/devicemapper/devicemapper/data
 WARNING: Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
 Metadata loop file: /str/data-storage/docker20/devicemapper/devicemapper/metadata
 Library Version: 1.02.93 (2015-01-30)
Execution Driver: native-0.2
Logging Driver: json-file
Plugins:
 Volume: local
 Network: bridge null host
Kernel Version: 4.1.12-gentoo
Operating System: Gentoo/Linux
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 7.682 GiB
Name: demi
ID: DQI2:SBOZ:JUTI:7TAG:UO7W:IAYV:IIEF:PJTZ:7YEW:NYVO:G55Z:NIED
Username: atykhonov
Registry: https://index.docker.io/v1/

Ця команда виводить коротку інформацію про поточну систему (Kernel
Version, OSType тощо), версію докер сервера (1.10.3) про наявну
кількість контейнерів (образів) і багато іншої довідкової інформації.

суботу, 14 травня 2016 р.

Докер-команда `version`

На самому початку, пропоную отримати допомогу по докер-команді
`version`:

$ docker version --help

Usage:  docker version [OPTIONS]

Show the Docker version information

  -f, --format       Format the output using the given go template
  --help             Print usage

Це коротка довідкова інформація про те, як саме можна скористатися
докер-командою `version`, які параметри вона може прийняти. Як бачимо,
цій команді можна передати два параметри (OPTIONS), які є не
обов'язковими (тому що в квадратних дужках): `-f` та
`--help`. Останній ми щойно спробували, а параметр `-f` можливо
розглянемо іншим разом. Оскільки ці параметри є не обов'язковими,
докер-команду `version` можна запустити наступним чином:

$ docker version
Client:
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.6
 Git commit:   20f81dd
 Built:        
 OS/Arch:      linux/amd64

Server:
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.6
 Git commit:   20f81dd
 Built:        
 OS/Arch:      linux/amd64

Отримали інформацію про клієнт та сервер: версії програм, версії API,
встановлені версії мови програмування go (за допомогою якого створений
docker) тощо.

Docker побудований на основі архітектури клієнт-сервер. Для того, щоби
скористатися докером, нам потрібен клієнт, а клієнту необхідний
сервер.

Запускаючи будь-яку команду (наприклад `docker version`), ми тим самим
запускаємо клієнт (docker). Він, у свою чергу, під'єднується до
сервера, та передає йому поточну команду. Задача клієнта – отримати
від користувача команду та передати її серверу, а пізніше – отримати
відповідь від сервера та повернути її користувачу. Задача сервера –
виконати отриману від клієнта команду, та повернути результат її
виконання.

Спробуйте зупинити сервер (демон) докера. На Ubuntu, для прикладу, це
можна зробити наступним чином:

$ sudo service docker stop

Якщо докер-сервер зупинений, то отримаємо наступний результат:

$ docker version
Client:
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.6
 Git commit:   20f81dd
 Built:        
 OS/Arch:      linux/amd64
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Клієнт повернув усю відому про себе інформацію, а також спробував
приєднатися до сервера та виконати команду `version`, але приєднатися
до сервера не вдалося (про що і йдеться в останній стрічці виводу).

Запустіть сервер знову і виконайте команду `ps aux | grep docker`:

$ ps aux | grep docker
root     18016 10.0  0.4 329016 32376 ?        Ssl  17:43   0:00 /usr/bin/docker daemon -p /run/docker.pid

Отримали інформацію про запущений процес докер-сервера. Цікавим є те,
що клієнт та сервер використовують одну і ту саму програму:
`/usr/bin/docker`. В залежності від параметрів які передаються цій
програмці, вона поводиться або як клієнт, або як сервер. При передачі
параметра `daemon`, докер буде поводитись як сервер (демон).

Мабудь відразу варто зауважити, що щоби скористатися докер-сервером,
не обов'язково знаходитися на одному і тому самому комп'ютері. Ним,
завдяки клієнт-серверній архітектурі, можна скористатися і віддалено,
з іншого комп'ютера:

$ docker --host=tcp://example.com:/var/run/docker.sock
Client:
 Version:      1.11.0
 API version:  1.23
 Go version:   go1.6
 Git commit:   4dc5990
 Built:        
 OS/Arch:      linux/amd64
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Звісно, сервер повинен бути відповідно налаштований, щоб мати
можливість співпрацювати з нашим клієнтом. В інакшому випадку
отримаємо таку ж помилку, яку щойно отримали.

пʼятницю, 13 травня 2016 р.

Допомога по докеру

Отже, `docker` встановлений і доступний для використання:

$ docker --version
Docker version 1.11.0, build 4dc5990

Почнемо з найпростішого, з допомоги:

$ docker --help
Usage: docker [OPTIONS] COMMAND [arg...]
       docker daemon [ --help | ... ]
       docker [ --help | -v | --version ]

A self-sufficient runtime for containers.

Options:

  --config=~/.docker              Location of client config files
  -D, --debug                     Enable debug mode
  -H, --host=[]                   Daemon socket(s) to connect to
  -h, --help                      Print usage
  -l, --log-level=info            Set the logging level
  --tls                           Use TLS; implied by --tlsverify
  --tlscacert=~/.docker/ca.pem    Trust certs signed only by this CA
  --tlscert=~/.docker/cert.pem    Path to TLS certificate file
  --tlskey=~/.docker/key.pem      Path to TLS key file
  --tlsverify                     Use TLS and verify the remote
  -v, --version                   Print version information and quit

Commands:
    attach    Attach to a running container
    build     Build an image from a Dockerfile
    commit    Create a new image from a container's changes
    cp        Copy files/folders between a container and the local filesystem
    create    Create a new container
    diff      Inspect changes on a container's filesystem
    events    Get real time events from the server
    exec      Run a command in a running container
    export    Export a container's filesystem as a tar archive
    history   Show the history of an image
    images    List images
    import    Import the contents from a tarball to create a filesystem image
    info      Display system-wide information
    inspect   Return low-level information on a container or image
    kill      Kill a running container
    load      Load an image from a tar archive or STDIN
    login     Register or log in to a Docker registry
    logout    Log out from a Docker registry
    logs      Fetch the logs of a container
    network   Manage Docker networks
    pause     Pause all processes within a container
    port      List port mappings or a specific mapping for the CONTAINER
    ps        List containers
    pull      Pull an image or a repository from a registry
    push      Push an image or a repository to a registry
    rename    Rename a container
    restart   Restart a container
    rm        Remove one or more containers
    rmi       Remove one or more images
    run       Run a command in a new container
    save      Save an image(s) to a tar archive
    search    Search the Docker Hub for images
    start     Start one or more stopped containers
    stats     Display a live stream of container(s) resource usage statistics
    stop      Stop a running container
    tag       Tag an image into a repository
    top       Display the running processes of a container
    unpause   Unpause all processes within a container
    update    Update resources of one or more containers
    version   Show the Docker version information
    volume    Manage Docker volumes
    wait      Block until a container stops, then print its exit code

Run 'docker COMMAND --help' for more information on a command.

Ця допомога – є Вашим другом, помічником і порадником! :) Користуйтеся
нею частіше! Вона дозволяє швидко пригадати, які саме команди є
доступними для тієї чи іншої операції. А порада, яку можна бачити в
останній стрічці виводу

Run 'docker COMMAND --help' for more information on a command.

завжди дозволить отримати швидку інформацію про те, як саме
скористатися тією чи іншою командою!

Отже, в секції "Commands" перелічена чимала кількість різноманітних
команд, таких як `build`, `run`, `restart` тощо. Забігаючи наперед,
хочу відмітити, що саме за допомогою цих команд і відбувається
керування докером. Їх і будемо розглядати.

Якщо ще раз переглянути весь вивід, власне кажучи, список команд та
усі їхні короткі описи, як наприклад,

build     Build an image from a Dockerfile

то можна виділити наступні терміни:

container (контейнер), image (образ), Dockerfile, registry (реєстр),
port mappings, repository (репозиторій), Docker Hub (докер хаб), docker
network (мережа докера) та volumes (томи).

З кожним з цих термінів познайомимся згодом більш детальніше. А зараз
спробуємо знайти ті команди, з яких можна було б почати дослідження.

Ми не можемо в даний момент скористатися будь-якою першою-ліпшою
командою, як наприклад, `attach` (attach to a running container) через
те, що вона (тай багато інших) потребує запущений контейнер (чи образ
тощо). А ми ще не запустили жодного контейнера. Насамперед, пошукаємо
команди, які не задіюють жодного з перелічених термінів. Як бачимо, є
лише дві такі команди:

info      Display system-wide information
version   Show the Docker version information

Спробуємо використати команду `version`.

четвер, 12 травня 2016 р.

Тестуємо чи правильно встановлений докер

Якщо докер встановлений і його сервер запущений, то, перш ніж рухатися
далі, варто протестувати чи все працює вірно. Для цього запустимо
наступну команду:
 
$ 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/

Якщо Ви отримали приблизно такий самий вивід, то (чудово!) докер
працює вірно! Отже, можна переходити до наступних дослідів.

В наступних статтях я буду покладатися на те, що у Вас немає жодного
образу чи контейнера. Щойно виконана команда `docker run hello-world`,
встановила один образ та контейнер, давайте спершу витремо їх для
того, щоб перейти далі?

Просто виконайте наступні дві команди:
 
$ docker rm $(docker ps -aq)
5bcdf1d4ac27

$ docker rmi $(docker images -q)
Untagged: hello-world:latest
Deleted: sha256:94df4f0ce8a4d4d4c030b9bdfe91fc9cf6a4b7be914542315ef93a046d520614
Deleted: sha256:92953e7618fbb0f7991146fccf4da3dc31e1b5104b6d6c9572ee75d3eba240a2
Deleted: sha256:33e7801ac047e45517f22927037407c9753aa27ed72a5932c3e0886477041b12

пʼятницю, 6 травня 2016 р.

Вступ

Розпочинаю (експериментальну) серію коротких статей про docker
(https://www.docker.com/), для тих, хто хоче освоїти його на базовому
рівні.

Формат цих статей – це мікро-дослідження. Кожна стаття – це спроба
дослідити одну, або декілька, особливостей докера. Крок за кроком буду
описувати практичне використання основних можливостей.

Теоретичної інформації буде доволі мало, і в основному, буду наводити
її лиш для того, щоб зорієнтувати в інформаційному просторі. До
прикладу кажучи, не буду надто заглиблюватися в тонкощі різних
термінів та понять (таких як образ чи контейнер), а скоріше буду
описувати зв'язки між ними, і де, на практиці, можна з ними стикнутися
чи використати. А вже саме практичне використання, на що дуже
сподіваюсь, виявить для читача основні можливості та особливості цих
понять.

Оскільки статті мають практичний ухил, то читати їх звісно що буде
корисніше з емулятором терміналу (як наприклад, xterm, rxvt, konsole,
gnome-terminal чи будь-яким іншим) і докером під руками, виконуючи
кожну команду власноруч, отримуючи ті самі результати, що й можна
бачити в статтях. Ще краще буде, якщо кожна команда буде введена без
допомоги копіювання.

Для того щоби почати, Вам необхідно встановити докер та запустити
докер-сервер. Як зробити те чи інші – в Інтернеті знайдете безліч
інформації щодо цього. Ось тут є офіційна інформація про те, як
встановити докер на такі операційні системи як Arch Linux, Ubuntu,
Windows, Mac OS X та інші.