# Команды Docker

## Введение 
Рассмотрим команды, которые необходимо знать для использования Docker.

Список базовых команд:

- Справочная страница:
```bash
docker help
```
- Версия Dсocker:
```bash
docker version
```
- Базовая информация о работе Docker:
```bash
docker info
```

## Поиск образов

Поиск можно осуществлять на [сайте образов docker](https://hub.Docker.com/), но иногда можно искать и с помощью команд.

**Почему это полезно?** Мы быстрее получим необходимый список и сможем выбрать нужный Docker.

**Обычный поиск:**
```bash
docker search wordpress
```

???info "Пример резульата"
    ```
    NAME                      DESCRIPTION                                     STARS     OFFICIAL
    wordpress                 The WordPress rich content management system…   5855      [OK]
    bitnami/wordpress         Bitnami Secure Image for wordpress              281       
    bitnamicharts/wordpress   Bitnami Helm chart for WordPress                2         
    elestio/wordpress         Wordpress, verified and packaged by Elestio     6         
    secoresearch/wordpress    Apache+PHP+Varnish+Wordpress                    0         
    shinsenter/wordpress      🔋 (PHP / Wordpress) Production-ready Docker…   5         
    vulhub/wordpress                                                          4         
    chainguard/wordpress      Build, ship and run secure software with Cha…   0         
    corpusops/wordpress       https://github.com/corpusops/docker-images/     0         
    rootpublic/wordpress                                                      0         
    centurylink/wordpress     Wordpress image with MySQL removed.             14        
    erikzenker/wordpress      wordpress docker image                          0         
    arm64v8/wordpress         The WordPress rich content management system…   21        
    arm32v7/wordpress         The WordPress rich content management system…   16        
    tutum/wordpress           Out-of-the-box Wordpress docker image           42        
    amd64/wordpress           The WordPress rich content management system…   2         
    demyx/wordpress           Non-root Docker image running Alpine Linux, …   2         
    i386/wordpress            The WordPress rich content management system…   1         
    ppc64le/wordpress         The WordPress rich content management system…   1         
    wodby/wordpress           Vanilla WordPress container image               2         
    itherz/wordpress          Wordpress                                       0         
    s390x/wordpress           The WordPress rich content management system…   5         
    spatialy/wordpress        Wordpress + PHP Extensions                      0         
    arm32v5/wordpress         The WordPress rich content management system…   0         
    mips64le/wordpress        The WordPress rich content management system…   1         
    ```

Здесь мы получаем список из 4 столбцов:

- **NAME**          Имя
- **DESCRIPTION**   Описание
- **STARS**         Звезды, которые отображат популярность образов
- **OFFICIAL**       Помечаються оффициальные образы

**Аргументы:**

- `-f` (`--filter`) Фильтрует результат. 
    - `-f stars=3` больше 3 звезд 
    - `-f is-offical=true` только оффициальные
- `--format` Преобразование вывода
    - `--format "{{.Name}}"` Имя образа
    - `--format {{.StarCount}}` Кол-во звезд
    - `--format {{.Description}}` Описание
    - `--format {{.IsOffical}}` официальный образ
- `--limit` Ограничивает список до определенного количества
    - `--limit 5` Выводит 5 образов
- `--no-trunc` Не сокращенный вариант описания

**Поиск с аргументами:**
```bash
docker search --limit 5 --format "{{.Name}}: {{.Description}}" --no-trunc wordpress 
```

???info "Пример результата"
    ```
    wordpress: The WordPress rich content management system can utilize plugins, widgets, and themes.
    bitnami/wordpress: Bitnami Secure Image for wordpress
    bitnamicharts/wordpress: Bitnami Helm chart for WordPress
    elestio/wordpress: Wordpress, verified and packaged by Elestio
    secoresearch/wordpress: Apache+PHP+Varnish+Wordpress
    ```

## Установка образа

Теперь попробуем установить образ **nginx**.

**Установка образа:**
```bash
docker pull nginx
```

???info "Пример вывода"
    ```
    Using default tag: latest
    latest: Pulling from library/nginx
    02d7611c4eae: Pull complete 
    dcea87ab9c4a: Pull complete 
    35df28ad1026: Pull complete 
    99ae2d6d05ef: Pull complete 
    a2b008488679: Pull complete 
    d03ca78f31fe: Pull complete 
    d6799cf0ce70: Pull complete 
    Digest: sha256:ca871a86d45a3ec6864dc45f014b11fe626145569ef0e74deaffc95a3b15b430
    Status: Downloaded newer image for nginx:latest
    docker.io/library/nginx:latest
    ```

Смотря от загрузки сети, через некоторое время, у нас получиться установить **nginx**.

!!!note "Обратите внимание"
    Оффициальный поставщик образов **Docker** имеет имя **library**.

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

**Установка определенной версии:**
```bash
docker pull nginx:1.29-trixie
```

Под версии в Docker подразумеваются **Tags**. Теги просматриваются на сайте [hub.docker.com](https://hub.docker.com). В нашем случае это [данный образ](https://hub.docker.com/_/nginx/tags/).

К сожалению, с помощью команды **docker** нельзя просмотреть список версий. Можно с помощью api или, как было написанно выше - на сайте.

| ![image](../../media/hub.docker.com-nginx-tags.png) |
| :--------: |
| Теги Nginx |

## Просмотр установленных образов

После устанвки, можно посмотреть какие образы у нас установлены:
```bash
docker images
```

???info "Пример вывода"
    ```
    REPOSITORY                                          TAG           IMAGE ID       CREATED         SIZE
    ...
    nginx                                               latest        058f4935d1cb   10 days ago     152MB
    ...
    ```

Мы получим пять колонок:

- **REPOSITORY** имя образа (репозитория). Обычно пишеться `имя поставщика/образ`
- **TAG** версия (тег) изображения
- **IMAGE ID**  ID изображения
- **CREATED** Когда данный образ обновлялся
- **SIZE** Размер образа


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

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

```bash
docker run nginx
```

Веб сервис nginx запуститься и отобразит логи.


???info "Пример логов"
    ```
    /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
    /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
    10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
    10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
    /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
    /docker-entrypoint.sh: Configuration complete; ready for start up
    2026/01/14 14:30:15 [notice] 1#1: using the "epoll" event method
    2026/01/14 14:30:15 [notice] 1#1: nginx/1.29.4
    2026/01/14 14:30:15 [notice] 1#1: built by gcc 14.2.0 (Debian 14.2.0-19) 
    2026/01/14 14:30:15 [notice] 1#1: OS: Linux 6.1.0-27-amd64
    2026/01/14 14:30:15 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
    2026/01/14 14:30:15 [notice] 1#1: start worker processes
    2026/01/14 14:30:15 [notice] 1#1: start worker process 30
    2026/01/14 14:30:15 [notice] 1#1: start worker process 31
    2026/01/14 14:30:15 [notice] 1#1: start worker process 32
    2026/01/14 14:30:15 [notice] 1#1: start worker process 33
    2026/01/14 14:30:15 [notice] 1#1: start worker process 34
    2026/01/14 14:30:15 [notice] 1#1: start worker process 35
    2026/01/14 14:30:15 [notice] 1#1: start worker process 36
    2026/01/14 14:30:15 [notice] 1#1: start worker process 37
    2026/01/14 14:30:15 [notice] 1#1: start worker process 38
    2026/01/14 14:30:15 [notice] 1#1: start worker process 39
    2026/01/14 14:30:15 [notice] 1#1: start worker process 40
    2026/01/14 14:30:15 [notice] 1#1: start worker process 41
    2026/01/14 14:30:15 [notice] 1#1: start worker process 42
    2026/01/14 14:30:15 [notice] 1#1: start worker process 43
    2026/01/14 14:30:15 [notice] 1#1: start worker process 44
    2026/01/14 14:30:15 [notice] 1#1: start worker process 45
    ```

Но зайти на стандартную страницу по порту 80, вероятнее вссего не получиться.

### Проброс портов

Попробуем пробросить HTTP порт 80. 

```bash
docker run -p 80:80 nginx
```

- `-p 80:80` - `[HOST]:[CONTAINER]` - проброс порта на машину хоста. 
    - Тем же самым можно пробросить на другие порты хоста `81:80`, `8080:80` и так далее. Это помогает избежать конфликтов, когда запущено несколько портов и они используют одни и те же порты.

Теперь, когда перейдем на адрес машины, то мы получим страницу по умолчанию:

- [http://localhost](http://localhost) - кто поднимает контейнеры на основной машине или пробрасывает порты.
- `http://[адрес хоста с активным контейнером]` - прямой доступ с удаленной машины.

???warning "Информация для тех, которые поднимают первый раз сайты"
    Браузер может запросить о подтверждения входа. Это из-за того, что используеться http протокол, а не https.

    Принимаем риски.

???info "Стартовая страница nginx"
    ![Docker nginx title web site](../../media/docker-run-nginx-title-web-site.png)

### Монтирование каталога

Однозначно, если мы говорим про nginx, нам нужен прямой доступ к `/usr/share/nginx/html`, да бы иметь доступ к исходному сайту.

```bash
docker run -p 80:80 -v /mnt/nginx:/usr/share/nginx/html:ro nginx
```

- `-v /mnt/nginx:/usr/share/nginx/html:ro` - `[HOST]:[CONTAINER]:[PERMISSION]` - подключение каталога контейнера к машине с правами только для четения.
    - `ro` - только для четения не для контейнера, а для самого контейнера.
        - Это полезно, когда нужно что бы процесс в контейнере случайно не изменил сруктуру сайта.
        - Если не нужно прописывать такие обраничения, то не устанавливаем данный параметр и простовводим `-v /mnt/nginx:/usr/share/nginx/html`
    - Каталог автоматически создасться, если отсутствует.

!!!warning "Смотрите оф документацию по настройке NGINX"
    Это пример использования команд docker.

    Читайте настройку.

### Фоновый запуск

Контейнер уже готов для постоянного использования. Попробуем запустить в демоне.

```bash
docker run -p 80:80 -v /mnt/nginx:/usr/share/nginx/html:ro -d nginx
```

- `-d` - Процесс будет запущен в фоне.

## Просмотр рабочих контейнеров

Да бы проверить, какие контейнеры работают на данный момент, прописываем данную команду:

```bash
docker ps
```

---
**📌 Документ в разработке.** Следующие разделы в работе:

- Управление контейнерами (`exec`, `logs`, `ps`, `stop`, `rm`)
- Работа с томами (Volumes)
- Сети Docker
