Баарына салам. Долбооруңузду жазуу боюнча макалалар сериясын улантабыз.
Бутактарды иреттеңиз
Маанилүү нерсе, бутактарда жана алардын репозиторийдеги тартибинде адашып калбоо үчүн, мен STEP_{number} префиксин кошуу менен алардын атын өзгөртүүнү чечтим . Мисалы, бизде негизгиден тышкары үч бутак бар:- JRTB-0
- JRTB-2
- JRTB-3
- STEP_1_JRTB-0 - биринчи кадам
- STEP_2_JRTB-2 - экинчи кадам
- STEP_3_JRTB-3 - үчүнчү кадам
Докер жөнүндө бир аз
Docker деген эмне? Кыскача айтканда, бул сиз тиркемелерди тез жана коопсуз жайгаштыра аласыз (орнизациялай аласыз), алар үчүн жабык инфраструктураны түзүп, алар үчүн гана зарыл. Бул дагы эле кыйын, мен түшүнөм. Жалпысынан алганда, Docker сиз тез жана натыйжалуу иштей турган өнүгүү платформасы катары түшүнсө болот. Докерди serverде иштеген программа катары түшүнсө болот. Бул программа колдонмолор менен контейнерлерди сактоо мүмкүнчүлүгүнө ээ. Контейнер деген эмне? Бул өзүнчө инфраструктура, ага сиз керектүү нерселердин баарын кошо аласыз. Мисалы, Java тиркемеси үчүн бизге тиркемени иштетүү үчүн JRE керек, контейнерде бул болот, бизге башка программа керек болот - биз муну кошо алабыз. Же бизге Linux жана Tomcat сервлет контейнери керек болушу мүмкүн. Муну да жасоого болот. Контейнерлер сүрөттүн негизинде түзүлөт: башкача айтканда, бул Docker контейнерин түзүү үчүн зарыл болгон нерселердин бардыгын камтыган белгилүү бир шаблон. Бул сүрөттү кантип түзүү керек? Биздин учурда, долбоордун түбүндө контейнерде эмне болушу керектигин сүрөттөгөн Dockerfile түзүшүбүз керек болот. Биз боттун белгисин эч жерде ачыкка чыгаргыбыз келбегендиктен, тиркемени жайылтууну каалаган сайын аны өткөрүп берүүгө туура келет. Бул тема тууралуу кененирээк бул жерден жана бул жерден окуй аласыз .Биз JRTB-13 деп жазабыз
Колдонмобуз үчүн serverге тез жана оңой жайгаштыруу процессин орнотушубуз керек. Башкача айтканда, 24/7 иштеген машина үчүн. Докерди негиз кылып алалы. Бирок биздин тизмеде бул функцияны кошууга жооп бере турган эч кандай тапшырма жок. Аны жаратканда негедир сагындым. Эч кандай көйгөй жок, биз аны азыр түзөбүз. Биз GitHub'да маселени түзүү өтмөгүнө барабыз жана Функция суроосун тандайбыз: Тапшырманын сүрөттөмөсүн, аны кабыл алуу критерийлерин кошуңуз, бул маселе кайсы долбоорго таандык экенин белгилеңиз жана сиз жаңы чыгарылышты түзө аласыз: Эми тапшырма аткарылганын көрсөтүү үчүн жумушка кабыл алынса, тапшырманын статусун "Аткаруу боюнча аткарылууда"дан өзгөртүңүз: Бул оор макала болот. Эгерде сизде кандайдыр бир көйгөй болсо, комментарийге жазыңыз: Мен аларга колумдан келишинче мониторинг жүргүзүп, жооп берем. Бул кичинекей Кардарларды колдоо кызматы болот: DДокер файлын түзүү
докер файлы деген эмне? Docker үчүн бул Docker контейнери үчүн сүрөттү кантип түзүү боюнча скрипт (кадам-кадам нускамалар). Колдонмобуз иштеши үчүн бизге JDK, 11 versionсы керек. Башкача айтканда, биз JDK 11 докер сүрөтүн таап, аны сүрөтүбүзгө кошуубуз керек. Бул эстутумга көз карандылыкты кошууга окшош нерсе. Бул үчүн Dockerде DockerHub бар . Сүрөттөрдү жергorктүү түрдө жүктөп алуу үчүн, ошол жерде катталуу керек. Катталгандан кийин JDK11ди издейли. Мен тапканымдан, бул контейнер: acceptopenjdk/openjdk11 . Бул контейнердин сүрөттөмөсүндө докер файлы үчүн керектүү нерселер бар:FROM adoptopenjdk/openjdk11:ubi
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]
Келгиле, jar файлын алып жаткан папканы оңдойлу. mvn пакетинин maven тапшырмасын аткаргандан кийин биз аны максаттуу папкада алабыз. Мунун баарын жасоодон мурун, жаңыртылган негизги бутактын негизинде, биз тапшырмабыз үчүн жаңысын түзөбүз: STEP_4_JRTB-13 . Эми сиз иштей аласыз. Долбоордун тамырында Dockerfile кеңейтүүсүз файл түзүп , ичине төмөнкүлөрдү кошуңуз:
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Биринчи сапта сүрөттөлүш эмнеге негизделет - acceptopenjdk/openjdk11. Экинчи сап максаттуу папкада жайгашкан JAR_FILE аттуу сүрөткө аргумент кошуу. Мындан тышкары, учурдагы папка Dockerfile жайгашкан жери менен аныкталат. Үчүнчү сап - биздин долбоордун банкасын докер сүрөтүнө көчүрүңүз. Акыркы сап негизинен боштук менен бөлүнгөн терминалдагы буйруктан түзүлгөн массивди камтыйт. Башкача айтканда, аягында төмөнкүлөр аткарылат: “java -jar /app.jar” Бот белгисин жашыруун сактоо үчүн, контейнерди ишке киргизүүдө биз эки өзгөрмөлөрдү өткөрүп беришибиз керек - боттун аталышы жана анын белгиси. Бул үчүн, биз өзгөрмөлөр менен долбоорубузду ишке киргизүү керек болгон суроо жазабыз. Анан кантип жасоо керек? Сиз аны Google керек: бул жерде кадимки сүрөттөлүшү менен биринчи шилтеме болуп саналат. Биз эмне кылгыбыз келет? application.properties файлында биз аныктаган эки өзгөрмө бар:
- bot.username
- bot.token
- Келгиле, bash сценарийин иштетели.
- Bash скрипти docker-compose иштетет.
- Docker-compose биздин тиркеме менен докер контейнерин ишке киргизет.
- Docker контейнери биздин колдонмону иштетет.
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}", "-jar", "/app.jar"]
Биз эки сап кошуп, ENTRYPOINT жаңыртканыбызды көрө аласыз. Саптар:
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
codeдогуч файлдын ичиндеги өзгөрмөлөрдү жарыялоо. Демейки боюнча, алар белгиленген мааниге ээ. Эгерде бул докер файлынан сүрөттү түзүүдө, мындай аталыштар менен чөйрө өзгөрмөлөрү өткөрүлүп берилсе, баалуулуктар башкача болот. Жана ENTRYPOINTте биз бул чөйрө өзгөрмөлөрүн окуй турган дагы бир нече элементтерди коштук:
"-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}"
Бул жерде сиз ${} конструкциясын колдонуп, саптын ичинде BOT_NAME жана BOT_TOKEN маанилери өткөрүлө турганын көрө аласыз. Андан кийин, биз бул өзгөрмөлөрдү кантип кабыл алууну жана докер-композитке берүүнү үйрөтүшүбүз керек.
docker-compose.yml түзүңүз
YAML форматы жөнүндө өзүнчө окуп чыксаңыз жакшы болмок, антпесе макала секирик менен өсүп жатат. Биз үчүн бул .properties түрүндөгү өзгөрмөлөрдүн дагы бир сүрөттөлүшү. Касиеттерде гана чекит аркылуу жазылат, бирок YAMLде бул бир аз жакшыраак жасалат. Мисалы, ушул сыяктуу. .properties ичинде эки өзгөрмө: javarush.telegram.bot.name=ivan javarush.telegram.bot.token=pupkin Бирок .yamlда (.yml менен эле) ал мындай болот:javarush:
telegram:
bot:
name: ivan
token: pupkin
Экинчи параметр сулуу жана түшүнүктүү. Боштуктар жогоруда көрсөтүлгөндөй болушу керек. Келгиле, биздин application.properties жана application.yml дегенди кандайдыр бир жол менен которуп көрөлү. Биринчиден, аны түзүү керек. Долбоордун тамырында docker-compose.yml файлын түзүп , ал жерге төмөндөгүлөрдү жазыңыз:
version: '3.1'
services:
jrtb:
build:
context: .
environment:
- BOT_NAME=${BOT_NAME}
- BOT_TOKEN=${BOT_TOKEN}
restart: always
Биринчи сап докер түзүүчү version. кызматтар: андан кийинки бардык саптар (жылдырылат) биз конфигурациялап жаткан кызматтарга тиешелүү экенин айтат. Азырынча бизде алардын бирөө гана бар - jrtb деп аталган java колдонмосу . Ал эми анын астында анын бардык орнотуулары болот. Мисалы, куруу: контекст: . Докер файлын docker-compose.yml каталогунан издейбиз дейт. Бирок айлана-чөйрө: бөлүмү керектүү чөйрө өзгөрмөлөрүн Dockerfileге өткөрүп берүүбүз үчүн жооптуу болот. Бизге эмне керек. Ошондуктан, биз төмөндө өзгөрмөлөрдү өткөрүп жатабыз. Docker-compose аларды serverдин иштөө чөйрөсүнүн өзгөрмөлөрүндө издейт. Келгиле, аларды bash скриптине кошолу.
Bash скрипттерин түзүү
Акыркы кадам - bash сценарийин түзүү. Долбоордун тамырында start.sh деп аталган файлды түзүп, ал жерге төмөнкүнү жазыңыз:#!/bin/bash
# Pull new changes
git pull
# Prepare Jar
mvn clean
mvn package
# Ensure, that docker-compose stopped
docker-compose stop
# Add environment variables
export BOT_NAME=$1
export BOT_TOKEN=$2
# Start new deployment
docker-compose up --build -d
Биринчи сап бардык bash скрипттери үчүн керек: ансыз иштебейт. Андан кийин - терминалда аткарылышы керек болгон буйруктардын жыйындысы. Мен ар бир буйрукка комментарийлерди коштум, андыктан ал түшүнүктүү болушу керек. Мен түшүндүргүм келген бир гана нерсе - $1 жана $2 деген эмнени билдирет. Бул эки өзгөрмөлөр, алар bash скрипти ишке киргизилгенде өткөрүлөт. Экспорттоо буйругун колдонуу менен алар server өзгөрмөлөрүнө кошулат жана докер-түзүүдө окулат. Бул Ubuntu үчүн иштейт, балким Windows үчүн эмес, бирок мен анык эмесмин. Эми сиз ишти токтото турган stop.sh сценарийин кошушуңуз керек. Ал бир нече саптарды камтыйт:
#!/bin/bash
# Ensure, that docker-compose stopped
docker-compose stop
# Ensure, that the old application won't be deployed again.
mvn clean
Бул жерде биз докер-түзүүнү токтотуп, акыркы куруудан бери жаткан jarnik долбоорун тазалайбыз. Биз муну биздин долбоордун так кайра куруусун камсыз кылуу үчүн жасайбыз. Прецеденттер болгон, ошондуктан мен кошуп жатам) Натыйжада, биз 4 жаңы файлга ээ болдук:
- Dockerfile - биздин тиркеменин сүрөтүн түзүү үчүн файл;
- docker-compose.yml - контейнерлерибизди кантип ишке киргизебиз деген орнотуулары бар файл;
- start.sh - биздин тиркемени жайылтуу үчүн баш скрипти;
- stop.sh биздин колдонмону токтотуу үчүн баш скрипт.
# Release Notes ## 0.3.0-SNAPSHOT * JRTB-13: долбоорго жайылтуу процесси кошулду ## 0.2.0-SNAPSHOT * JRTB-3: Telegram Bot буйруктарын иштетүү үчүн ишке ашырылган буйрук үлгүсү ## 0.1.0-SNAPSHOT * JRTB -2: кошумча телеграмма боту * JRTB-0: SpringBoot скелет долбоору кошулду
Жана READMEде биз тиркемени кантип жайгаштырууну сүрөттөгөн жаңы абзацты кошобуз:
## Жайгаштыруу Жайгаштыруу процесси мүмкүн болушунча оңой: Талап кылынган программа: - bash скрипттерин иштетүү үчүн терминал - докер - тиркемени жайылтуу үчүн docker-compose, керектүү тармакка которулуу жана bash скриптин иштетүү: $ bash start.sh ${bot_username} ${bot_token } Баары болду.
Албетте, баары англис тorнде жазылган. Адаттагыдай эле, биздин жаңы түзүлгөн STEP_4_JRTB-13 фorалыбызда биз аты менен жаңы милдеттенме түзөбүз: JRTB-13: жайылтуу процессин докер аркылуу ишке ашырып , аны түртүңүз. Мурунку макалаларда айтып өткөн нерселерге майда-чүйдөсүнө чейин токтолбойм. Мен бир эле нерсени кайталоонун маанисин көрбөй турам. Анын үстүнө, муну ойлоп таап, өздөрү жасагандардын эч кандай суроосу болбойт. Бул мен жаңы фorалды кантип түзүү, кантип милдеттенме түзүү, репозиторийге милдеттенмени кантип түртүү керектиги жөнүндө айтып жатам.
GO TO FULL VERSION