Docker por Komencantoj: Kio estas Docker kaj Kiel Krei Docker-Ujojn

Se vi estis en kontakto kun la plej novaj evoluoj en la programada mondo en la pasintaj jaroj, vi rimarkus la laŭtan zumadon ĉirkaŭ Docker kaj Docker-ujoj. Ĉi tiu populareco de docker ne estas senkaŭza. La enkonduko de Docker multe ŝanĝiĝis, kiel programistoj alproksimiĝas al disvolviĝo de aplikaĵoj.

Kiu volas resti post kiam tia revolucia teknologio trafas la programan mondon? Do hodiaŭ ni komencas novan lernoserion por ke vi lernu kiel uzi Docker por aplika disvolviĝo. Se vi estas absoluta komencanto de Docker, ĉi tiu lernila serio estas la ĝusta loko por vi komenci.

En la unua artikolo de nia lernilo, ni serĉas kompreni, kio estas ĝuste Docker kaj kial programistoj amas Docker tiel. Ni ankaŭ kunligos simplan programon Node.js por familiariĝi kun la bazaj konceptoj de Docker.


Kial atendi plu? Ni komencu!



Kio estas Docker

Docker estas ilo uzata por krei aplikojn; tio estas krei, disfaldi kaj funkciigi programojn per konteneroj.


Kun ujo, ĉiuj bibliotekoj, kaj aliaj dependecoj necesaj por lanĉi programon, estas pakitaj kiel ununura pakaĵo por deplojo.

La ĉefa celo de kontenerigado de aplikaĵo estas izoli ilin de aliaj programoj funkciantaj en la sama sistemo. Ĉi tiu aliro certigas, ke aplikoj ne malhelpas unu la alian kaj faciligas prizorgadon de aplikaĵoj.

Kvankam ujoj funkciantaj en la sama sistemo estas izolitaj unu de la alia dum ekzekuto, ili dividas la saman OS-kernon. Sekve, ujoj estas pli malpezaj kompare kun la alternativa elekto por izoli virtualajn maŝinojn por apliki ekzekuton.

Enujigita aplikaĵo funkcianta sur via Vindoza OS estas garantiita funkcii sen problemo en la Vindoza maŝino de alia uzanto malgraŭ la ŝanĝo de ĉirkaŭaĵo.


Kvankam ujoj jam delonge estis uzataj antaŭ Docker, la enkonduko de Docker popularigis uzadon de ujoj en la programista komunumo. Estas du eroj, kiuj estas uzataj kiam oni kunportas programon: Dockerfile kaj Docker-Bildo . Ni eksciu, kio ili estas.

Dockerfile

Dockerfile estas teksta dosiero, kiu enhavas aron da komandoj necesaj por konstrui docker-bildon. Dockerfile enhavas informojn pri la suba OS, la lingvo, dosiera loko kaj retaj havenoj interalie.

Docker-Bildo

Kiam vi lanĉas la konstruan komandon de Docker kun dockerfile en loko, docker-bildo estas kreita surbaze de la dockerfile. Ili funkcias kiel ŝablonoj por krei la finan dokan ujon. Post kiam kreitaj, dokaj bildoj estas senmovaj. Vi povas alvoki la ekzekutan komandon de Docker por krei la docker-ujon per docker-bildo.



Dockerizing de Node.js-Apliko

En ĉi tiu lernilo ni aldokos programon Node.js. Ni sekvos paŝon post paŝo por funkciigi la Docker-ujon.


1 - Kreu la aplikaĵon Node.js 2 - Kreu la dokan dosieron 3 - Konstruu la dokan bildon 4 - Kreu la aplikan ujon

Antaŭ ol tuŝi nian programon, vi devas certigi, ke Docker kaj Node.js estas instalitaj en via sistemo.

  • Instalu Docker en via sistemo — Mi ne traktos kiel instali Docker en ĉi tiu lernilo, sed vi povas sekvi Docker-dokumentadon kaj instali Docker sur via Vindozo aŭ Ubuntu-labortablo.
  • Elŝutu kaj Instalu Node.js de la oficiala retejo

Kreu la Aplikaĵon Node.js

Iru al la nova projekta dosierujo de la komandlinio kaj rulu la sekvan komandon por krei la dosieron package.json, kiu enhavas informojn pri la dependecoj de la aplikaĵo kaj komencu skripton.

npm init -y


Poste instalu kaj aldonu Express kiel dependecon al via aplikaĵo per rulo de ĉi tiu komando sur la komandlinio. Ni uzos Express por krei la programon.

npm install express --save

Ĉi tio aldonos la esprimon kiel dependeco al nia package.json dosiero.

Nun ni povas krei Nodo-aplikaĵon helpe de Express.


Kreu dosieron nomatan app.js en la projekta dosierujo kaj aldonu la sekvan kodon al la dosiero.

const express = require('express') const app = express() app.get('/', (req, res) => {
res.send('Hello World!') }) app.listen(3000, () => {
console.log('Node server has started running') })

La supra kodo kreas Nodo-servilon, kiu aŭskultas alvenantajn petojn sur la haveno 3000. Vi povas lanĉi ĉi tiun komandon sur la komandlinio por lanĉi la Nodo-servilon.

