Docker часть 2: Docker и Portainer
Устанавливаем и настраиваем Docker и Portainer на Debian.

В первый части мы установили чистый Debian на виртуальную машину Proxmox. Сейчас добавим Docker и Portainer для управления контейнерами.
Настройка репозитория
Будет использовать метод установки из репозитория. Данный способ является самым оптимальным. И рекомендован разработчиками Docker.
Обновляем все текущие пакеты и добавляем возможность использовать apt через HTTPS:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
Добавляем официальный GPG-ключ
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
Настраиваем доступ до репозитория
echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Установка Docker
Устанавливаем все необходимые пакеты для работы с docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Чтобы не было ошибки permission denied unix:///var/run/docker.sock необходимо добавить текущего пользователя в группу и назначить права на docker.sock:
sudo usermod -aG docker ${USER}
sudo chmod 666 /var/run/docker.sock
Установка Portainer
Чтобы установить Portainer, мы создадим скрипт docker-compose, который затем запустим, чтобы все настроить. В дальнейшем все дополнительные контейнеры будем хранить в этом файле.
mkdir home-assistant
cd ./home-assistant
sudo nano docker-compose.yaml
# Сохранить и закрыть с помощью Ctrl+O и Ctrl+X
Хранить всю конфигурацию будем в папке home-assistant. Это упрощает резервное копирование всего. Эти тома будут хранить данные из образа Docker локально, поэтому данные не будут потеряны при пересборке контейнера (например, при обновлении).
version: '3.0'
services:
portainer:
container_name: portainer
image: portainer/portainer-ce:latest
restart: unless-stopped
ports:
- "9000:9000/tcp"
- "9443:9443/tcp"
environment:
- TZ=Europe/Moscow
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock
- ./portainer/data:/data
Мы также разрешим нашему пользователю без прав администратора изменять этот файл. Опять же, просто чтобы сделать нашу жизнь немного проще.
sudo chown root:docker docker-compose.yaml
sudo chmod g+w docker-compose.yaml
Запуск
Теперь выполняем команду docker compose up -d, и Docker загрузит последний образ и все настроит.
При первом посещении Portainer нас попросят создать учетную запись пользователя. На это будет 10 минут. Если не успеть, то придется перезагружать docker контейнер. Это сделано для безопасности. Так как не всегда Portainer запускается локально.
Когда настройка пройдет у нас появится доступ к web интерфейсу:
https://<ip>:9443 # ошибка сертификата
http://<ip>:9000 # не защищенное соединение


Не обращайте внимание на ошибки. Они появляются так как ssl сертификат является самоподписанным. В этом нет ничего плохого.
Итоговая структура проекта
Папка portainer заполнилась автоматически, после запуска Docker контейнера. В ней хранятся данные, которые в случае перезапуска загрузятся и не придется устанавливаться все с нуля.
home-assistant
├── docker-compose.yaml
└── portainer
└── data
Docker часть 1: Установка Debian
Устанавливаем и настраиваем Debian для дальнейшей работы.
Docker часть 3: Home Assistant Container
Устанавливаем Home Assistant в Docker container на Debian.
Обсуждение
добрый день, добавляю в конце чтобы использовал мои параметры сети в докере, но тогда сбиваются порты, может подскажете как исправить?
– ./homeassistant/:/config
– /etc/localtime:/etc/localtime:ro
network_mode: LAN
version: '3.0'
services:
homeassistant:
container_name: homeassistant
image: ghcr.io/home-assistant/home-assistant:stable
restart: unless-stopped
privileged: true
network_mode: host
environment:
- TZ=Europe/Moscow
volumes:
- ./homeassistant/:/config
- /etc/localtime:/etc/localtime:ro
- /run/dbus:/run/dbus:ro
depends_on:
- mariadb
mariadb:
container_name: mariadb
image: mariadb:latest
restart: unless-stopped
environment:
- TZ=Europe/Moscow
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_HA_DATABASE}
- MYSQL_USER=${MYSQL_HA_USER}
- MYSQL_PASSWORD=${MYSQL_HA_PASSWORD}
ports:
- 3306:3306
volumes:
- ./mariadb:/var/lib/mysql
phpmyadmin:
container_name: phpmyadmin
image: phpmyadmin:latest
restart: unless-stopped
environment:
- PMA_HOST=mariadb
#- PMA_USER=root
#- PMA_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
volumes:
- ./phpmyadmin/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php
ports:
- 8090:80
depends_on:
- mariadb
mosquitto:
container_name: mosquitto
image: eclipse-mosquitto:latest
restart: unless-stopped
stdin_open: true
tty: true
environment:
- TZ=Europe/Moscow
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
- ./mosquitto/log:/mosquitto/log
ports:
- 1883:1883/tcp
zigbee2mqtt:
container_name: zigbee2mqtt
image: koenkk/zigbee2mqtt:latest
restart: unless-stopped
devices:
- ${ZIGBEE_ADAPTER_TTY}:/dev/ttyACM0
environment:
- TZ=Europe/Moscow
volumes:
- ./zigbee2mqtt:/app/data
- /run/udev:/run/udev:ro
ports:
- 8020:8020
depends_on:
- mosquitto
esphome:
container_name: esphome
image: esphome/esphome:latest
restart: unless-stopped
privileged: true
network_mode: host
environment:
- TZ=Europe/Moscow
- ESPHOME_DASHBOARD_USE_PING=true
volumes:
- ./esphome/config:/config
- /etc/localtime:/etc/localtime:ro
nodered:
container_name: nodered
image: nodered/node-red:latest
restart: unless-stopped
environment:
- TZ=Europe/Moscow
volumes:
- ./nodered:/data
ports:
- 1880:1880/tcp
depends_on:
- homeassistant
- mosquitto
code-server:
image: lscr.io/linuxserver/code-server:latest
container_name: code-server
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Moscow
volumes:
- ./:/config/workspace
ports:
- 8443:8443
Хорошие статьи. А где у Вас можно взять полный docker-compose.yml файл?