Skip to content

Контейнеризация

Контейнеризация

Docker

Docker - платформа с открытым исходным кодом для контейнеризации приложений, что обеспечивает хороший уровень безопасности и масштабируемости

Скрипт установки Docker`а:

#!/bin/bash

# Preparation
sudo apt update -y
sudo apt install ca-certificates curl gnupg lsb-release -y
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Install Docker Engine
sudo apt update -y
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

# Add user htb-student to the Docker group
sudo usermod -aG docker htb-student
echo '[!] You need to log out and log back in for the group changes to take effect.'

# Test Docker installation
docker run hello-world

Создание образа Docker выполняется путём создания Docker-файла, который будет содержать все основные опции для развёртывания контейнера

Пример Docker-файла:

# Use the latest Ubuntu 22.04 LTS as the base image
FROM ubuntu:22.04

# Update the package repository and install the required packages
RUN apt-get update && \
    apt-get install -y \
        apache2 \
        openssh-server \
        && \
    rm -rf /var/lib/apt/lists/*

# Create a new user called "student"
RUN useradd -m docker-user && \
    echo "docker-user:password" | chpasswd

# Give the htb-student user full access to the Apache and SSH services
RUN chown -R docker-user:docker-user /var/www/html && \
    chown -R docker-user:docker-user /var/run/apache2 && \
    chown -R docker-user:docker-user /var/log/apache2 && \
    chown -R docker-user:docker-user /var/lock/apache2 && \
    usermod -aG sudo docker-user && \
    echo "docker-user ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

# Expose the required ports
EXPOSE 22 80

# Start the SSH and Apache services
CMD service ssh start && /usr/sbin/apache2ctl -D FOREGROUND

Теперь нужно преобразовать Docker-файл в изображение (странный термин). Для этого нужно выполнить команду сборки: docker build -t FS_docker ., где флаг -t означает, что у нашего контейнера будет тег, с помощью которого с ним будет проще взаимодействовать

Теперь можно запустить контейнер с помощью следующей команды:

#структура команды
docker run -p <host port>:<docker port> -d <docker container name>

#пример запуска
docker run -p 8022:22 -p 8080:80 -d FS_docker

В этом примере мы запускаем контейнер из изображения FS_docker и сопоставляем порты хоста 8022 и 8080 с портами контейнера 22 и 80. Контейнер работает в фоновом режиме, так что мы можем получить доступ к службам SSH и HTTP внутри контейнера, используя указанные порты хоста

Основные команды управления Docker:

  • docker ps - список всех запущенных контейнеров
  • docker stop - остановка запущенного контейнера
  • docker start - запуск остановленного контейнера
  • docker restart - перезапуск работающего контейнера
  • docker rm - извлечение контейнера
  • docker rmi - удаление изображение Docker
  • docker logs - просмотр журнала контейнеров

Важно отметить, что любые изменения, внесённые в существующий образ, не являются постоянными. Вместо этого нужно создать новое изображение, которое наследуется от оригинала и включает в себя желанные изменения. Это делается путём создания нового Docker-файла, который начинается с инструкции FROM, которая определит базовый образ, а затем добавит необходимые команды для внесения желаемых изменений

Контейнеры Linux (LXC)

sudo apt-get install lxc lxc-utils - команда установки LXC

sudo lxc-create -n linuxcontainer -t ubuntu - команда создания контейнера с именем linuxcontainer и шаблоном Ubuntu

Основные команды управления LXC:

  • lxc-ls - список всех существующих контейнеров
  • lxc-stop -n <container> - остановка запущенного контейнера
  • lxc-start -n <container> - запуск остановленного контейнера
  • lxc-restart -n <container> - перезапуск работающего контейнера
  • lxc-config -n <container name> -s storage - управление контейнерным хранилищем
  • lxc-config -n <container name> -s network - управление настройками контейнерной сети
  • lxc-config -n <container name> -s security - управление настройками безопасности контейнера
  • lxc-attach -n <container> - подключение к контейнеру
  • lxc-attach -n <container> -f /path/to/share - подключение к контейнеру и предоставление общего доступа к определённому каталогу/файлу

Можно ограничивать потребление системных ресурсов контейнерами Linux. Для этого нужно настроить cgroups для контейнера в определённом файле конфигурации. Для вышеописанного примера создания контейнера это делается так:

sudo vim /usr/share/lsc/config/linuxcontainer.conf - открытие файла конфигурации контейнера linuxcontainer. Теперь допишем в этот файл следующее:

lxc.cgroup.cpu.shares = 512             #максимальный объём потребляемого процессорного времени
lxc.cgroup.memory.limit_in_bytes = 512M #максимальный объём потребляемой памяти для контейнера (в мегабайтах)

Для применения изменений нужно перезапустить службу: sudo systemctl restart lxc.service