Skip to content

Commit

Permalink
Add swarm MD
Browse files Browse the repository at this point in the history
  • Loading branch information
laspavel committed Nov 12, 2024
1 parent fee6bb3 commit d6a7b18
Show file tree
Hide file tree
Showing 2 changed files with 316 additions and 0 deletions.
17 changes: 17 additions & 0 deletions 03.linux/10005.docker.md
Original file line number Diff line number Diff line change
Expand Up @@ -149,3 +149,20 @@ services:
restart: unless-stopped
```
### Dockerfile Commands ###
* FROM [image name]: specifies the base image to build on.
* MAINTAINER [name]: instruction allows you to set the Author field of the generated images.
* LABEL [key=value]: instruction adds metadata to an image
* RUN [command]: runs a command during build time.
* CMD [command]: specifies the default command to run when a container is started.
* COPY [source] [destination]: copies files or directories from the build context into the container.
* ADD [source] [destination]: Copies new files, directories, or remote file URLs from [source] and adds them to the filesystem of the image at the path [destination].
* EXPOSE [port]: exposes a port for networking.
* WORKDIR [path]: sets the working directory for subsequent commands.
* ENTRYPOINT [command] [param1] [param2]: Allows you to configure a container that will run as an executable.
* ARG <name>[=<default value>]: Defines a variable that users can pass at build-time to the builder with the docker build command using the --build-arg <varname>=<value> flag.
* ENV [key] [value]: sets an environment variable.
* VOLUME [path]: Creates a mount point with the specified name and marks it as holding externally mounted volumes from native host or other containers.
* USER <username | UID>: sets the user name or UID to use when running the image and for any RUN, CMD and ENTRYPOINT instructions that follow it in the Dockerfile.
* HEALTHCHECK [--interval=<duration | 30s>] [--timeout=<duration> | 30s] [--retries=<number> | 3] CMD <command> - check container health by running a command inside the container (0 - healthy, 1 - healthy; 2 - reserved)

299 changes: 299 additions & 0 deletions 03.linux/10030.docker_swarm.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,299 @@

# Docker Swarm справочник #

## Терминология: ##
- Service - описание того, какие контейнеры будут создаваться. Кроме стандартных полей docker в режиме swarm поддерживает ряд дополнительных, большинство из которых находятся внутри секции deploy. Один service запускает определенное количество tasks.

- Stack - это набор сервисов, которые логически связаны между собой. По сути это набор сервисов, которые мы описываем в обычном compose файле. Части stack (services) могут располагаться как на одной ноде, так и на разных.

- Task — это атомарная запланированная единица Docker Swarm, которая содержит информацию о контейнере и команду, которая должна запущена внутри контейнера.

- Реплика – каждый контейнер, который запускается на ноде. Количество реплик — это ожидаемое число всех контейнеров для данной service

### Режимы деплоя сервисов: ###

- replicated service - указанное количество реплицируемых контейнеров распределяются между узлами на основе стратегии планированния
- global service - один контейнер запускается на каждом доступном узле в кластере

### Порты ###
Для manager нод:
```
firewall-cmd --add-port=2376/tcp --permanent;
firewall-cmd --add-port=2377/tcp --permanent;
firewall-cmd --add-port=7946/tcp --permanent;
firewall-cmd --add-port=7946/udp --permanent;
firewall-cmd --add-port=4789/udp --permanent;
firewall-cmd --reload;
```

Для worker нод:
```
firewall-cmd --add-port=2376/tcp --permanent;
firewall-cmd --add-port=7946/tcp --permanent;
firewall-cmd --add-port=7946/udp --permanent;
firewall-cmd --add-port=4789/udp --permanent;
firewall-cmd --reload;
```

## Инициализация и управление Swarm-кластером ##

- Инициализация Docker Swarm, превращая текущий узел в менеджер кластера.
```
docker swarm init --advertise-addr <manager_ip>
# <manager_ip> - IP-адрес менеджера (указание необходимо в случае с несколькими интерфейсами)
```

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

```
docker swarm join-token worker # Токен для рабочих узлов
docker swarm join-token manager # Токен для менеджеров
```

- Присоединение узла к существующему кластеру.

```
docker swarm join --token <join_token> <manager_ip>:2377
# <join_token> - токен для добавления в кластер
# <manager_ip>:2377 - IP-адрес и порт менеджера
```

- Отключение узла от кластера.
```
docker swarm leave --force
```

## Управление нодами ##
- Выводит список узлов в Swarm-кластере.

```
docker node ls
```

- Выводит список тасок на ноде в Swarm-кластере.
```
docker node ps
```


- Посмотреть параметры ноды:
```
docker node inspect <node_id> --pretty
# <node_id> - идентификатор узла
```

- Обновление настроек узла (например, понижение или повышение до менеджера или временное выключение-включение (drain-active)).
```
docker node update --role manager <node_id>
docker node update --availability drain
docker node update <node_id> --availability active
docker node update --label-add foo --label-add bar=baz <node_id>
# foo,bar=baz - добавляемые ярлыки на ноду
```

- Повысить до менеджера (promote) или понизить до воркера (demote) ноду
```
docker node promote <node_id>
docker node demote <node_id>
```

- Удаление узла из кластера.
```
docker node rm <node_id>
```

## Работа со стеками ##

- Развертывание стека из docker-compose.yml в Swarm-кластере.
```
docker stack deploy --with-registry-auth -c <compose_file> <stack_name>
# --with-registry-auth - позволяет передать авторизационные данные на worker ноды, для того чтобы использовался один и тот же образ из регистра (Опционально)
# <compose_file> - путь к файлу docker-compose.yml
# <stack_name> - имя стека
```

- список всех стеков в кластере
```
docker stack ls
```

- Список тасок стека
```
docker stack ps stack_name
```

- Удаление стека и его сервисов.
```
docker stack rm <stack_name>
```

- Список всех сервисов, работающих в стеке.
```
docker stack services <stack_name>
```

## Управление сервисами ##

- Создание нового сервиса.
```
docker service create --name <service_name> <image>
# <service_name> - имя сервиса
# <image> - образ для запуска
```

- Вывод списка всех сервисов.
```
docker service ls
```

- Обновление сервиса (например, изменение числа реплик).
```
docker service update --replicas <number> <service_name>
# <number> - число реплик
# <service_name> - имя сервиса
docker service update --image user/container:1.2 userserv
docker service update --force --update-parallelism 1 --update-delay 30s nginx
docker service update --update-parallelism 5--update-delay 2s --image user/container:1.2 userserv
docker service update --limit-cpu 2 nginx
docker service update --replicas=5 nginx
```

- Просмотр журнала для конкретного сервиса:
```
docker service logs <service_name>
```

- Удаление сервиса.
```
docker service rm <service_name>
# <service_name> - имя сервиса
```

- Масштабирование сервиса до указанного числа реплик.
```
docker service scale <service_name>=<replicas>
# <replicas> - количество реплик
```

## Работа с секретами ###

Swarm предоставляет хранилище для приватных данных (secrets), которые необходимы контейнерам. Как правило эта функциональность используется для хранения логинов, паролей, ключей шифрования и токенов доступа от внешних систем, БД и т.д.

- Создание секрета:
```
docker secret create main_config <example.yaml>
#
# example.yaml
# token: sfsjksajflsf_secret
#
```

- Посмотреть список секретов:
```
docker secret ls
```

## Работа с сетью ##

- Создание сети в режиме overlay (для использования в Swarm).
```
docker network create --driver overlay <network_name>
# <network_name> - имя сети
```

- Список сетей, доступных в кластере.
```
docker network ls
```

- Удаление сети.
```
docker network rm <network_name>
# <network_name> - имя сети
```

## Работа с томами ##

- Создание нового тома.
```
docker volume create <volume_name>
# <volume_name> - имя тома
```

- Вывод списка томов.
```
docker volume ls
```

- Удаление тома
```
docker volume rm <volume_name>
# <volume_name> - имя тома
```

## stack-шаблон ##
```
version: "3"
services:
some-db:
image: my-db:latest
volumes:
- db-data:/data
networks:
my-net:
aliases:
- db
deploy:
placement:
constraints: [node.role == manager]
some-app:
image: some-app:latest
networks:
- my-net
depends_on:
- some-db
deploy:
mode: replicated
replicas: 2
labels: [APP=SOME-APP]
resources:
limits:
cpus: '0.25'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
update_config:
parallelism: 1
delay: 10s
failure_action: continue
monitor: 60s
max_failure_ratio: 0.3
placement:
constraints: [node.role == worker]
networks:
my-app:
volumes:
db-data:
```

---
* [https://docs.docker.com/engine/swarm/](https://docs.docker.com/engine/swarm/)

0 comments on commit d6a7b18

Please sign in to comment.