CSS v34 Docker и docker compose

Phenom

Джентльмен этиловый
Сообщения
187
Реакции
94
Доброго времени суток.
Эта мини статья написана для тех, кто хочет поднять свои серверы на CSS v34 в докере с применением docker compose для упрощения работы с несколькими контейнерами игровых серверов, а также для тех, кто хочет познакомиться с docker и docker compose. Данная статья подразумевает, что вы умеете работать в терминале с bash в linux, вы знаете как запускать игровые сервера из под linux, знаете что такое докер и для чего он применяется.
Написать данную статью меня сподвигнуло то, что я не нашел актуальной информации о том, как собирать свой docker образ для CSS v34, как из образа собрать контейнер, какие параметры нужны для запуска контейнера, никакой практики. Соглашусь, в сети интернет давно существуют панели для управления игровыми серверами (Pterodactyl, GameAP, EGP и тд), которые упрощают взаимодействие с игровыми серверами как новичкам, так и опытным обывателям, но, я любитель "поклацать" на кнопочки, попечатать в консоль команды с умным видом, другими словами - работать из под терминала linux. Итак, приступим.

Многие пользователи запускают игровые сервера из под sh файлов с применением screen либо tmux, чтобы можно было запускать, останавливать игровые сервера, свернуть и развернуть игровую консоль сервера. Кто-то запускает Docker контейнеры с кучей параметров запуска, которые порой даже не запомнить, с образами из интернета, которые бывают то работают то нет. Но что же такое docker compose?
  • Docker Composeэто инструмент для определения и управления многоконтейнерными приложениями в Docker. Он позволяет описывать конфигурацию всех сервисов, сетей и томов, необходимых для работы приложения, в одном файле (обычно docker-compose.yml), а затем легко запускать и управлять всем стеком с помощью одной команды. (Documentation)
Судя из определения, мы можем задавать все те же параметры для запуска контейнера (сети, тома, лимиты ресурсов), управлять не одним контейнером с игровым сервером, а сразу с 2, 3 а то и 10 контейнерами и всё это через 1 команду и 1 файл! Давайте представим, что нам нужно развернуть игровой сервер CSS v34, для него мы сделаем:
  • соберем образ debian 10 i386 через Dockerfile
  • подготовим чистый сервер
  • создадим и настроим файл docker-compose.yaml с параметрами запуска наших контейнеров для игрового сервера.
Теперь, сделаем представление, как у нас будет выглядеть иерархия директорий и необходимых файлов. Папка cssold - корневая папка, папка .docker - папка, которая будет содержать наш Dockerfile, папка server-1 - папка с игровым сервером.
Иерархия директорий:
.
└── cssold/ #Корневая директория
    ├── .docker/ #Директория с файлом Dockerfile
    │   └── Dockerfile
    ├── server-1/ #Директория с игровым сервером CSS v34
    │   └── srcds_run
    └── docker-compose.yaml #Файл docker compose для запуска контейнеров

Как установить Docker Compose на разные ОС - Overview of installing Docker Compose

1. Приступим к созданию Dockerfile.
Первым делом мы создадим в папке .docker файл Dockerfile и наполним его всем необходимым содержимым.

