Docker start
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/