node app.js

Nun iru al via retumilo kaj sekvu la URL http://localhost:3000 kaj vi vidos la tekston Hello World! sur la paĝo.

Ni konstruis simplan Nodan programon por nia projekto. Nun ni plu kreu la dokan dosieron.

Kreu la Dokumentan Dosieron

En la dockerfile, ni provizas informojn necesajn por konstrui kaj ekzekuti nian Node-programon kun la Docker-medio.

Ĉi tio inkluzivas specifi la lingvon kaj ĝian version uzatan en la aplikaĵo, agordi nian projektan dosierujon kiel la funkcian dosierujon, kopii ĉiujn dosierojn en la funkcianta dosierujo, agordi la retan havenon kaj specifi, kiu dosiero estas la enira punkto al la apliko. En pli kompleksaj aplikoj, vi devos agordi ĉirkaŭvariablojn kaj la datumbazan URL ankaŭ en la dosierujo.

FROM node:latest WORKDIR /dockerTutorial COPY . . RUN npm install EXPOSE 3000 ENTRYPOINT ['node', 'app.js']
  • DE komando prenas OS-bildon, por lanĉi nian programon sur specifa mastruma sistemo, de Docker Hub. Docker Hub estas deponejo de dokaj bildoj, kiujn ni povas tiri al la loka medio. Ni reakiras Ubuntu-bazitan bildon, kiu instalis Node.js. Uzi 'plej novan' kiel la versio de Nodo tiras bildon, kiu havas la plej novan version de Nodo instalita.
  • WORKDIR komando agordas la funkcian dosierujon de la aplikaĵo.
  • KOPIU komando kopias dosierojn de la aktuala dosierujo (sur la komandlinio) al la labordosieraro difinita en la antaŭa paŝo. Vi povas aŭ specifi dosiernomon por kopii aŭ uzi duoblajn punktojn por kopii ĉiujn dosierojn en la aktuala dosierujo al la laboranta dosierujo.
  • KURI komando instalas ĉiujn dependecojn necesajn por krei la programon. Ĉi tio inkluzivas ĉiujn dependecojn specifitajn en la package.json dosiero.
  • Elmontri komando malfermas havenon de la ujo Docker al la ekstera mondo. Ĉi tiu haveno ricevas ĉiujn petojn, kiujn ni sendas al la ujo Docker. Haveno estas specife agordita al 3000 ĉar ĝi estas la haveno, kiun nia Nodo-aplikaĵo ene de la ujo Docker uzas por aŭskulti petojn.
  • ENIRPUNKTO specifas kiel lanĉi la aplikaĵon. Docker aliĝas al la tabelo, kiun ni provizas al ununura komando por lanĉi la programon. Ĉi-kaze, node app.js.

Konstruante la Docker-Bildon

Uzu la sekvan komandon por krei la Docker-bildon el la docker-dosiero.

docker build -t docker-tutorial .

Docker-tutorial estas la nomo de la Docker-bildo. La punkto indikas la dosieron-vojon al la projekta dosierujo, kie ni nun troviĝas en la komandlinio.

Se la OS-bildo specifita per la DE ordono, nodo: plej nova , ne estas en via aparato nuntempe, ĝi estos eltirita de Docker Hub kiam vi lanĉos la supran komandon.

Post tirado de la bildo, ĉiu komando en la doka dosiero estos plenumita unu post la alia.

Fine de la ekzekuto, se vi vidas la mesaĝon sukcese konstruis , la doka bildo de la aplikaĵo estis kreita sukcese. Rulu ĉi tiun komandon por vidi la konstruitan dokan bildon en la loka bilda deponejo.

docker images

La eliro aspektas tiel

Kreante la Ujon

Nun ni povas uzi la konstruitan bildon por krei nian Docker-ujon. Uzu la docker run-komandon por krei la ujon.

docker run -p 8080:3000 docker-tutorial

Ĉi tie, la numeroj 8080 kaj 3000 indikas la eksteran kaj internan de la ujo. Ekstera haveno, 8080, estas la haveno, kiun ni uzas por konekti al la aplikaĵo per nia retumilo. Interna haveno, 3000, estas la haveno, kiun nia aplikaĵo aŭskultas por alvenantaj petoj. Docker-ujo mapas la donitan eksteran havenon al la interna haveno.

Vizitu la URL http://localhost:8080 en la retumilo kaj vidu ĉu vi ricevas la paĝon per Hello World! mesaĝo, kiun vi ricevis vizitante http://localhost:3000 antaŭe. Se jes, tiam via Docker-ujo funkcias.

Vi povas uzi ĉi tiun komandon por vidi ĉiujn funkciantajn ujojn de Docker en via aparato.

docker ps

La komando donos al vi rezulton tiel. Ni povas trovi la CONTAINER_ID kaj NOMON de la kuranta ujo ĉi tie.

Aldono de Mediaj Variabloj al Via Apliko

Ĉu vi memoras, kiel mi menciis, ke aplikaĵo kun mediaj variabloj postulas pli da instrukcioj en la dosierujo? La valoro de mediaj variabloj ŝanĝiĝas laŭ la medio, en kiu ili funkcias.

