Docker start

Материал из ALT Linux Wiki
Примечание: Обратите внимание, что это не официальная документация, а попытка начинающего админа объяснить материал начинающим админам.
Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

Docker для начинающих

Установка

1. Установка Docker

# apt-get install docker-engine

2. Добавление пользователя в группу

# usermod petr -aG docker

3.Перезаходим в систему

4.Запускаем службу

# systemctl enable --now docker

Настройка для работы от пользователя

Для запуска docker демона от пользователя можно использовать пакет docker-engine-rootless. Установить его можно следующей командой:

# apt-get install docker-engine-rootless

Далее нужно настроить запуск демона от пользователя:

$ dockerd-rootless-setuptool.sh install

И экcпортировать переменную DOCKER_HOST:

export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock

Последнюю строку можно добавить, в файл из которого шелл инициализирует переменные, например, в ~/.bash_profile, если используется bash.

Создание контейнера

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

Как создать контейнер

Приведем на конкретном примере, например ан современной системе не запускается старая игра.

1. Создаем каталог

В нем у нас следующие файлы:

каталог
├── Dockerfile - описание будущего контейнера
├── entrypoint.sh - основная команда контейнера
└── cstalin-0.9.5-linux.tar.gz - архив с игрой

Dockerfile

Dockerfile - основной конфигурационный файл. Выглядит приблизительно так:

FROM i386/ubuntu:14.04

# --- Build args ---
ARG HOST_UID=1000
ARG HOST_GID=1000

