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 на разные ОС - Overview of installing Docker Compose
1. Приступим к созданию Dockerfile.
2. После создания Dockerfile, мы заливаем чистый сервер в папку server-1.
3. Далее, мы создаем файл docker-compose.yaml в корневой папке cssold и наполняем этот файл всем нужным содержимым.
Некоторые пояснения:
4.Теперь самая основная часть - запуск игрового сервера через docker compose.
А что если мы хотим запустить несколько игровых серверов? Всё предельно просто!
Дополнительная информация по поводу сборки образов через docker compose.
На этом всё. Надеюсь, что эта статья кому-то помогла, кого-то познакомила с docker compose, кого-то познакомила с решением в общем и целом. Хочу также сказать, что я не навязываю делать именно так, как я описал выше, это лишь мой способ, которым я пользовался и пользуюсь сейчас на VDS и Dedicated серверах. Я буду рад видеть комментарии и предложения по, возможно, улучшению конфигурации docker compose сервисов и тд.
P.S. Данный метод можно использовать не только с CSS v34, но и с другими игровыми серверами. Вы также можете собирать образы сами, либо брать готовые из Docker Hub для любой игры и наслаждаться (или нет) таким методом управления игровыми серверами.
Спасибо, если прочитал до конца :)
Эта мини статья написана для тех, кто хочет поднять свои серверы на 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)
- соберем образ debian 10 i386 через Dockerfile
- подготовим чистый сервер
- создадим и настроим файл docker-compose.yaml с параметрами запуска наших контейнеров для игрового сервера.
Иерархия директорий:
.
└── 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 и наполним его всем необходимым содержимым.
ВАЖНО! Сейчас мы не будем сделать сборку образа, за нас это сделает docker compose, об этом будет написано ниже!
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 composedocker compose start
- запуск всех контейнеровdocker compose start server-1
- запуск контейнера с названием server-1docker compose stop
- остановка всех контейнеровdocker compose stop server-1
- остановка контейнера с названием server-1docker compose restart
- рестарт всех контейнеровdocker compose restart server-1
- рестарт контейнера с названием server-1docker compose exec server-1 screen -x srv
- подключение к игровой консоли для управления игровым сервером server-1 (чтобы свернуть консоль, нужно нажать комбинацию клавиш: Ctrl + A + D)
После выполнения команды, убеждаемся, что наш сервис server-1 собран, сеть cssold_default в режиме bridge (по дефолту) создана, контейнер server-1 запущен.
Попробуем подключиться к консоли нашего игрового сервера.
А теперь попробуем выключить, включить и перезагрузить наш контейнер с сервером.
А что если мы хотим запустить несколько игровых серверов? Всё предельно просто!
- Создаем еще одну папку, например 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 будет выглядеть следующим образом:
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 для любой игры и наслаждаться (или нет) таким методом управления игровыми серверами.
Спасибо, если прочитал до конца :)