Dockerfile:
FROM i386/debian:10
#Команда создает файл конфигурации APT, который отключает проверку срока действия и даты для файлов репозиториев
RUN echo "Acquire::Check-Valid-Until \"false\";\nAcquire::Check-Date \"false\";" | cat > /etc/apt/apt.conf.d/10no--check-valid-until
RUN apt-get -qq update \
    #Установка всех необходимых пакетов для запуска srcds + screen
    && apt-get -y install --no-install-recommends gdb curl ca-certificates zlib1g libffi6 libstdc++6 gcc screen \
    #Установка русской локализации для корректного отображения никнеймов и тд
    && apt-get install -y locales \
    #Выполняем очистку кэша пакетов и освобождаем место на диске, удаляя ненужные файлы пакетов, которые уже были установлены или больше не нужны
    && apt-get -y clean \
    && echo "ru_RU.UTF-8 UTF-8" >> /etc/locale.gen && \
    locale-gen && \
    update-locale LANG=ru_RU.UTF-8 \
    && rm -rf /var/lib/apt/lists/*

ENV LANG=ru_RU.UTF-8 \
    LANGUAGE=ru_RU:ru \
    LC_ALL=ru_RU.UTF-8

#Устанавливаем рабочую директорию, где будет находиться игровой сервер в контейнере
WORKDIR /home/container
#Рекурсивно выдаем полные права на файлы и папки в папке container
RUN chmod -R 777 ../container

ВАЖНО! Сейчас мы не будем сделать сборку образа, за нас это сделает docker compose, об этом будет написано ниже!

2. После создания Dockerfile, мы заливаем чистый сервер в папку server-1.

3. Далее, мы создаем файл docker-compose.yaml в корневой папке cssold и наполняем этот файл всем нужным содержимым.
docker-compose.yaml:
services:
  server-1: #Название нашего контейнера (с ним мы будем очень часто взаимодействовать)
    build: #Указываем, что мы будем собирать образ
      context: .docker #Директория, где находится наш файл Dockerfile
      dockerfile: Dockerfile #Сам Dockerfile
    restart: unless-stopped #Указываем, что при любой остановке и любой ошибке контейнер нужно перезапустить, кроме того случая, когда контейнер остановлен вручную
    deploy:
      resources:
        limits: #Лимиты ресурсов для контейнера
          cpus: '1.0' #Контейнеру будет выделено не более 100% одного CPU
          memory: 2048M #Контейнеру будет выделено не более 2 Гб оперативной памяти
    ports: #Порты контейнера
      - "27015:27015" #TCP порт (ПОРТ ВНЕШНИЙ/ПОРТ В КОНТЕЙНЕРЕ)
      - "27015:27015/udp" #UDP порт (ПОРТ ВНЕШНИЙ/ПОРТ В КОНТЕЙНЕРЕ)
    volumes:
      - ./server-1:/home/container #Монтируем нашу папку с игровым сервером в контейнер для дальнейшего запуска игрового сервера из под контейнера
    command: > #Команда запуска игрового сервера с применением screen
      sh -c "screen -A -m -d -S srv ./srcds_run -game cstrike +map de_dust2 -ip 0.0.0.0 -port 27015 +tv_port 27016 -maxplayers 13 +sv_pure 2 -insecure -debug -condebug -localcser -nomaster -tickrate 100 -fps_max 500 -usercon; while true; do sleep 1; done"

Некоторые пояснения:
  • build - при запуске нашего файла, docker compose сам сделает билд нашего образа и добавит его для запуска нашего контейнера. РУКАМИ ОБРАЗ СОБИРАТЬ НЕ НУЖНО!
  • restart: unless-stopped - Если по какой-либо причине остановится контейнер, произойдет ошибка с контейнером, то контейнер сам перезагрузится и продолжит свою работу. Также, если вы вдруг перезагрузили свой VDS или Dedicate сервер, контейнеры сами поднимутся и продолжат работать, минуя каждый раз запускать контейнеры вручную. Если вы контейнеры остановили вручную, то они сами не включатся.
  • command - Запуск игрового сервера с параметрами через screen. Сделано это было для того, чтобы вы могли беспрепятственно подключиться к игровой консоли сервера и управлять ею. Можно установить также и tmux, но я сын скрина, извините :) Также хочу обратить внимание, что в конце команды написано while true; do sleep 1; done - это сделано для того, чтобы после запуска контейнера и выполнения команды запуска игрового сервера контейнер не завершал свою работу и мы могли безболезненно подключаться как к консоли сервера, так и к консоли bash нашего контейнера.

4.Теперь самая основная часть - запуск игрового сервера через docker compose.
Перед запуском, я ознакомлю вас с некоторыми основными командами docker compose, которые нам будут необходимы.
  • docker compose up -d - сборка и запуск всех контейнеров с игровыми серверами
  • docker compose down -v - остановка и удаление контейнеров, сетей и других ресурсов, созданных с помощью docker compose
  • docker compose start - запуск всех контейнеров
  • docker compose start server-1 - запуск контейнера с названием server-1
  • docker compose stop - остановка всех контейнеров
  • docker compose stop server-1 - остановка контейнера с названием server-1
  • docker compose restart - рестарт всех контейнеров
  • docker compose restart server-1 - рестарт контейнера с названием server-1
  • docker compose exec server-1 screen -x srv - подключение к игровой консоли для управления игровым сервером server-1 (чтобы свернуть консоль, нужно нажать комбинацию клавиш: Ctrl + A + D)
Теперь, когда мы знаем основные команды docker compose, приступим к сборке и запуску сервера.
После выполнения команды, убеждаемся, что наш сервис server-1 собран, сеть cssold_default в режиме bridge (по дефолту) создана, контейнер server-1 запущен.

2025-02-09 14-35-16.gif

Попробуем подключиться к консоли нашего игрового сервера.
2025-02-09 14-41-44.gif

А теперь попробуем выключить, включить и перезагрузить наш контейнер с сервером.

А что если мы хотим запустить несколько игровых серверов? Всё предельно просто!
  • Создаем еще одну папку, например server-2, server-3 и заливаем туда чистую сборку серверов
  • В файле docker-compose.yaml добавляем сервисы server-2, server-3 как показано в первом примере:
    [*]
    docker-compose.yaml:
    services:
      server-1: #Название нашего контейнера (с ним мы будем очень часто взаимодействовать)
        build: #Указываем, что мы будем собирать образ
          context: .docker #Директория, где находится наш файл Dockerfile
          dockerfile: Dockerfile #Сам Dockerfile
        restart: unless-stopped #Указываем, что при любой остановке и любой ошибке контейнер нужно перезапустить, кроме того случая, когда контейнер остановлен вручную
        deploy:
          resources:
            limits: #Лимиты ресурсов для контейнера
              cpus: '1.0' #Контейнеру будет выделено не более 100% одного CPU
              memory: 2048M #Контейнеру будет выделено не более 2 Гб оперативной памяти
        ports: #Порты контейнера
          - "27015:27015" #TCP порт (ПОРТ ВНЕШНИЙ/ПОРТ В КОНТЕЙНЕРЕ)
          - "27015:27015/udp" #UDP порт (ПОРТ ВНЕШНИЙ/ПОРТ В КОНТЕЙНЕРЕ)
        volumes:
          - ./server-1:/home/container #Монтируем нашу папку с игровым сервером в контейнер для дальнейшего запуска игрового сервера из под контейнера
        command: > #Команда запуска игрового сервера с применением screen
          sh -c "screen -A -m -d -S srv ./srcds_run -game cstrike +map de_dust2 -ip 0.0.0.0 -port 27015 +tv_port 27036 -maxplayers 13 +sv_pure 2 -insecure -debug -condebug -localcser -nomaster -tickrate 100 -fps_max 500 -usercon; while true; do sleep 1; done"
          
        server-2: #Название нашего контейнера (с ним мы будем очень часто взаимодействовать)
        build: #Указываем, что мы будем собирать образ
          context: .docker #Директория, где находится наш файл Dockerfile
          dockerfile: Dockerfile #Сам Dockerfile
        restart: unless-stopped #Указываем, что при любой остановке и любой ошибке контейнер нужно перезапустить, кроме того случая, когда контейнер остановлен вручную
        deploy:
          resources:
            limits: #Лимиты ресурсов для контейнера
              cpus: '1.0' #Контейнеру будет выделено не более 100% одного CPU
              memory: 2048M #Контейнеру будет выделено не более 2 Гб оперативной памяти
        ports: #Порты контейнера
          - "27016:27016" #TCP порт (ПОРТ ВНЕШНИЙ/ПОРТ В КОНТЕЙНЕРЕ)
          - "27016:27016/udp" #UDP порт (ПОРТ ВНЕШНИЙ/ПОРТ В КОНТЕЙНЕРЕ)
        volumes:
          - ./server-2:/home/container #Монтируем нашу папку с игровым сервером в контейнер для дальнейшего запуска игрового сервера из под контейнера
        command: > #Команда запуска игрового сервера с применением screen
          sh -c "screen -A -m -d -S srv ./srcds_run -game cstrike +map de_dust2 -ip 0.0.0.0 -port 27016 +tv_port 27026 -maxplayers 13 +sv_pure 2 -insecure -debug -condebug -localcser -nomaster -tickrate 100 -fps_max 500 -usercon; while true; do sleep 1; done"
    [*]
  • После чего пишем в терминал docker compose up -d и оба наших сервера соберутся и поднимутся.
  • Чтобы запустить | остановить | перезапустить все наши контейнеры с серверами, пишем в терминал docker compose start | stop | restart.

Дополнительная информация по поводу сборки образов через docker compose.
Если мы собираем и запускаем 2 и более контейнеров и игровых серверов, то к каждому контейнеру будет билдиться новый образ докера. Чтобы предотвратить билд образа при каждом запущенном контейнере, я залил на Docker Hub образ, который можно использовать и он аналогичен тому, что я написал выше в Dockerfile. Если мы не хотим каждый раз билдить образы, берем мой образ из Docker Hub: phenom1337/cssold_srcds_cssv34:ru - Docker Image

Тогда наш файл docker-compose.yaml будет выглядеть следующим образом:

docker-compose.yaml:
services:
  server-1:
    image: phenom1337/cssold_srcds_cssv34:ru
    restart: unless-stopped
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 2048M
    ports:
      - "27015:27015"
      - "27015:27015/udp"
    volumes:
      - ./server-1:/home/container
    command: >
      sh -c "screen -A -m -d -S srv ./srcds_run -game cstrike +map de_dust2 -ip 0.0.0.0 -port 27015 +tv_port 27036 -maxplayers 13 +sv_pure 2 -insecure -debug -condebug -localcser -nomaster -tickrate 100 -fps_max 500 -usercon; while true; do sleep 1; done"

  server-2:
    image: phenom1337/cssold_srcds_cssv34:ru
    restart: unless-stopped
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 2048M
    ports:
      - "27016:27016"
      - "27016:27016/udp"
    volumes:
      - ./server-2:/home/container
    command: >
      sh -c "screen -A -m -d -S srv ./srcds_run -game cstrike +map de_dust2 -ip 0.0.0.0 -port 27016 +tv_port 27026 -maxplayers 13 +sv_pure 2 -insecure -debug -condebug -localcser -nomaster -tickrate 100 -fps_max 500 -usercon; while true; do sleep 1; done"

На этом всё. Надеюсь, что эта статья кому-то помогла, кого-то познакомила с docker compose, кого-то познакомила с решением в общем и целом. Хочу также сказать, что я не навязываю делать именно так, как я описал выше, это лишь мой способ, которым я пользовался и пользуюсь сейчас на VDS и Dedicated серверах. Я буду рад видеть комментарии и предложения по, возможно, улучшению конфигурации docker compose сервисов и тд.
P.S. Данный метод можно использовать не только с CSS v34, но и с другими игровыми серверами. Вы также можете собирать образы сами, либо брать готовые из Docker Hub для любой игры и наслаждаться (или нет) таким методом управления игровыми серверами.

Спасибо, если прочитал до конца :)
 
Сверху Снизу