Салом ба ҳама. Мо силсилаи мақолаҳоро оид ба навиштани лоиҳаи шумо идома медиҳем.
Шохаҳоро ҷудо кунед
Муҳим он аст, ки барои гум нашудан дар фorалҳо ва тартиби онҳо дар анбор, ман тасмим гирифтам, ки онҳоро бо илова кардани префикси STEP_{number} номгузорӣ кунам . Масалан, мо ба гайр аз фorали асосй се фorал дорем:- JRTB-0
- JRTB-2
- JRTB-3
- STEP_1_JRTB-0 - қадами аввал
- STEP_2_JRTB-2 - қадами дуюм
- STEP_3_JRTB-3 - қадами сеюм
Як каме дар бораи Docker
Docker чист? Хулоса, ин асбобест, ки шумо метавонед бо ёрии он шумо метавонед барномаҳоро зуд ва бехатар ҷойгир кунед (ҷойгир кунед), барои онҳо инфрасохтори пӯшидае эҷод кунед, ки танҳо барои онҳо зарур аст. Ҳоло ҳам мушкил аст, ман мефаҳмам. Умуман, Docker-ро метавон ҳамчун платформаи рушд фаҳмид, ки дар он шумо метавонед зуд ва самаранок кор кунед. Docker-ро метавон ҳамчун барномае фаҳмид, ки дар server кор мекунад. Ин барнома дорои қобorяти нигоҳ доштани контейнерҳо бо барномаҳо мебошад. Контейнер чист? Ин инфрасохтори алоҳидаест, ки шумо метавонед ба он ҳама чизи лозимаро илова кунед. Масалан, барои як барномаи Java ба мо JRE лозим аст, то барномаро иҷро кунад, контейнер дорои ин аст, ба мо як нармафзори дигар лозим аст - мо метавонем инро илова кунем. Ё шояд ба мо Linux ва контейнери сервлети Tomcat лозим аст. Ин корро низ кардан мумкин аст. Контейнерҳо дар асоси тасвир сохта мешаванд: яъне ин қолаби мушаххасест, ки ҳама чизро барои сохтани контейнери Docker дар бар мегирад. Ин тасвирро чӣ гуна бояд эҷод кард? Дар ҳолати мо, мо бояд дар решаи лоиҳа як Dockerfile эҷод кунем, ки он чизеро дар контейнер тавсиф мекунад. Азбаски мо намехоҳем, ки аломати ботро дар ягон ҷо фош кунем, мо маҷбур мешавем, ки ҳар дафъае, ки барномаро ҷойгир кардан мехоҳем, ба интиқоли он муроҷиат кунем. Шумо метавонед бештар дар бораи ин мавзӯъ дар ин ҷо ва инҷо бихонед .Мо JRTB-13 менависем
Мо бояд як раванди ҷойгиркунии зуд ва осонро барои замимаи мо ба server таъсис диҳем. Яъне барои мошине, ки 24/7 кор мекунад. Биёед Докерро ҳамчун асос гирем. Аммо дар рӯйхати мо ягон вазифае нест, ки барои илова кардани ин функсия масъул бошад. Ҳангоми эҷоди он чӣ гуна ман онро пазмон шудам. Мушкил нест, мо ҳоло онро эҷод мекунем. Мо ба ҷадвали эҷоди масъала дар GitHub меравем ва дархости хусусиятро интихоб мекунем: Тавсифи вазифа, меъёрҳои қабули онро илова кунед, ба кадом лоиҳа тааллуқ доштани ин масъаларо таъин кунед ва шумо метавонед як шумораи нав эҷод кунед: Акнун, барои нишон додани он, ки вазифа иҷро шудааст барои кор қабул карда шудааст, ҳолати супоришро аз Иҷро дар идома дорад: Ин мақолаи душвор хоҳад буд. Агар шумо ягон мушкилот дошта бошед, дар шарҳҳо нависед: Ман то ҳадди имкон ба онҳо назорат мекунам ва ҷавоб медиҳам. Ин як дастгирии хурди муштариён хоҳад буд: DЭҷоди файли Docker
Файли докер чист? Барои Docker, ин скрипт (дастурҳои қадам ба қадам) дар бораи чӣ гуна сохтани тасвир барои контейнери Docker мебошад. Барои он ки замимаи мо кор кунад, ба мо JDK, versionи 11 лозим аст. Яъне, мо бояд тасвири докери JDK 11-ро пайдо кунем ва онро ба тасвири худ илова кунем. Ин як чизест, ки чӣ гуна мо вобастагӣ ба хотира илова мекунем. Барои ин Docker DockerHub дорад . Барои зеркашии тасвирҳо ба таври маҳаллӣ, шумо бояд дар он ҷо сабти ном кунед. Пас аз бақайдгирӣ, биёед JDK11-ро ҷустуҷӯ кунем. Аз он чизе ки ман ёфтам, ин контейнер аст: acceptopenjdk/openjdk11 . Тавсифи ин контейнер дорои он чизест, ки барои файли докер лозим аст:FROM adoptopenjdk/openjdk11:ubi
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]
Биёед папкаеро ислоҳ кунем, ки аз он файли jar-ро мегирем. Мо онро дар папкаи мақсаднок пас аз иҷро кардани вазифаи maven бастаи mvn дорем. Пеш аз иҷрои ҳамаи ин, дар асоси шохаи асосии навшуда, мо барои вазифаи худ як нав эҷод мекунем: STEP_4_JRTB-13 . Акнун шумо метавонед кор кунед. Дар решаи лоиҳа, файлеро бидуни васеъшавии Dockerfile эҷод кунед ва дар дохor он зеринро илова кунед:
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
тағирёбандаҳоро дар дохor файли рамзгузор эълон кунед. Бо нобаёнӣ онҳо арзиши муайян доранд. Агар ҳангоми сохтани тасвир аз ин файли докер, тағирёбандаҳои муҳити зист бо чунин номҳо интиқол дода шаванд, арзишҳо гуногун хоҳанд буд. Ва дар ENTRYPOINT мо чанд унсури дигарро илова кардем, ки ин тағирёбандаҳои муҳити зистро мехонанд:
"-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}"
Дар ин ҷо шумо мебинед, ки дар дохor сатр бо истифода аз сохтори ${}, арзишҳои BOT_NAME ва BOT_TOKEN гузаронида мешаванд. Минбаъд, мо бояд омӯзем, ки чӣ гуна қабул ва интиқол додани ин тағирёбандаҳо ба docker-compose.
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и docker-compose мебошад. хидматҳо: мегӯяд, ки ҳамаи сатрҳои зерин пас аз ин (кӯчонида мешаванд) ба хидматҳое, ки мо танзим карда истодаем, ишора мекунанд. Мо то ҳол танҳо яке аз инҳоро дорем - барномаи java бо номи jrtb . Ва аллакай дар зери он тамоми танзимоти он хоҳад буд. Масалан, сохтани: контекст: . мегӯяд, ки мо Dockerfile-ро дар ҳамон феҳристи 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 илова карда мешаванд ва дар docker-compose хонда мешаванд. Ин барои 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
Дар ин ҷо мо docker-compose-ро қатъ мекунем ва лоиҳаи jarnik-ро, ки аз замони охирин сохта шуда буд, тоза мекунем. Мо инро барои он мекунем, ки лоиҳаи мо дақиқ аз нав сохта шавад. Пешгӯиҳо буданд, бинобар ин ман илова мекунам) Дар натиҷа, мо бо 4 файли нав ба даст меорем:
- Dockerfile - файл барои эҷоди тасвири замимаи мо;
- docker-compose.yml - файл бо танзимот дар бораи чӣ гуна мо контейнерҳои худро оғоз мекунем;
- start.sh - скрипти bash барои ҷойгиркунии замимаи мо;
- stop.sh скрипти bash аст, ки барномаи моро қатъ мекунад.
# Эзоҳҳои нашр ## 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 - docker-compose барои ҷойгиркунии барнома, гузариш ба фorали лозимӣ ва иҷро кардани скрипти bash: $ bash start.sh ${bot_username} ${bot_token } Ҳамааш ҳамин.
Албатта, ҳама чиз бо забони англисӣ навишта шудааст. Одатан, дар фorали навтаъсиси мо STEP_4_JRTB-13 мо ӯҳдадории навро бо ном эҷод мекунем: JRTB-13: раванди густаришро тавассути docker амалӣ кунед ва онро пахш кунед. Ман ба таври муфассал дар бораи чизҳое, ки дар мақолаҳои қаблӣ тавсиф карда будам, бас мекунам. Ман барои такрор кардани ҳамон чизе намебинам. Ба гайр аз ин, онхое, ки ин корро худашон фахмида, ба чо овардаанд, ягон саволе нахохад дошт. Ин ман дар бораи чӣ гуна эҷод кардани фorали нав, чӣ гуна эҷод кардани ӯҳдадорӣ, чӣ гуна ба анбор тела додан лозим аст.
GO TO FULL VERSION