# --- Установка зависимостей ---
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        libx11-6 libxext6 libxrender1 libxtst6 libgl1-mesa-glx libgl1-mesa-dri libglu1-mesa \
        binutils file strace libsdl1.2debian libpng12-0 libfreetype6 \
        libasound2 liblua5.1 pulseaudio libpulse0 x11-utils \
        pulseaudio-utils alsa-utils && \
    apt-get clean && rm -rf /var/lib/apt/lists/*


# --- Создаём пользователя с UID хоста ---
RUN groupadd -g $HOST_GID stalin && \
    useradd -m -u $HOST_UID -g $HOST_GID -s /bin/bash stalin && \
    usermod -a -G audio stalin


# --- Каталог игры ---
RUN mkdir -p /opt/cstalin
WORKDIR /opt/cstalin


# --- Копируем архив игры ---
COPY cstalin-0.9.5-linux.tar.gz .
RUN tar -xzf cstalin-0.9.5-linux.tar.gz && \
    rm cstalin-0.9.5-linux.tar.gz && \
    chmod +x /opt/cstalin/cstalin-0.9.5-linux/cstalin && \
    chown -R stalin:stalin /opt/cstalin

# --- Создаём дефолтный каталог сохранений и конфигов ---
RUN mkdir -p /home/stalin/.boswars && chown -R stalin:stalin /home/stalin


# --- Настройка PulseAudio ---
# Копируем клиентский конфиг PulseAudio
COPY pulse-client.conf /etc/pulse/client.conf


# Создаём директорию для конфига пользователя
RUN mkdir -p /home/stalin/.config/pulse && \
    chown stalin:stalin /home/stalin/.config/pulse

# Копируем entrypoint ---
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh


# --- Переход под пользователя stalin ---
USER stalin
WORKDIR /opt/cstalin/cstalin-0.9.5-linux

# --- Настройка X11 и software GL ---
ENV DISPLAY=:0
ENV TERM=xterm
ENV LIBGL_ALWAYS_SOFTWARE=1

# Передаём UID для PulseAudio
ENV PULSE_SERVER=unix:/run/user/$HOST_UID/pulse/native
ENV XDG_RUNTIME_DIR=/home/stalin/runtime


ENTRYPOINT ["/entrypoint.sh"]

# Единый CMD — запуск игры
CMD ["./cstalin", "-d", "/opt/cstalin/cstalin-0.9.5-linux", "-v3"]
  • В нем мы описываем все, что мы хотим сделать в нашем образе.
  • В начале мы указываем строку вида FROM i386/ubuntu:14.04 - архитектуру и дистрибутив-основу
  • командами мы формируем набор образа
Заголовок
Инструкция Время выполнения Назначение
ARG Сборка Передача аргументов сборки
FROM Сборка Какой основной образ берем с DockerHub
RUN Сборка Изменение файловой системы (установка ПО, скрипты)
ENV Сборка + запуск Переменные окружения (доступны везде)
WORKDIR Сборка + запуск Рабочая директория (влияет на сборку и выполнение)
COPY Сборка Копирование файлов в образ
USER Сборка + запуск Пользователь для команд сборки и запуска контейнера
ADD Сборка Копирование с доп. функциями (URL, распаковка)
CMD Запуск Команда по умолчанию (может быть переопределена)
ENTRYPOINT Запуск Основная команда контейнера (не переопределяется)

Пример entrypoint.sh

#!/bin/sh
set -e

# --- Разбор параметра --saves=/path ---
SAVES_PATH=""
NEW_ARGS=""
for arg in "$@"; do
    case $arg in
        --saves=*)
            SAVES_PATH="${arg#*=}"
            ;;
        *)
            NEW_ARGS="$NEW_ARGS \"$arg\""
            ;;
    esac
done
eval "set -- $NEW_ARGS"

# --- Настройка каталога сохранений ---
INTERNAL_DIR="/home/stalin/.boswars"
if [ -n "$SAVES_PATH" ]; then
    mkdir -p "$SAVES_PATH"
    rm -rf "$INTERNAL_DIR"
    mkdir -p "$INTERNAL_DIR"
    mount --bind "$SAVES_PATH" "$INTERNAL_DIR" || true
fi

mkdir -p /home/stalin/.config/pulse/

# --- Автосоздание preferences.lua ---
if [ ! -f "$INTERNAL_DIR/preferences.lua" ]; then
    echo "Creating default preferences.lua"
    cat > "$INTERNAL_DIR/preferences.lua" <<'EOF'
preferences = {
    VideoWidth = 800,
    VideoHeight = 600,
    VideoFullScreen = false,
    PlayerName = "Player",
    FogOfWar = true,
    ShowCommandKey = true,
    GroupKeys = "0123456789`",
    GameSpeed = 30,
    EffectsEnabled = true,
    EffectsVolume = 128,
    MusicEnabled = true,
    MusicVolume = 128,
    StratagusTranslation = "",
    GameTranslation = "",
    TipNumber = 0,
    ShowTips = true,
    GrabMouse = false,
    UseOpenGL = false,
  }
EOF
fi

# --- Экспорт PulseAudio сокета ---
export PULSE_SERVER=${PULSE_SERVER:-unix:/run/user/1000/pulse/native}
export SDL_AUDIODRIVER=alsa

# --- Запуск игры ---
exec "$@"

Собираем контейнер

Теперь приступаем к сборке контейнера. В консоли переходим в наш каталог с файлами и выполняем:

$ docker build -t commander-stalin-docker .

где commander-stalin-docker - имя нашего будущего контейнера.

На основе наших файлов Docker качает образ, устанавливает пакеты и настраивает систему и файлы.

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

Если у вас простая консоль, вы можете запустить программу так:

$ docker run commander-stalin-docker

Но, если у вас графика, нужно запускать так. Нам нужно указать иксы и положение программы:

$ docker run -it --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix:ro commander-stalin-docker /opt/cstalin/cstalin-0.9.5-linux/cstalin -d /opt/cstalin/cstalin-0.9.5-linux/

Команды Docker

  • docker run -d name - запустить контейнер
  • docker stop -d name - остановить контейнер
  • docker rm -d name - удалить контейнер
  • docker rm $(docker ps -a -q) - удалить все контейнеры
  • docker stop $(docker ps -a -q) - остановить все контейнеры
  • docker ps -a -q - отобразить все запущенные контейнеры
  • docker images - отобразить все созданные образы
  • docker run -it --rm -e DISPLAY=DISPLAY0 -v /tmp/.X11-unix:/tmp/.X11-unix commander-stalin-docker /opt/cstalin-0.9.5-linux/cstalin -d /opt/cstalin-0.9.5-linux/ - пример запуска

Пример сложного запуска

Если команда слишком сложная и не умещается в одну строку, можно сделать sh-файл:

docker run -it --rm \
  -e DISPLAY=$DISPLAY \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  --privileged   \
  commander-stalin-docker /opt/cstalin/cstalin-0.9.5-linux/cstalin -d /opt/cstalin/cstalin-0.9.5-linux/