# Docker

## Работа с `image`, `container`, `volume` и `network`

Удаление всех `image`, `container`, `volume`, `network`:

```sh
docker system prune -a
```

## image

Список загруженных `image`:

```sh
docker images -a
```

или

```sh
docker image ls -a
```

Удаление выбранных `image`:

```sh
docker rmi image image
```

Удаление всех `image`:

```sh
docker rmi $(docker images -a -q)
```

Выгрузка `image` в файл:

```sh
docker save repository:tag | gzip > image.tar.gz
```

или

```sh
docker save -o image.tar repository:tag
```

или

```sh
docker save image > image.tar
```

где

- `repository:tag` - образ выгружаемого `image`

Например:

```sh
docker save nginx:alpine | gzip > nginx_alpine.tar.gz
```

Загрузка `image` из файла:

```sh
docker load < image.tar.gz
```

или

```sh
docker load --input image.tar
```

## container

Список контейнеров:

```sh
docker ps -a
```

или

```sh
docker container ls -a
```

Удаление выбранных контейнеров:

```sh
docker rm ID_or_Name ID_or_Name
```

Удаление всех контейнеров:

```sh
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
```

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

```sh
docker run --restart always --name mynginx -p 8080:80 -d nginx:alpine
```

где

- `run` - [запуск контейнера](https://docs.docker.com/engine/reference/commandline/container_run/)
- `--restart` - **всегда** (`always`) [стартовать автоматически](https://docs.docker.com/config/containers/start-containers-automatically/) контейнер после запуска `docker`
- `--name` - установить имя (`mynginx`) контейнера
- `-p` - [пробросить](https://docs.docker.com/config/containers/container-networking/) порт `80` из контейнера в хост порт `8080`
- `-d` - запустить контейнер в фоновом режиме (*detached mode*)
- `nginx:alpine` - имя образа `image`, на основе которого запускается контейнер

## volume

Список `volume`:

```sh
docker volume ls
```

Удаление выбранных `volume`:

```sh
docker volume rm volume_name volume_name
```

Удаление всех `volume`:

```sh
docker volume prune
```

### Монтирование `volume`

#### Использование `nfs`

При монтировании сетевого `volume` типа `nfs` необходимо убедиться, что права (`uid` и `gid`) расшариваемого каталога, установленные **на сервере**, совпадают с правами пользователя, от которого выполняется запуск контейнера, а также выставлены правильные права на расшариваемый каталог в файле `/etc/exports` **на сервере** `nfs`.

Т.е., необходимо, чтобы **на сервере**, где поднят `nfs-server` в файле `/etc/exports` были правильно указаны права (`uid` и `gid`) каталогу, который будет расшариваться и использоваться в качестве `volume`, и сам расшариваемый каталог обладал соответствующими правами (`uid` и `gid`).

**Например:**

Необходимо поднять контейнер `gitea` с использованием `nfs` тома. Т.к. `gitea` запускается с правами `1000:1000` - то и производит запись в `volume` от этих же прав.

К примеру, на `nfs` сервере необходимо использовать каталог `/volumes/gitea` в качестве расшариваемого ресурса для использования в качестве `volume` для `gitea`.

В файле `/etc/exports` внести запись:

```sh
/volumes/gitea <ip-address>(rw,sync,insecure,all_squash,anonuid=1000,anongid=1000,no_subtree_check,nohide,fsid=1)
```

где `<ip-address>` необходимо указать IP-адрес или подсеть

Установить права `1000:1000` на расшариваемый каталог:

```sh
chown 1000:1000 /volumes/gitea
```

**Для проверки** можно произвести монтирование каталога в `host` системе, где установлен `docker`. К примеру, каталог для монтирования указан в `/mnt/volumes/gitea`:

```sh
mount -t nfs <ip-address>:/volumes/gitea /mnt/volumes/gitea
```

Каталог в `host` системе будет смонтирован с правами `1000:1000`.

##### Создание `volume` вручную

Создание `volume` с использованием `nfs` тома:

```sh
docker volume create --driver local --opt type=nfs --opt o=addr=192.168.1.1,nfsvers=4,rw,async,rw --opt device=:/volumes/gitea gitea_data
```

##### Создание `volume` в `compose`

Для использования `nfs` тома в `docker-compose` необходимо указать в секции `volume` свой том и в сервисе указать используемый `volume`:

```sh
...

services:
 gitea:
    ...
    volumes:
      - type: volume
        source: gitea
        target: /data
      - /etc/timezone:/etc/timezone:ro
    ...

...

volumes:
  gitea:
    driver: local
    driver_opts:
      type: nfs
      o: addr=192.168.1.1,nfsvers=4,rw,async
      device: ":/volumes/gitea"

...
```
