Контейнеризация
Контейнеризация¶
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
- удаление изображение Dockerdocker 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