Notu, kiel ni eksplicite menciis la havenon, kiun nia Noda programo aŭskultas kiam la servilo funkcias. Ĉi tiu aliro estas nefleksebla kaj erarema. Se ni lanĉos nian programon en ĉirkaŭaĵo, kiu ne malfermas la havenon 3000 por la Noda servilo, nia programo ĉesas funkcii.

La plej taŭga efektivigo estas forpreni la havenan numeron el la aplikaĵo. Anstataŭe ni uzas variablan nomon anstataŭ pordnumero kaj starigas valoron por tiu variablo en la kuranta medio. En nia kazo, la kuranta medio estas la ujo Docker. Do ni devas aldoni la havenan numeron al la dosierujo kiel ĉirkaŭa variablo.

Ni vidu, kiel ni povas fari tion.

Unue aldonu la median variablon al nia dosierujo kun ĝia valoro. Ni devas aldoni novan komandon al la dosierujo por plenumi ĉi tion.

FROM node:latest WORKDIR /dockerTutorial COPY . . ENV PORT=3000 RUN npm install EXPOSE $PORT ENTRYPOINT ['node', 'app.js']

Uzante la komandon ENV sekvitan de la nomo de variablo kaj valora atribuo, ni povas aldoni novan median variablon al nia dosierujo. Ĉu vi rimarkis, kiel la komando EXPOSE 3000 estis ŝanĝita por ne eksplicite mencii la havenan numeron? Anstataŭe ĝi rilatas al la kreita PORT-variablo por akiri la ĝustan pordan numeron. Per ĉi tiu aliro, se ni devas ŝanĝi la havenan numeron, ni nur devas ŝanĝi unu lokon en nia kodo, kio faciligas nian aplikadon.

Nun ni ŝanĝis la dokan dosieron, la sekva paŝo estas ŝanĝi la app.js por raporti al la kreita ĉirkaŭa variablo. Por ĉi tio, ni anstataŭigas la pordan numeron 3000 uzatan en la aŭskultmetodo per process.env.PORT.

const express = require('express') const app = express() app.get('/', (req, res) => {
res.send('Hello World!') }) app.listen(process.env.PORT, () => {
console.log('Node server has started running') })

Ĉar ni faris ŝanĝojn al niaj aplikaĵaj dosieroj kaj dosierujo, ni devas krei novan bildon por nova ujo. Sed unue ni devas ĉesigi la nuntempe funkciantan Docker-ujon por atingi ĉi tion.

Ni povas uzi la komandon docker stop por haltigi la ujon.

docker stop f10

La valoro, f10, uzata en ĉi tiu komando estas la unuaj tri ciferoj de la identigilo de la ujo.

Ni povas uzi la komandon, docker kill, por haltigi la kurantan ujon.

docker kill f10

La diferenco inter docker-mortigo kaj docker-halto estas, ke docker-halto haltigas la ujon pli gracie per liberigo de rimedoj kaj ŝparado de la ŝtato. docker kill tamen haltigas la ujon pli abrupte sen ĝuste liberigi rimedojn aŭ savi la ŝtaton. Por ujo funkcianta en produktado-medio, uzi dokan halton por haltigi la ujon estas la pli bona elekto.

Post haltigo de kuranta ujo, certigu purigi la postlasitan reston de la ujo de la gastiga medio per la jena komando.

Rulante la Ujon en Daemon Mode

Kiam vi provas ruli la suprajn komandojn por haltigi la ujon, vi rimarkus, ke la fina langeto, kiun ni uzis por krei la ujon, ne povas esti uzata por lanĉi pluajn ordonojn, krom se ni mortigas la ujon. Ni povas trovi solvon por tio uzante apartan langeton por lanĉi novajn komandojn.

Sed estas pli bona aliro. Ni povas funkciigi la ujon en la demona reĝimo. Kun la demona reĝimo, la ujo funkcias en la fono sen uzi la aktualan langeton por montri rezultojn.

Por lanĉi ujon en la demona reĝimo, vi simple devas aldoni plian -d-flagon al la komando por docker run.

docker run -d -p 8080:3000 docker-tutorial

Funkciigi la Ujon en Interaga Reĝimo

Por funkciigi ujon en la interaga reĝimo, la ujo jam funkcius. En la interaga reĝimo, vi povas lanĉi komandojn por aldoni aŭ forigi dosierojn al la ujo, listigi dosierojn aŭ ekzekuti aliajn bash-komandojn, kiujn ni kutime uzas.

Uzu la jenan komandon por lanĉi la ujon en la interaga reĝimo.

docker exec -it e37 bash

Jen e37 estas la uja identigilo. Ludu kun la interaga reĝimo per bash-komandoj.



Konkludo

En la unua lernilo de nia lernila serio de Docker, vi lernis kiel krei ujon de Docker por simpla programo Node.js. Sed estas pli, kion vi povus fari kun Docker kaj ujoj. En niaj venontaj lerniloj, ni vidos kiel labori kun datumbazoj, volumoj kaj labori kun multnombraj ujoj uzataj de programo kreita kun mikroservoj.