Docker: Node.js

Kaip naudoti ir diegti Node.js programą su Docker

👋 Sveiki atvykę į Stackhero dokumentaciją!

Stackhero siūlo paruoštą naudoti Docker cloud CaaS (Containers as a Service) sprendimą, kuris suteikia daugybę privalumų, įskaitant:

  • Lengvai diekite savo konteinerius į gamybą su paprastu docker-compose up.
  • Pritaikomas domeno vardas su HTTPS apsauga (pavyzdžiui, https://api.jusu-imone.com, https://www.jusu-imone.com, https://backoffice.jusu-imone.com).
  • Optimali veikla ir tvirta apsauga naudojant privačią ir dedikuotą VM.
  • Paprasti atnaujinimai vienu paspaudimu.

Taupykite laiką ir supaprastinkite savo gyvenimą: tereikia 5 minučių išbandyti Stackhero Docker CaaS cloud hosting sprendimą ir diegti savo konteinerius į gamybą!

Šis vadovas suteikia tvirtą pagrindą kurti Node.js programą ir greitai bei lengvai ją diegti į gamybą.

Išankstinių žinių apie Docker nereikia. Viskas paruošta sklandžiai patirčiai užtikrinti; jums tereikia, kad Docker būtų įdiegtas jūsų kompiuteryje.

Ši dokumentacija skirta tiek pradedantiesiems, tiek patyrusiems vartotojams, norintiems diegti Node.js programą naudojant modernias, skalabilias technologijas be nereikalingų komplikacijų.

Pagrindinės šio sprendimo savybės:

  • 💪 Lengvas nustatymas su minimaliomis pastangomis
  • 🐳 Docker naudojimas tiek kūrimo, tiek gamybos aplinkose
  • 🔄 Automatinis Node.js perkrovimas keičiant kodą naudojant nodemon
  • 🚀 Vieno komandos diegimas į gamybą
  • 🔒 TLS sertifikatų valdymas saugiam HTTPS šifravimui
  • 🚧 Palaikymas testavimo ir priešgamybiniams platformoms
  • 🧱 Modulinė ir skalabilinė architektūra

Jei Docker dar nėra įdiegtas jūsų kompiuteryje, galite jį atsisiųsti iš Docker oficialios svetainės. Norėdami patikrinti, ar Docker veikia tinkamai, atidarykite terminalą ir paleiskite docker version. Turėtumėte matyti versijos informaciją be klaidų.

Įdiegę Docker, klonuokite šią boilerplate saugyklą:

git clone https://github.com/stackhero-io/nodejsWithDockerGettingStarted/
cd nodejsWithDockerGettingStarted

Tada paleiskite kūrimo platformą vykdydami make development-start arba peržiūrėkite visas galimas komandas su make help.

Norėdami paleisti kūrimo platformą, vykdykite:

make development-start

Ši komanda sukuria Docker atvaizdą, jį paleidžia ir vykdo dev skriptą, apibrėžtą my-app/package.json (tai prilygsta npm run dev vykdymui).

Šiame pavyzdyje sukuriama paprasta REST API naudojant Express. API galite peržiūrėti naršydami į http://localhost:5000. Puslapyje turėtų būti rodomas "Hello World".

Tada atidarykite failą my-app/src/app.js savo mėgstamame IDE ir pakeiskite šią eilutę:

res.send('Hello World');

Pakeiskite ją į:

res.send('Updated!');

Išsaugokite failą. Node.js kodas automatiškai persikraus, o atnaujinus http://localhost:5000 bus atspindėtas atnaujintas API atsakas.

Sveikiname - dabar turite visiškai veikiančią kūrimo platformą!

Jei reikia įdiegti papildomus paketus, galite vykdyti make development-shell, kad pasiektumėte konteinerio apvalkalą. Viduje naudokite NPM su npm install <package> arba Yarn su yarn add <package>, kad įdiegtumėte norimus paketus.

Jei turite esamą Node.js projektą, kurį norite integruoti su Docker, atlikite šiuos veiksmus:

  1. Sukurkite naują katalogą pavadinimu my-app savo projekte.

  2. Perkelkite visus projekto failus į my-app katalogą, išskyrus .gitignore ir .git failus.

  3. Nukopijuokite docker, secrets ir Makefile iš boilerplate į savo projekto šaknies katalogą.

  4. Redaguokite .gitignore failą savo projekte ir pridėkite šias eilutes:

    node_modules/
    secrets/*.production
    secrets/*.staging
    

Šis boilerplate numato, kad jūsų programa klausosi 5000 prievade. Jei norite kito prievado, galite redaguoti docker/docker-compose.development.yml failą ir tada iš naujo paleisti aplinką su make development-start.

Jei norite nurodyti kitą Node.js versiją, atlikite šiuos veiksmus:

  1. Atidarykite failą docker/my-app.dockerfile, kuris apibrėžia Docker atvaizdą jūsų programai.
  2. Suraskite pirmą eilutę, kuri skaito FROM node:<version>-alpine.
  3. Pakeiskite <version> į pasirinktą Node.js versiją. Rekomenduojama naudoti ilgalaikės palaikymo (LTS) versiją. Naujausią LTS versiją galite patikrinti Node.js svetainėje. Pavyzdžiui, norėdami naudoti naujausią LTS versiją (šiuo metu 22), atnaujinkite eilutę į FROM node:22-alpine. Jei norite konkretaus versijos numerio, galite naudoti kažką panašaus į FROM node:22.13.0-alpine.
  4. Išsaugokite savo pakeitimus Dockerfile.

Nustatykite aplinkos kintamuosius kūrimo platformai faile secrets/my-app.development.

Gamybai naudokite failą secrets/my-app.production.

Neįtraukite secrets/my-app.production failo į savo Git saugyklą! Šis failas turi jautrią informaciją ir pagal numatytuosius nustatymus ignoruojamas boilerplate .gitignore, kad būtų išvengta atsitiktinio dalijimosi.

Jei jūsų Node.js programa turi saugoti failus (pvz., vartotojų įkėlimus), apsvarstykite galimybę naudoti objektų saugojimo paslaugą, tokią kaip MinIO. Objektų saugojimo paslauga padeda jūsų programai sklandžiai augti, sumažinant galimas problemas.

Jei norite saugoti failus vietoje, visada naudokite Docker tūrį. Failų saugojimas tiesiogiai konteineryje gali sukelti duomenų praradimą. Šis boilerplate suteikia tūrį, montuojamą /persistent, kad failai būtų saugiai saugomi.

Niekada nesaugokite nuolatinių duomenų už /persistent katalogo ribų, nebent sukūrėte pasirinktinius tūrius ir esate tikri dėl konfigūracijos. Failų saugojimas už /persistent ribų sukels duomenų praradimą!

Galite lengvai modifikuoti šį boilerplate, kad pridėtumėte testavimo aplinką. Norėdami tai padaryti:

  1. Sukurkite docker/docker-compose.production.yml kopiją ir pavadinkite ją docker/docker-compose.staging.yml. Šis failas apibrėžia konteinerius ir konfigūraciją jūsų testavimo aplinkai.
  2. Sukurkite secrets/my-app.staging failą, kuriame yra bet kokia jautri informacija, reikalinga testavimui, pvz., duomenų bazės slaptažodžiai ar API raktai.
  3. Makefile suraskite skyrių pavadinimu "Staging platform" ir iškomentuokite jį.

Galiausiai, vykdykite make help, kad pamatytumėte naujas testavimo komandas, kurios dabar yra prieinamos.

Jei dar neturite Stackhero for Docker paslaugos, galite ją lengvai sukurti iš savo Stackhero prietaisų skydelio. Ji bus aktyvuota per maždaug 2 minutes.

Jei esate naujas Stackhero vartotojas, galite išbandyti Docker konteinerių debesų talpinimą nemokamai mėnesį.

Prieš diegdami savo programą į gamybą, turite paruošti keletą konfigūracijos failų:

  1. Nukopijuokite secrets/global.production.example į secrets/global.production.
  2. Redaguokite secrets/global.production ir pakeiskite <XXXXXX>.stackhero-network.com į savo Docker paslaugos pagrindinį vardą iš savo Stackhero prietaisų skydelio.
  3. Nukopijuokite secrets/my-app.production.example į secrets/my-app.production.
  4. Redaguokite secrets/my-app.production ir įveskite savo prisijungimo duomenis.
  5. Atnaujinkite docker/docker-compose.production.yml, pakeisdami <XXXXXX>.stackhero-network.com į savo Docker paslaugos pagrindinį vardą.

Diegimas į gamybą yra paprastas: vykdykite:

make production-deploy

Ši komanda sukuria Docker konteinerį, perkelia jūsų projekto duomenis ir siunčia juos į jūsų Docker paslaugą gamyboje. Atidarykite naršyklę ir naršykite į savo Docker paslaugos pagrindinį vardą (pvz., https://<XXXXXX>.stackhero-network.com). Turėtumėte matyti, kaip jūsų REST API atsako "Hello World".

Taip pat galite naudoti make production, kuris diegia jūsų konteinerius ir rodo realaus laiko žurnalus.

Norėdami stebėti savo gamybos aplinką arba spręsti problemas, galite peržiūrėti savo žurnalus naudodami šias komandas:

  • Norėdami transliuoti tiesioginius žurnalus, vykdykite: make production-logs-live
  • Norėdami gauti visus saugomus žurnalus, vykdykite: make production-logs
  • Norėdami gauti konkrečios dienos žurnalus (pakeiskite YYYY-MM-DD norima data), vykdykite: make production-logs | grep "YYYY-MM-DD"

Jei norite naudoti kitą domeno vardą vietoj https://<XXXXXX>.stackhero-network.com, Stackhero for Docker integruoja Traefik, kad supaprastintų domenų valdymą. Traefik tvarko HTTP maršrutizavimą ir TLS šifravimą (HTTPS) už jus.

Štai keletas pavyzdžių, kaip pritaikyti savo domenų vardus:

  • Norėdami aptarnauti api.my-company.com per savo konteinerį my-app 5000 prievade su TLS šifravimu, atnaujinkite docker/docker-compose.production.yml failą, pakeisdami labels skyrių:

        labels:
          - "traefik.enable=true" # Įjungti Traefik, kad nukreiptų srautą į šį konteinerį
          - "traefik.http.routers.my-app.rule=Host(`api.my-company.com`)" # Apibrėžti pagrindinį vardą
          - "traefik.http.routers.my-app.tls.certresolver=letsencrypt" # Naudoti letsencrypt TLS sertifikatams
          - "traefik.http.services.my-app.loadbalancer.server.port=5000" # Nurodyti 5000 prievadą
    
  • Norėdami aptarnauti my-company.com per savo konteinerį my-app 5000 prievade ir nukreipti visas užklausas iš www.my-company.com į my-company.com, atnaujinkite labels skyrių tame pačiame faile:

        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.my-app.rule=Host(`my-company.com`) || Host(`www.my-company.com`)" # Įtraukti abu domenus
          - "traefik.http.routers.my-app.tls.certresolver=letsencrypt"
          - "traefik.http.services.my-app.loadbalancer.server.port=5000" # Nurodyti 5000 prievadą
    
          # Nukreipti www.my-company.com į my-company.com:
          - "traefik.http.routers.my-app.middlewares=redirect-www"
          - "traefik.http.middlewares.redirect-www.redirectregex.regex=^https://www.my-company.com/(.*)"
          - "traefik.http.middlewares.redirect-www.redirectregex.replacement=https://my-company.com/$${1}"
          - "traefik.http.middlewares.redirect-www.redirectregex.permanent=true"
    

Nepamirškite sukonfigūruoti DNS my-company.com ir www.my-company.com, kad kiekvienas nurodytų kaip CNAME į jūsų Docker paslaugą https://<XXXXXX>.stackhero-network.com.