ื™ืฆื™ืจืช ืฉืจืฉืจืช CI/CD ื•ืื•ื˜ื•ืžืฆื™ื” ืฉืœ ืขื‘ื•ื“ื” ืขื Docker

ืืช ื”ืืชืจื™ื ื”ืจืืฉื•ื ื™ื ืฉืœื™ ื›ืชื‘ืชื™ ื‘ืกื•ืฃ ืฉื ื•ืช ื”-90. ืื– ื”ื™ื” ืงืœ ืžืื•ื“ ืœื”ื›ื ื™ืก ืื•ืชื ืœืžืฆื‘ ืชืงื™ืŸ. ื”ื™ื” ืฉืจืช Apache ื‘ืื™ืจื•ื— ืžืฉื•ืชืฃ ื›ืœืฉื”ื•, โ€‹โ€‹ืืชื” ื™ื›ื•ืœ ืœื”ื™ื›ื ืก ืœืฉืจืช ื”ื–ื” ื‘ืืžืฆืขื•ืช FTP ืขืœ ื™ื“ื™ ื›ืชื™ื‘ืช ืžืฉื”ื• ื›ืžื• ftp://ftp.example.com. ืœืื—ืจ ืžื›ืŸ ื”ื™ื” ืขืœื™ืš ืœื”ื–ื™ืŸ ืืช ื”ืฉื ื•ื”ืกื™ืกืžื” ืฉืœืš ื•ืœื”ืขืœื•ืช ืืช ื”ืงื‘ืฆื™ื ืœืฉืจืช. ื”ื™ื• ื–ืžื ื™ื ืื—ืจื™ื, ื”ื›ืœ ื”ื™ื” ืคืฉื•ื˜ ื™ื•ืชืจ ืื– ืžืืฉืจ ืขื›ืฉื™ื•.

ื™ืฆื™ืจืช ืฉืจืฉืจืช CI/CD ื•ืื•ื˜ื•ืžืฆื™ื” ืฉืœ ืขื‘ื•ื“ื” ืขื Docker

ื‘ืฉื ื™ ื”ืขืฉื•ืจื™ื ืฉื—ืœืคื• ืžืื– ื”ื›ืœ ื”ืฉืชื ื” ืžืื•ื“. ืืชืจื™ ืื™ื ื˜ืจื ื˜ ื”ืคื›ื• ืžื•ืจื›ื‘ื™ื ื™ื•ืชืจ; ื™ืฉ ืœื”ืจื›ื™ื‘ ืื•ืชื ืœืคื ื™ ืฉื”ื ื™ื•ืฆืื™ื ืœื™ื™ืฆื•ืจ. ืฉืจืช ื‘ื•ื“ื“ ื”ืคืš ืœืฉืจืชื™ื ืจื‘ื™ื ื”ืคื•ืขืœื™ื ืžืื—ื•ืจื™ ืžืื–ื ื™ ืขื•ืžืกื™ื, ื•ื”ืฉื™ืžื•ืฉ ื‘ืžืขืจื›ื•ืช ื‘ืงืจืช ื’ืจืกืื•ืช ื”ืคืš ืœื ืคื•ืฅ.

ืœืคืจื•ื™ืงื˜ ื”ืื™ืฉื™ ืฉืœื™ ื”ื™ื™ืชื” ืœื™ ืชืฆื•ืจื” ืžื™ื•ื—ื“ืช. ื•ื™ื“ืขืชื™ ืฉืื ื™ ืฆืจื™ืš ืืช ื”ื™ื›ื•ืœืช ืœืคืจื•ืก ืืช ื”ืืชืจ ื‘ื™ื™ืฆื•ืจ ืขืœ ื™ื“ื™ ื‘ื™ืฆื•ืข ืคืขื•ืœื” ืื—ืช ื‘ืœื‘ื“: ื›ืชื™ื‘ืช ืงื•ื“ ืœืกื ื™ืฃ master ื‘-GitHub. ื‘ื ื•ืกืฃ, ื™ื“ืขืชื™ ืฉื›ื“ื™ ืœื”ื‘ื˜ื™ื— ืืช ืคืขื•ืœืช ืืคืœื™ืงืฆื™ื™ืช ื”ืื™ื ื˜ืจื ื˜ ื”ืงื˜ื ื” ืฉืœื™, ืื ื™ ืœื ืจื•ืฆื” ืœื ื”ืœ ืืฉื›ื•ืœ Kubernetes ืขื ืง, ืื• ืœื”ืฉืชืžืฉ ื‘ื˜ื›ื ื•ืœื•ื’ื™ื™ืช Docker Swarm, ืื• ืœืชื—ื–ืง ืฆื™ ืฉืจืชื™ื ืขื ืคื•ื“ื™ื, ืกื•ื›ื ื™ื ื•ืขื•ื“ ื›ืœ ืžื™ื ื™ ื“ื‘ืจื™ื ืื—ืจื™ื. ืžื•ืจื›ื‘ื•ื™ื•ืช. ืขืœ ืžื ืช ืœื”ืฉื™ื’ ืืช ื”ืžื˜ืจื” ืœื”ืคื•ืš ืืช ื”ืขื‘ื•ื“ื” ืœืงืœื” ื›ื›ืœ ื”ืืคืฉืจ, ื”ื™ื™ืชื™ ืฆืจื™ืš ืœื”ื›ื™ืจ ืืช CI/CD.

ืื ื™ืฉ ืœืš ืคืจื•ื™ืงื˜ ืงื˜ืŸ (ื‘ืžืงืจื” ื”ื–ื”, ืคืจื•ื™ืงื˜ Node.js) ื•ืืชื” ืจื•ืฆื” ืœื“ืขืช ืื™ืš ืœื”ืคื•ืš ืืช ื”ืคืจื™ืกื” ืฉืœ ื”ืคืจื•ื™ืงื˜ ื”ื–ื” ืœืื•ื˜ื•ืžื˜ื™, ืชื•ืš ื”ืงืคื“ื” ืขืœ ืžื” ืฉืžืื•ื—ืกืŸ ื‘ืžืื’ืจ ืžืชืื™ื ื‘ื“ื™ื•ืง ืœืžื” ืฉืขื•ื‘ื“ ื‘ื™ื™ืฆื•ืจ, ืื– ืื ื™ ื—ื•ืฉื‘ ืฉืืชื” ืขืฉื•ื™ ืœื”ืชืขื ื™ื™ืŸ ื‘ืžืืžืจ ื–ื”.

ืชื ืื™ื ืžื•ืงื“ืžื™ื

ื”ืงื•ืจื ืฉืœ ืžืืžืจ ื–ื” ืฆืคื•ื™ ืœื”ื™ื•ืช ื‘ืขืœ ื”ื‘ื ื” ื‘ืกื™ืกื™ืช ืฉืœ ืฉื•ืจืช ื”ืคืงื•ื“ื” ื•ื›ืชื™ื‘ืช ืกืงืจื™ืคื˜ื™ื ืฉืœ Bash. ื‘ื ื•ืกืฃ, ื”ื•ื ื™ืฆื˜ืจืš ื—ืฉื‘ื•ื ื•ืช ื˜ืจื•ื•ื™ืก CI ะธ ืจื›ื–ืช ื“ื•ืงืจ.

ืžื˜ืจื•ืช

ืื ื™ ืœื ืื’ื™ื“ ืฉืืคืฉืจ ืœืงืจื•ื ืœืžืืžืจ ื”ื–ื” ืœืœื ืชื ืื™ "ื”ื“ืจื›ื”". ื–ื” ื™ื•ืชืจ ืžืกืžืš ื‘ื• ืื ื™ ืžื“ื‘ืจ ืขืœ ืžื” ืฉืœืžื“ืชื™ ื•ืžืชืืจ ืืช ื”ืชื”ืœื™ืš ืฉืžืชืื™ื ืœื™ ืœื‘ื“ื™ืงื” ื•ืคืจื™ืกื” ืฉืœ ืงื•ื“ ืœื™ื™ืฆื•ืจ, ื”ืžืชื‘ืฆืข ื‘ืžืขื‘ืจ ืื•ื˜ื•ืžื˜ื™ ืื—ื“.

ื–ื” ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ ื–ืจื™ืžืช ื”ืขื‘ื•ื“ื” ืฉืœื™.

ืขื‘ื•ืจ ืงื•ื“ ืฉื ืฉืœื— ืœื›ืœ ืกื ื™ืฃ ืžืื’ืจ ืœืžืขื˜ master, ืžืชื‘ืฆืขื•ืช ื”ืคืขื•ืœื•ืช ื”ื‘ืื•ืช:

  • ื”ืคืจื•ื™ืงื˜ ืฉื ื‘ื ื” ืขืœ Travis CI ืžืชื—ื™ืœ.
  • ื›ืœ ื‘ื“ื™ืงื•ืช ื”ื™ื—ื™ื“ื”, ื”ืื™ื ื˜ื’ืจืฆื™ื” ื•ืžืงืฆื” ืœืงืฆื” ืžื‘ื•ืฆืขื•ืช.

ืจืง ืœืงื•ื“ ืฉื ื›ื ืก ืœืชื•ื›ื• master, ืžืชื‘ืฆืขื•ืช ื”ืคืขื•ืœื•ืช ื”ื‘ืื•ืช:

  • ื›ืœ ืžื” ืฉื”ื•ื–ื›ืจ ืœืขื™ืœ, ื‘ื ื•ืกืฃ...
  • ื‘ื ื™ื™ืช ืชืžื•ื ืช Docker ืขืœ ืกืžืš ื”ืงื•ื“, ื”ื”ื’ื“ืจื•ืช ื•ื”ืกื‘ื™ื‘ื” ื”ื ื•ื›ื—ื™ื™ื.
  • ืคืจื™ืกืช ื”ืชืžื•ื ื” ืœ- Docker Hub.
  • ื—ื™ื‘ื•ืจ ืœืฉืจืช ื”ื™ื™ืฆื•ืจ.
  • ื”ืขืœืืช ืชืžื•ื ื” ืž- Docker Hub ืœืฉืจืช.
  • ืขืฆื™ืจืช ื”ืžื›ื•ืœื” ื”ื ื•ื›ื—ื™ืช ื•ื”ืชื—ืœืช ืžื™ื›ืœ ื—ื“ืฉ ืขืœ ืกืžืš ื”ืชืžื•ื ื” ื”ื—ื“ืฉื”.

ืื ืืชื” ืœื ื™ื•ื“ืข ื›ืœื•ื ืขืœ Docker, ืชืžื•ื ื•ืช ื•ืžื›ื•ืœื•ืช, ืืœ ืชื“ืื’. ืื ื™ ืืกืคืจ ืœืš ื”ื›ืœ ืขืœ ื–ื”.

ืžื” ื–ื” CI/CD?

ื”ืงื™ืฆื•ืจ CI/CD ืžื™ื™ืฆื’ "ืฉื™ืœื•ื‘ ืžืชืžืฉืš/ืคืจื™ืกื” ืžืชืžืฉื›ืช".

โ– ืื™ื ื˜ื’ืจืฆื™ื” ืจืฆื™ืคื”

ืื™ื ื˜ื’ืจืฆื™ื” ืžืชืžืฉื›ืช ื”ื™ื ืชื”ืœื™ืš ืฉื‘ื• ืžืคืชื—ื™ื ืžืชื—ื™ื™ื‘ื™ื ืœืžืื’ืจ ืงื•ื“ ื”ืžืงื•ืจ ื”ืจืืฉื™ ืฉืœ ื”ืคืจื•ื™ืงื˜ (ื‘ื“ืจืš ื›ืœืœ ืกื ื™ืฃ master). ื™ื—ื“ ืขื ื–ืืช, ืื™ื›ื•ืช ื”ืงื•ื“ ืžื•ื‘ื˜ื—ืช ื‘ืืžืฆืขื•ืช ื‘ื“ื™ืงื•ืช ืื•ื˜ื•ืžื˜ื™ื•ืช.

โ– ืคืจื™ืกื” ืจืฆื™ืคื”

ืคืจื™ืกื” ืจืฆื™ืคื” ื”ื™ื ืคืจื™ืกื” ืื•ื˜ื•ืžื˜ื™ืช ืชื›ื•ืคื” ืฉืœ ืงื•ื“ ืœื™ื™ืฆื•ืจ. ื”ื—ืœืง ื”ืฉื ื™ ืฉืœ ืจืืฉื™ ื”ืชื™ื‘ื•ืช CI/CD ืžืื•ื™ืช ืœืคืขืžื™ื ื›"ืžืกื™ืจื” ืจืฆื™ืคื”". ื–ื” ื‘ืขืฆื ื–ื”ื” ืœ"ืคืจื™ืกื” ืจืฆื™ืคื”", ืื‘ืœ "ืžืกื™ืจื” ืจืฆื™ืคื”" ืžืจืžื–ืช ืขืœ ื”ืฆื•ืจืš ืœืืฉืจ ืฉื™ื ื•ื™ื™ื ื‘ืื•ืคืŸ ื™ื“ื ื™ ืœืคื ื™ ืชื—ื™ืœืช ืชื”ืœื™ืš ืคืจื™ืกืช ื”ืคืจื•ื™ืงื˜.

ืชื—ื™ืœืช ื”ืขื‘ื•ื“ื”

ื”ืืคืœื™ืงืฆื™ื” ืฉื‘ื” ื”ืฉืชืžืฉืชื™ ื›ื“ื™ ืœืœืžื•ื“ ืืช ื›ืœ ื–ื” ื ืงืจืืช ืœืงื—ืช ื”ืขืจื”. ื–ื”ื• ืคืจื•ื™ืงื˜ ืื™ื ื˜ืจื ื˜ ืฉืื ื™ ืขื•ื‘ื“ ืขืœื™ื•, ื”ืžื™ื•ืขื“ ืœืจื™ืฉื•ื ื”ืขืจื•ืช. ื‘ื”ืชื—ืœื” ื ื™ืกื™ืชื™ ืœืขืฉื•ืช JAMStack-ืคืจื•ื™ืงื˜, ืื• ืกืชื ื™ื™ืฉื•ื ื—ื–ื™ืชื™ ืœืœื ืฉืจืช, ืขืœ ืžื ืช ืœื ืฆืœ ืืช ื™ื›ื•ืœื•ืช ื”ืื™ืจื•ื— ื”ืกื˜ื ื“ืจื˜ื™ื•ืช ื•ืคืจื™ืกื” ืฉืœ ืคืจื•ื™ืงื˜ื™ื ืฉื”ื™ื ืžืฆื™ืขื” ื ื˜ืœื™ืคื™ื™. ื›ื›ืœ ืฉื”ืžื•ืจื›ื‘ื•ืช ืฉืœ ื”ืืคืœื™ืงืฆื™ื” ื’ื“ืœื”, ื”ื™ื™ืชื™ ืฆืจื™ืš ืœื™ืฆื•ืจ ืืช ื—ืœืง ื”ืฉืจืช ืฉืœื”, ืžื” ืฉืื•ืžืจ ืฉืืฆื˜ืจืš ืœื’ื‘ืฉ ืืกื˜ืจื˜ื’ื™ื” ืžืฉืœื™ ืœืื™ื ื˜ื’ืจืฆื™ื” ืื•ื˜ื•ืžื˜ื™ืช ื•ืคืจื™ืกื” ืื•ื˜ื•ืžื˜ื™ืช ืฉืœ ื”ืคืจื•ื™ืงื˜.

ื‘ืžืงืจื” ืฉืœื™, ื”ืืคืœื™ืงืฆื™ื” ื”ื™ื ืฉืจืช ืืงืกืคืจืก ื”ืคื•ืขืœ ื‘ืกื‘ื™ื‘ืช Node.js, ื”ืžืฉืจืชืช ืืคืœื™ืงืฆื™ื™ืช React ืฉืœ ืขืžื•ื“ ื‘ื•ื“ื“ ื•ืชื•ืžืš ื‘-API ืžืื•ื‘ื˜ื— ื‘ืฆื“ ื”ืฉืจืช. ืืจื›ื™ื˜ืงื˜ื•ืจื” ื–ื• ืขื•ืงื‘ืช ืื—ืจ ื”ืืกื˜ืจื˜ื’ื™ื” ืฉื ื™ืชืŸ ืœืžืฆื•ื ื‘ื” ื–ื” ืžื“ืจื™ืš ืื™ืžื•ืช ืขืจื™ืžื” ืžืœืื”.

ื”ืชื™ื™ืขืฆืชื™ ืขื ะดั€ัƒะณะพะผ, ืฉื”ื•ื ืžื•ืžื—ื” ืœืื•ื˜ื•ืžืฆื™ื”, ื•ืฉืืœ ืื•ืชื• ืžื” ืื ื™ ืฆืจื™ืš ืœืขืฉื•ืช ื›ื“ื™ ืฉื”ื›ืœ ื™ืขื‘ื•ื“ ื›ืžื• ืฉืจืฆื™ืชื™. ื”ื•ื ื ืชืŸ ืœื™ ืืช ื”ืจืขื™ื•ืŸ ืฉืœ ืื™ืš ืฆืจื™ืš ืœื”ื™ืจืื•ืช ื–ืจื™ืžืช ืขื‘ื•ื“ื” ืื•ื˜ื•ืžื˜ื™ืช, ื”ืžืชื•ืืจ ื‘ืกืขื™ืฃ ื”ื™ืขื“ื™ื ืฉืœ ืžืืžืจ ื–ื”. ืžืฉืžืขื•ืช ื”ืžื˜ืจื•ืช ื”ืืœื” ื”ื™ื ืฉื”ื™ื™ืชื™ ืฆืจื™ืš ืœื”ื‘ื™ืŸ ืื™ืš ืœื”ืฉืชืžืฉ ื‘- Docker.

ืกึทื•ึธืจ

Docker ื”ื•ื ื›ืœื™ ืฉื‘ื–ื›ื•ืช ื˜ื›ื ื•ืœื•ื’ื™ื™ืช ืงื•ื ื˜ื™ื™ื ืจื™ื–ืฆื™ื” ืžืืคืฉืจ ื”ืคืฆื”, ืคืจื™ืกื” ื•ื”ืคืขืœื” ืฉืœ ืืคืœื™ืงืฆื™ื•ืช ื‘ืงืœื•ืช ื‘ืื•ืชื” ืกื‘ื™ื‘ื”, ื’ื ืื ืคืœื˜ืคื•ืจืžืช Docker ืขืฆืžื” ืคื•ืขืœืช ื‘ืกื‘ื™ื‘ื•ืช ืฉื•ื ื•ืช. ืจืืฉื™ืช, ื”ื™ื™ืชื™ ืฆืจื™ืš ืœืฉื™ื ืืช ื™ื“ื™ ืขืœ ื›ืœื™ ืฉื•ืจืช ื”ืคืงื•ื“ื” ืฉืœ Docker (CLI). ื”ื•ืจืื” ืžื“ืจื™ืš ื”ื”ืชืงื ื” ืฉืœ Docker ืœื ื™ื›ื•ืœ ืœื”ื™ืงืจื ืžืื•ื“ ื‘ืจื•ืจ ื•ืžื•ื‘ืŸ, ืื‘ืœ ืžืžื ื• ื ื™ืชืŸ ืœืœืžื•ื“ ืฉื›ื“ื™ ืœื‘ืฆืข ืืช ืฉืœื‘ ื”ื”ืชืงื ื” ื”ืจืืฉื•ืŸ, ืฆืจื™ืš ืœื”ื•ืจื™ื“ ืืช Docker Desktop (ืœ-Mac ืื• Windows).

Docker Hub ื”ื•ื ื‘ืขืจืš ืื•ืชื• ื“ื‘ืจ ื›ืžื• GitHub ืขื‘ื•ืจ ืžืื’ืจื™ git, ืื• ืจื™ืฉื•ื Npm ืขื‘ื•ืจ ื—ื‘ื™ืœื•ืช JavaScript. ื–ื”ื• ืžืื’ืจ ืžืงื•ื•ืŸ ืœืชืžื•ื ื•ืช Docker. ืœื–ื” ืžืชื—ื‘ืจ Docker Desktop.

ืื– ื›ื“ื™ ืœื”ืชื—ื™ืœ ืขื Docker, ืืชื” ืฆืจื™ืš ืœืขืฉื•ืช ืฉื ื™ ื“ื‘ืจื™ื:

ืœืื—ืจ ืžื›ืŸ, ืืชื” ื™ื›ื•ืœ ืœื‘ื“ื•ืง ืื Docker CLI ืคื•ืขืœ ืขืœ ื™ื“ื™ ื”ืคืขืœืช ื”ืคืงื•ื“ื” ื”ื‘ืื” ื›ื“ื™ ืœื‘ื“ื•ืง ืืช ื’ืจืกืช Docker:

docker -v

ืœืื—ืจ ืžื›ืŸ, ื”ื™ื›ื ืก ืœ- Docker Hub ืขืœ ื™ื“ื™ ื”ื–ื ืช ืฉื ื”ืžืฉืชืžืฉ ื•ื”ืกื™ืกืžื” ืฉืœืš ื›ืืฉืจ ืชืชื‘ืงืฉ:

docker login

ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘-Docker, ืขืœื™ืš ืœื”ื‘ื™ืŸ ืืช ื”ืžื•ืฉื’ื™ื ืฉืœ ืชืžื•ื ื•ืช ื•ืžื›ื•ืœื•ืช.

โ–ืชืžื•ื ื•ืช

ืชืžื•ื ื” ื”ื™ื ืžืฉื”ื• ื›ืžื• ืฉืจื˜ื•ื˜ ืฉืžื›ื™ืœ ื”ื•ืจืื•ืช ืœื”ืจื›ื‘ืช ื”ืžื™ื›ืœ. ื–ื•ื”ื™ ืชืžื•ื ืช ืžืฆื‘ ื‘ืœืชื™ ื ื™ืชื ืช ืœืฉื™ื ื•ื™ ืฉืœ ืžืขืจื›ืช ื”ืงื‘ืฆื™ื ื•ื”ื”ื’ื“ืจื•ืช ืฉืœ ื”ื™ื™ืฉื•ื. ืžืคืชื—ื™ื ื™ื›ื•ืœื™ื ืœืฉืชืฃ ืชืžื•ื ื•ืช ื‘ืงืœื•ืช.

# ะ’ั‹ะฒะพะด ัะฒะตะดะตะฝะธะน ะพะฑะพ ะฒัะตั… ะพะฑั€ะฐะทะฐั…
docker images

ืคืงื•ื“ื” ื–ื• ืชื•ืฆื™ื ื˜ื‘ืœื” ืขื ื”ื›ื•ืชืจืช ื”ื‘ืื”:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

ืœืื—ืจ ืžื›ืŸ ื ืกืชื›ืœ ืขืœ ื›ืžื” ื“ื•ื’ืžืื•ืช ืฉืœ ืคืงื•ื“ื•ืช ื‘ืื•ืชื• ืคื•ืจืžื˜ - ืจืืฉื™ืช ื™ืฉ ืคืงื•ื“ื” ืขื ื”ืขืจื”, ื•ืื—ืจ ื›ืš ื“ื•ื’ืžื” ืœืžื” ืฉื”ื™ื ื™ื›ื•ืœื” ืœื”ื•ืฆื™ื.

โ–ืžื›ื•ืœื•ืช

ืงื•ื ื˜ื™ื™ื ืจ ื”ื•ื ื—ื‘ื™ืœืช ื”ืคืขืœื” ื”ืžื›ื™ืœื” ืืช ื›ืœ ื”ื“ืจื•ืฉ ืœื”ืคืขืœืช ื™ื™ืฉื•ื. ืืคืœื™ืงืฆื™ื” ื‘ื’ื™ืฉื” ื–ื• ืชืขื‘ื•ื“ ืชืžื™ื“ ืื•ืชื• ื”ื“ื‘ืจ, ืœืœื ืงืฉืจ ืœืชืฉืชื™ืช: ื‘ืกื‘ื™ื‘ื” ืžื‘ื•ื“ื“ืช ื•ื‘ืื•ืชื” ืกื‘ื™ื‘ื”. ื”ื ืงื•ื“ื” ื”ื™ื ืฉืžื•ืคืขื™ื ืฉืœ ืื•ืชื” ืชืžื•ื ื” ืžื•ืฉืงื™ื ื‘ืกื‘ื™ื‘ื•ืช ืฉื•ื ื•ืช.

# ะŸะตั€ะตั‡ะธัะปะตะฝะธะต ะฒัะตั… ะบะพะฝั‚ะตะนะฝะตั€ะพะฒ
docker ps -a
CONTAINER ID     IMAGE     COMMAND     CREATED     STATUS     PORTS     NAMES
---

โ–ืชื’ื™ื

ืชื’ ื”ื•ื ืื™ื ื“ื™ืงืฆื™ื” ืœื’ืจืกื” ืžืกื•ื™ืžืช ืฉืœ ืชืžื•ื ื”.

โ–ื”ืคื ื™ื” ืžื”ื™ืจื” ืœืคืงื•ื“ื•ืช Docker

ืœื”ืœืŸ ืกืงื™ืจื” ื›ืœืœื™ืช ืฉืœ ื›ืžื” ืคืงื•ื“ื•ืช Docker ื”ื ืคื•ืฆื•ืช.

ืงื‘ื•ืฆื”

ื”ึถืงืฉืึตืจ

ืืคืงื˜

ื‘ื ื™ื™ืช docker

ืชืžื•ื ื”

ื‘ื ื™ื™ืช ืชืžื•ื ื” ืžืชื•ืš Dockerfile

ืชื’ docker

ืชืžื•ื ื”

ืชื™ื•ื’ ืชืžื•ื ื”

ืชืžื•ื ื•ืช ืžืขื’ืŸ

ืชืžื•ื ื”

ืชืžื•ื ื•ืช ืจื™ืฉื•ื

ืžืขื’ืŸ ืœืจื•ืฅ

ืžื›ื•ืœื”

ื”ืคืขืœืช ืžื™ื›ืœ ื”ืžื‘ื•ืกืก ืขืœ ืชืžื•ื ื”

ืœื“ื—ื•ืฃ ื“ื•ืงืจ

ืชืžื•ื ื”

ื”ืขืœืืช ืชืžื•ื ื” ืœืจื™ืฉื•ื

ืžืฉื™ื›ืช ื“ื•ืงืจ

ืชืžื•ื ื”

ื˜ืขื™ื ืช ืชืžื•ื ื” ืžื”ืจื™ืฉื•ื

ืžืขื’ืŸ

ืžื›ื•ืœื”

ืจื™ืฉื•ื ืžื›ื•ืœื•ืช

ื’ื–ื ืžืขืจื›ืช docker

ืชืžื•ื ื”/ืžื™ื›ืœ

ื”ืกืจืช ืžื™ื›ืœื™ื ื•ืชืžื•ื ื•ืช ืฉืื™ื ื ื‘ืฉื™ืžื•ืฉ

โ–Dockerfile

ืื ื™ ื™ื•ื“ืข ืœื”ืคืขื™ืœ ื™ื™ืฉื•ื ื™ื™ืฆื•ืจ ืžืงื•ืžื™. ื™ืฉ ืœื™ ืชืฆื•ืจืช Webpack ืฉื ื•ืขื“ื” ืœื‘ื ื•ืช ืืคืœื™ืงืฆื™ื™ืช React ืžื•ื›ื ื”. ืœืื—ืจ ืžื›ืŸ, ื™ืฉ ืœื™ ืคืงื•ื“ื” ืฉืžืชื—ื™ืœื” ืฉืจืช ืžื‘ื•ืกืก Node.js ื‘ื™ืฆื™ืื” 5000. ื–ื” ื ืจืื” ื›ืžื• ื–ื”:

npm i         # ัƒัั‚ะฐะฝะพะฒะบะฐ ะทะฐะฒะธัะธะผะพัั‚ะตะน
npm run build # ัะฑะพั€ะบะฐ React-ะฟั€ะธะปะพะถะตะฝะธั
npm run start # ะทะฐะฟัƒัะบ Node-ัะตั€ะฒะตั€ะฐ

ื™ืฉ ืœืฆื™ื™ืŸ ืฉืื™ืŸ ืœื™ ืืคืœื™ืงืฆื™ื” ืœื“ื•ื’ืžื” ืœื—ื•ืžืจ ื–ื”. ืื‘ืœ ื›ืืŸ, ืขื‘ื•ืจ ื ื™ืกื•ื™ื™ื, ื›ืœ ื™ื™ืฉื•ื ืคืฉื•ื˜ ืฉืœ Node ื™ืชืื™ื.

ืขืœ ืžื ืช ืœื”ืฉืชืžืฉ ื‘ืžื™ื›ืœ, ืชืฆื˜ืจืš ืœืชืช ื”ื•ืจืื•ืช ืœ-Docker. ื–ื” ื ืขืฉื” ื‘ืืžืฆืขื•ืช ืงื•ื‘ืฅ ื‘ืฉื Dockerfile, ื”ืžืžื•ืงื ื‘ืกืคืจื™ื™ืช ื”ื‘ืกื™ืก ืฉืœ ื”ืคืจื•ื™ืงื˜. ื”ืงื•ื‘ืฅ ื”ื–ื”, ื‘ื”ืชื—ืœื”, ื ืจืื” ื“ื™ ืœื ืžื•ื‘ืŸ.

ืื‘ืœ ืžื” ืฉื”ื•ื ืžื›ื™ืœ ืจืง ืžืชืืจ, ืขื ืคืงื•ื“ื•ืช ืžื™ื•ื—ื“ื•ืช, ืžืฉื”ื• ื”ื“ื•ืžื” ืœื”ืงืžืช ืกื‘ื™ื‘ืช ืขื‘ื•ื“ื”. ื”ื ื” ื›ืžื” ืžื”ืคืงื•ื“ื•ืช ื”ืืœื”:

  • ืžืŸ - ืคืงื•ื“ื” ื–ื• ืžืชื—ื™ืœื” ืงื•ื‘ืฅ. ื”ื•ื ืžืฆื™ื™ืŸ ืืช ืชืžื•ื ืช ื”ื‘ืกื™ืก ืฉืขืœื™ื” ื‘ื ื•ื™ื” ื”ืžื›ื•ืœื”.
  • COPY - ื”ืขืชืงืช ืงื‘ืฆื™ื ืžืžืงื•ืจ ืžืงื•ืžื™ ืœืžื™ื›ืœ.
  • WORKDIR โ€” ื”ื’ื“ืจืช ืกืคืจื™ื™ืช ื”ืขื‘ื•ื“ื” ืขื‘ื•ืจ ื”ืคืงื•ื“ื•ืช ื”ื‘ืื•ืช.
  • ืœึธืจื•ึผืฅ - ื”ืคืขืœ ืคืงื•ื“ื•ืช.
  • ืœึทื—ืฉื‚ื•ึนืฃ โ€” ื”ื’ื“ืจื•ืช ื™ืฆื™ืื”.
  • ื ืงื•ื“ืช ื›ื ื™ืกื” - ืฆื™ื•ืŸ ื”ืคืงื•ื“ื” ืฉื™ืฉ ืœื‘ืฆืข.

Dockerfile ื™ื›ื•ืœ ืœื”ื™ืจืื•ืช ืžืฉื”ื• ื›ื–ื”:

# ะ—ะฐะณั€ัƒะทะธั‚ัŒ ะฑะฐะทะพะฒั‹ะน ะพะฑั€ะฐะท
FROM node:12-alpine

# ะกะบะพะฟะธั€ะพะฒะฐั‚ัŒ ั„ะฐะนะปั‹ ะธะท ั‚ะตะบัƒั‰ะตะน ะดะธั€ะตะบั‚ะพั€ะธะธ ะฒ ะดะธั€ะตะบั‚ะพั€ะธัŽ app/
COPY . app/

# ะ˜ัะฟะพะปัŒะทะพะฒะฐั‚ัŒ app/ ะฒ ั€ะพะปะธ ั€ะฐะฑะพั‡ะตะน ะดะธั€ะตะบั‚ะพั€ะธะธ
WORKDIR app/

# ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ะทะฐะฒะธัะธะผะพัั‚ะธ (ะบะพะผะฐะฝะดะฐ npm ci ะฟะพั…ะพะถะฐ npm i, ะฝะพ ะธัะฟะพะปัŒะทัƒะตั‚ัั ะดะปั ะฐะฒั‚ะพะผะฐั‚ะธะทะธั€ะพะฒะฐะฝะฝั‹ั… ัะฑะพั€ะพะบ)
RUN npm ci --only-production

# ะกะพะฑั€ะฐั‚ัŒ ะบะปะธะตะฝั‚ัะบะพะต React-ะฟั€ะธะปะพะถะตะฝะธะต ะดะปั ะฟั€ะพะดะฐะบัˆะฝะฐ
RUN npm run build

# ะŸั€ะพัะปัƒัˆะธะฒะฐั‚ัŒ ัƒะบะฐะทะฐะฝะฝั‹ะน ะฟะพั€ั‚
EXPOSE 5000

# ะ—ะฐะฟัƒัั‚ะธั‚ัŒ Node-ัะตั€ะฒะตั€
ENTRYPOINT npm run start

ื‘ื”ืชืื ืœืชืžื•ื ืช ื”ื‘ืกื™ืก ืฉืชื‘ื—ืจ, ื™ื™ืชื›ืŸ ืฉื™ื”ื™ื” ืขืœื™ืš ืœื”ืชืงื™ืŸ ืชืœื•ืช ื ื•ืกืคืช. ื”ืขื•ื‘ื“ื” ื”ื™ื ืฉื›ืžื” ืชืžื•ื ื•ืช ื‘ืกื™ืก (ื›ืžื• Node Alpine Linux) ื ื•ืฆืจื•ืช ื‘ืžื˜ืจื” ืœื”ืคื•ืš ืื•ืชืŸ ืœืงื•ืžืคืงื˜ื™ื•ืช ื›ื›ืœ ื”ืืคืฉืจ. ื›ืชื•ืฆืื” ืžื›ืš, ื™ื™ืชื›ืŸ ืฉืœื ื™ื”ื™ื• ืœื”ื ื—ืœืง ืžื”ืชื•ื›ื ื™ื•ืช ืฉืืชื” ืžืฆืคื”.

โ–ื‘ื ื™ื™ื”, ืชื™ื•ื’ ื•ื”ืคืขืœืช ื”ืžื›ื•ืœื”

ื”ืจื›ื‘ื” ืžืงื•ืžื™ืช ื•ื”ืฉืงื” ืฉืœ ื”ืžื›ื•ืœื” ื”ื™ื ืœืื—ืจ ืฉื™ืฉ ืœื ื• Dockerfile, ื”ืžืฉื™ืžื•ืช ื“ื™ ืคืฉื•ื˜ื•ืช. ืœืคื ื™ ืฉืืชื” ื“ื•ื—ืฃ ืืช ื”ืชืžื•ื ื” ืœ- Docker Hub, ืขืœื™ืš ืœื‘ื“ื•ืง ืื•ืชื” ื‘ืื•ืคืŸ ืžืงื•ืžื™.

โ–ื”ืจื›ื‘ื”

ืจืืฉื™ืช ืืชื” ืฆืจื™ืš ืœืืกื•ืฃ ืชืžื•ื ื”, ืฆื™ื•ืŸ ืฉื ื•ืœื—ืœื•ืคื™ืŸ, ืชื’ (ืื ืœื ืฆื•ื™ืŸ ืชื’, ื”ืžืขืจื›ืช ืชืงืฆื” ืื•ื˜ื•ืžื˜ื™ืช ืชื’ ืœืชืžื•ื ื” latest).

# ะกะฑะพั€ะบะฐ ะพะฑั€ะฐะทะฐ
docker build -t <image>:<tag> .

ืœืื—ืจ ื”ืคืขืœืช ืคืงื•ื“ื” ื–ื•, ืืชื” ื™ื›ื•ืœ ืœืจืื•ืช ืืช Docker ื‘ื•ื ื” ืืช ื”ืชืžื•ื ื”.

Sending build context to Docker daemon   2.88MB
Step 1/9 : FROM node:12-alpine
 ---> ...ะฒั‹ะฟะพะปะฝะตะฝะธะต ัั‚ะฐะฟะพะฒ ัะฑะพั€ะบะธ...
Successfully built 123456789123
Successfully tagged <image>:<tag>

ื”ื‘ื ื™ื™ื” ืขืฉื•ื™ื” ืœื”ื™ืžืฉืš ื›ืžื” ื“ืงื•ืช - ื”ื›ืœ ืชืœื•ื™ ื‘ื›ืžื” ืชืœื•ืช ื™ืฉ ืœืš. ืœืื—ืจ ื”ืฉืœืžืช ื”ื‘ื ื™ื™ื”, ืชื•ื›ืœ ืœื”ืคืขื™ืœ ืืช ื”ืคืงื•ื“ื” docker images ื•ื”ืกืชื›ืœ ืขืœ ื”ืชื™ืื•ืจ ืฉืœ ื”ืชืžื•ื ื” ื”ื—ื“ืฉื” ืฉืœืš.

REPOSITORY          TAG               IMAGE ID            CREATED              SIZE
<image>             latest            123456789123        About a minute ago   x.xxGB

โ–ื”ืฉืงื”

ื”ืชืžื•ื ื” ื ื•ืฆืจื”. ื–ื” ืื•ืžืจ ืฉืืชื” ื™ื›ื•ืœ ืœื”ืคืขื™ืœ ืงื•ื ื˜ื™ื™ื ืจ ื”ืžื‘ื•ืกืก ืขืœ ื–ื”. ื›ื™ ืื ื™ ืจื•ืฆื” ืœื”ื™ื•ืช ืžืกื•ื’ืœ ืœื’ืฉืช ืœืืคืœื™ืงืฆื™ื” ื”ืคื•ืขืœืช ื‘ืงื•ื ื˜ื™ื™ื ืจ ื‘ localhost:5000, ืื ื™, ื‘ืฆื“ ืฉืžืืœ ืฉืœ ื”ื–ื•ื’ 5000:5000 ื‘ืคืงื•ื“ื” ื”ื‘ืื” ืฉื”ื•ืชืงื ื” 5000. ื‘ืฆื“ ื™ืžื™ืŸ ื ืžืฆื ื™ืฆื™ืืช ื”ืžื›ื•ืœื•ืช.

# ะ—ะฐะฟัƒัะบ ั ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะตะผ ะปะพะบะฐะปัŒะฝะพะณะพ ะฟะพั€ั‚ะฐ 5000 ะธ ะฟะพั€ั‚ะฐ ะบะพะฝั‚ะตะนะฝะตั€ะฐ 5000
docker run -p 5000:5000 <image>:<tag>

ื›ืขืช ืœืื—ืจ ืฉื”ืžื›ืœ ื ื•ืฆืจ ื•ืคื•ืขืœ, ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืคืงื•ื“ื” docker ps ื›ื“ื™ ืœื”ืกืชื›ืœ ืขืœ ืžื™ื“ืข ืขืœ ืžื™ื›ืœ ื–ื” (ืื• ืฉืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืคืงื•ื“ื” docker ps -a, ืฉืžืฆื™ื’ ืžื™ื“ืข ืขืœ ื›ืœ ื”ืงื•ื ื˜ื™ื™ื ืจื™ื, ืœื ืจืง ืืœื” ื”ืคื•ืขืœื™ื).

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                    NAMES
987654321234        <image>             "/bin/sh -c 'npm runโ€ฆ"   6 seconds ago        Up 6 seconds                0.0.0.0:5000->5000/tcp   stoic_darwin

ืื ืืชื” ื”ื•ืœืš ืขื›ืฉื™ื• ืœื›ืชื•ื‘ืช localhost:5000 - ืืชื” ื™ื›ื•ืœ ืœืจืื•ืช ืขืžื•ื“ ืฉืœ ื™ื™ืฉื•ื ืคื•ืขืœ ืฉื ืจืื” ื‘ื“ื™ื•ืง ื›ืžื• ื”ื“ืฃ ืฉืœ ื™ื™ืฉื•ื ื”ืคื•ืขืœ ื‘ืกื‘ื™ื‘ืช ื™ื™ืฆื•ืจ.

โ–ืชื™ื•ื’ ื•ืคืจืกื•ื

ืขืœ ืžื ืช ืœื”ืฉืชืžืฉ ื‘ืื—ืช ืžื”ืชืžื•ื ื•ืช ืฉื ื•ืฆืจื• ื‘ืฉืจืช ื”ื™ื™ืฆื•ืจ, ืขืœื™ื ื• ืœื”ื™ื•ืช ืžืกื•ื’ืœื™ื ืœื”ื•ืจื™ื“ ืชืžื•ื ื” ื–ื• ืž- Docker Hub. ืžืฉืžืขื•ืช ื”ื“ื‘ืจ ื”ื™ื ืฉืชื—ื™ืœื” ืขืœื™ืš ืœื™ืฆื•ืจ ืžืื’ืจ ืขื‘ื•ืจ ื”ืคืจื•ื™ืงื˜ ื‘- Docker Hub. ืœืื—ืจ ืžื›ืŸ, ื™ื”ื™ื” ืœื ื• ืžืงื•ื ื‘ื• ื ื•ื›ืœ ืœืฉืœื•ื— ืืช ื”ืชืžื•ื ื”. ื™ืฉ ืœืฉื ื•ืช ืืช ืฉืžื” ืฉืœ ื”ืชืžื•ื ื” ื›ืš ืฉืฉืžื” ื™ืชื—ื™ืœ ื‘ืฉื ื”ืžืฉืชืžืฉ ืฉืœื ื• ื‘- Docker Hub. ืื—ืจื™ ื–ื” ืฆืจื™ืš ืœื”ื™ื•ืช ืฉื ื”ืžืื’ืจ. ื ื™ืชืŸ ืœืžืงื ื›ืœ ืชื’ ื‘ืกื•ืฃ ื”ืฉื. ืœื”ืœืŸ ื“ื•ื’ืžื” ืœืžืชืŸ ืฉืžื•ืช ืœืชืžื•ื ื•ืช ื‘ืืžืฆืขื•ืช ืกื›ื™ืžื” ื–ื•.

ืขื›ืฉื™ื• ืืชื” ื™ื›ื•ืœ ืœื‘ื ื•ืช ืืช ื”ืชืžื•ื ื” ืขื ืฉื ื—ื“ืฉ ื•ืœื”ืคืขื™ืœ ืืช ื”ืคืงื•ื“ื” docker push ื›ื“ื™ ืœื“ื—ื•ืฃ ืื•ืชื• ืœืžืื’ืจ Docker Hub.

docker build -t <username>/<repository>:<tag> .
docker tag <username>/<repository>:<tag> <username>/<repository>:latest
docker push <username>/<repository>:<tag>

# ะะฐ ะฟั€ะฐะบั‚ะธะบะต ัั‚ะพ ะผะพะถะตั‚ ะฒั‹ะณะปัะดะตั‚ัŒ, ะฝะฐะฟั€ะธะผะตั€, ั‚ะฐะบ:
docker build -t user/app:v1.0.0 .
docker tag user/app:v1.0.0 user/app:latest
docker push user/app:v1.0.0

ืื ื”ื›ืœ ื™ืœืš ื›ืฉื•ืจื”, ื”ืชืžื•ื ื” ืชื”ื™ื” ื–ืžื™ื ื” ื‘- Docker Hub ื•ื ื™ืชืŸ ืœื”ืขืœื•ืช ืื•ืชื” ื‘ืงืœื•ืช ืœืฉืจืช ืื• ืœื”ืขื‘ื™ืจ ืื•ืชื” ืœืžืคืชื—ื™ื ืื—ืจื™ื.

ื”ืฉืœื‘ื™ื ื”ื‘ืื™ื

ืขื“ ืขื›ืฉื™ื• ืื™ืžืชื ื• ืฉื”ืืคืœื™ืงืฆื™ื”, ื‘ืฆื•ืจื” ืฉืœ ืงื•ื ื˜ื™ื™ื ืจ Docker, ืคื•ืขืœืช ื‘ืื•ืคืŸ ืžืงื•ืžื™. ื”ืขืœื™ื ื• ืืช ื”ืงื•ื ื˜ื™ื™ื ืจ ืœ- Docker Hub. ื›ืœ ื–ื” ืื•ืžืจ ืฉื›ื‘ืจ ื”ืชืงื“ืžื ื• ืžืื•ื“ ืœืงืจืืช ื”ืžื˜ืจื” ืฉืœื ื•. ื›ืขืช ืขืœื™ื ื• ืœืคืชื•ืจ ืฉืชื™ ืฉืืœื•ืช ื ื•ืกืคื•ืช:

  • ื”ื’ื“ืจืช ื›ืœื™ CI ืœื‘ื“ื™ืงื” ื•ืคืจื™ืกื” ืฉืœ ืงื•ื“.
  • ื”ื’ื“ืจืช ืฉืจืช ื”ื™ื™ืฆื•ืจ ื›ืš ืฉื™ื•ื›ืœ ืœื”ื•ืจื™ื“ ื•ืœื”ืคืขื™ืœ ืืช ื”ืงื•ื“ ืฉืœื ื•.

ื‘ืžืงืจื” ืฉืœื ื•, ืื ื—ื ื• ืžืฉืชืžืฉื™ื ื˜ืจื•ื•ื™ืก CI. ื‘ืชื•ืจ ืฉืจืช - ื“ื™ื˜ื™ื’ืœ ืื•ืฉืŸ.

ื™ืฉ ืœืฆื™ื™ืŸ ื›ื™ ื›ืืŸ ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ืฉื™ืœื•ื‘ ืื—ืจ ืฉืœ ืฉื™ืจื•ืชื™ื. ืœื“ื•ื’ืžื”, ื‘ืžืงื•ื Travis CI, ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘-CircleCI ืื• ื‘-Github Actions. ื•ื‘ืžืงื•ื DigitalOcean - AWS ืื• Linode.

ื”ื—ืœื˜ื ื• ืœืขื‘ื•ื“ ืขื Travis CI, ื•ื›ื‘ืจ ื™ืฉ ืœื™ ืžืฉื”ื• ืžื•ื’ื“ืจ ื‘ืฉื™ืจื•ืช ื”ื–ื”. ืœื›ืŸ, ืขื›ืฉื™ื• ืื“ื‘ืจ ื‘ืงืฆืจื” ืขืœ ืื™ืš ืœื”ื›ื™ืŸ ืื•ืชื• ืœืขื‘ื•ื“ื”.

ื˜ืจื•ื•ื™ืก CI

Travis CI ื”ื•ื ื›ืœื™ ืœื‘ื“ื™ืงื” ื•ืคืจื™ืกื” ืฉืœ ืงื•ื“. ืœื ื”ื™ื™ืชื™ ืจื•ืฆื” ืœื”ื™ื›ื ืก ืœืžื•ืจื›ื‘ื•ืช ืฉืœ ื”ืงืžืช Travis CI, ืฉื›ืŸ ื›ืœ ืคืจื•ื™ืงื˜ ื”ื•ื ื™ื™ื—ื•ื“ื™, ื•ื–ื” ืœื ื™ื‘ื™ื ื”ืจื‘ื” ืชื•ืขืœืช. ืื‘ืœ ืื ื™ ืื›ืกื” ืืช ื”ื™ืกื•ื“ื•ืช ื›ื“ื™ ืœื”ืชื—ื™ืœ ื‘ืขื‘ื•ื“ื” ืื ืชื—ืœื™ื˜ ืœื”ืฉืชืžืฉ ื‘-Travis CI. ื‘ื™ืŸ ืื ืชื‘ื—ืจื• ื‘-Travis CI, CircleCI, Jenkins ืื• ืžืฉื”ื• ืื—ืจ, ืฉื™ื˜ื•ืช ืชืฆื•ืจื” ื“ื•ืžื•ืช ื™ืฉืžืฉื• ื‘ื›ืœ ืžืงื•ื.

ื›ื“ื™ ืœื”ืชื—ื™ืœ ืขื Travis CI, ืขื‘ื•ืจ ืืœ ืืชืจ ื”ืคืจื•ื™ืงื˜ ื•ืœื™ืฆื•ืจ ื—ืฉื‘ื•ืŸ. ืœืื—ืจ ืžื›ืŸ ืฉืœื‘ ืืช Travis CI ืขื ื—ืฉื‘ื•ืŸ GitHub ืฉืœืš. ื‘ืขืช ื”ื’ื“ืจืช ื”ืžืขืจื›ืช, ื™ื”ื™ื” ืขืœื™ืš ืœืฆื™ื™ืŸ ืืช ื”ืžืื’ืจ ืื™ืชื• ืชืจืฆื” ืœื”ืคื•ืš ืืช ื”ืขื‘ื•ื“ื” ืœืื•ื˜ื•ืžื˜ื™ ื•ืœืืคืฉืจ ื’ื™ืฉื” ืืœื™ื•. (ืื ื™ ืžืฉืชืžืฉ ื‘-GitHub, ืื‘ืœ ืื ื™ ื‘ื˜ื•ื— ืฉ-Travis CI ื™ื›ื•ืœ ืœื”ืฉืชืœื‘ ืขื BitBucket, ื•-GitLab ื•ืฉื™ืจื•ืชื™ื ื“ื•ืžื™ื ืื—ืจื™ื).

ื‘ื›ืœ ืคืขื ืฉ-Travis CI ืžื•ืคืขืœ, ื”ืฉืจืช ืžื•ืคืขืœ, ืชื•ืš ื‘ื™ืฆื•ืข ื”ืคืงื•ื“ื•ืช ื”ืžืฆื•ื™ื ื•ืช ื‘ืงื•ื‘ืฅ ื”ืชืฆื•ืจื”, ื›ื•ืœืœ ืคืจื™ืกืช ืขื ืคื™ ื”ืžืื’ืจ ื”ืžืชืื™ืžื™ื.

โ–ืžื—ื–ื•ืจ ื—ื™ื™ื ืฉืœ ืขื‘ื•ื“ื”

ืงื•ื‘ืฅ ื”ืชืฆื•ืจื” ืฉืœ Travis CI ื ืงืจื .travis.yml ื•ืžืื•ื—ืกืŸ ื‘ืกืคืจื™ื™ืช ื”ืฉื•ืจืฉ ืฉืœ ื”ืคืจื•ื™ืงื˜, ืชื•ืžืš ื‘ืงื•ื ืกืคื˜ ืฉืœ ืื™ืจื•ืขื™ื ืžืขื’ืœ ื”ื—ื™ื™ื ืžืฉื™ืžื•ืช. ืื™ืจื•ืขื™ื ืืœื” ืจืฉื•ืžื™ื ืœืคื™ ืกื“ืจ ื”ืชืจื—ืฉื•ืชื:

  • apt addons
  • cache components
  • before_install
  • install
  • before_script
  • script
  • before_cache
  • after_success ะธะปะธ after_failure
  • before_deploy
  • deploy
  • after_deploy
  • after_script

โ–ื‘ื“ื™ืงื•ืช

ื‘ืงื•ื‘ืฅ ื”ืชืฆื•ืจื” ืื ื™ ื”ื•ืœืš ืœื”ื’ื“ื™ืจ ืืช ืฉืจืช Travis CI ื”ืžืงื•ืžื™. ื‘ื—ืจืชื™ ื‘-Node 12 ื›ืฉืคื” ื•ืืžืจืชื™ ืœืžืขืจื›ืช ืœื”ืชืงื™ืŸ ืืช ื”ืชืœื•ืช ื”ื ื“ืจืฉืช ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘-Docker.

ื›ืœ ืžื” ืฉืจืฉื•ื ื‘ .travis.yml, ื™ื‘ื•ืฆืข ื›ืืฉืจ ื›ืœ ื‘ืงืฉื•ืช ื”ืžืฉื™ื›ื” ื™ื‘ื•ืฆืขื• ืœื›ืœ ื”ืกื ื™ืคื™ื ืฉืœ ื”ืžืื’ืจ, ืืœื ืื ืฆื•ื™ืŸ ืื—ืจืช. ื–ื•ื”ื™ ืชื›ื•ื ื” ืฉื™ืžื•ืฉื™ืช ื›ื™ ื–ื” ืื•ืžืจ ืฉืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื‘ื“ื•ืง ืืช ื›ืœ ื”ืงื•ื“ ืฉื ื›ื ืก ืœืžืื’ืจ. ื–ื” ืžืืคืฉืจ ืœืš ืœื“ืขืช ืื ื”ืงื•ื“ ืžื•ื›ืŸ ืœื”ื™ื›ืชื‘ ืœืกื ื™ืฃ. master, ื•ื”ืื ื–ื” ื™ืฉื‘ื•ืจ ืืช ืชื”ืœื™ืš ื‘ื ื™ื™ืช ื”ืคืจื•ื™ืงื˜. ื‘ืชืฆื•ืจื” ื”ื’ืœื•ื‘ืœื™ืช ื”ื–ื•, ืื ื™ ืžืชืงื™ืŸ ื”ื›ืœ ื‘ืื•ืคืŸ ืžืงื•ืžื™, ืžืจื™ืฅ ืืช ืฉืจืช ื”ืคื™ืชื•ื— ืฉืœ Webpack ื‘ืจืงืข (ื–ื•ื”ื™ ืชื›ื•ื ื” ืฉืœ ื–ืจื™ืžืช ื”ืขื‘ื•ื“ื” ืฉืœื™), ื•ืžื‘ืฆืข ื‘ื“ื™ืงื•ืช.

ืื ืืชื” ืจื•ืฆื” ืฉื”ืžืื’ืจ ืฉืœืš ื™ืฆื™ื’ ืชื’ื™ื ื”ืžืฆื™ื™ื ื™ื ื›ื™ืกื•ื™ ื‘ื“ื™ืงื”, ื›ืืŸ ืชื•ื›ืœ ืœืžืฆื•ื ื”ื•ืจืื•ืช ืงืฆืจื•ืช ืœืฉื™ืžื•ืฉ ื‘-Jest, Travis CI ื•ืกืจื‘ืœ ืœืื™ืกื•ืฃ ื•ืœื”ืฆื’ื” ืฉืœ ืžื™ื“ืข ื–ื”.

ืื– ื”ื ื” ืชื•ื›ืŸ ื”ืงื•ื‘ืฅ .travis.yml:

# ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ัะทั‹ะบ
language: node_js

# ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ะฒะตั€ัะธัŽ Node.js
node_js:
  - '12'

services:
  # ะ˜ัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะบะพะผะฐะฝะดะฝัƒัŽ ัั‚ั€ะพะบัƒ Docker
  - docker

install:
  # ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ะทะฐะฒะธัะธะผะพัั‚ะธ ะดะปั ั‚ะตัั‚ะพะฒ
  - npm ci

before_script:
  # ะ—ะฐะฟัƒัั‚ะธั‚ัŒ ัะตั€ะฒะตั€ ะธ ะบะปะธะตะฝั‚ ะดะปั ั‚ะตัั‚ะพะฒ
  - npm run dev &

script:
  # ะ—ะฐะฟัƒัั‚ะธั‚ัŒ ั‚ะตัั‚ั‹
  - npm run test

ื›ืืŸ ืžืกืชื™ื™ืžื•ืช ื”ืคืขื•ืœื•ืช ืฉืžืชื‘ืฆืขื•ืช ืขื‘ื•ืจ ื›ืœ ืขื ืคื™ ื”ืžืื’ืจ ื•ืขื‘ื•ืจ ื‘ืงืฉื•ืช ืžืฉื™ื›ื”.

โ– ืคืจื™ืกื”

ื‘ื”ืชื‘ืกืก ืขืœ ื”ื”ื ื—ื” ืฉื›ืœ ื”ื‘ื“ื™ืงื•ืช ื”ืื•ื˜ื•ืžื˜ื™ื•ืช ื”ืกืชื™ื™ืžื• ื‘ื”ืฆืœื—ื”, ืื ื—ื ื• ื™ื›ื•ืœื™ื, ื•ื–ื” ืื•ืคืฆื™ื•ื ืœื™, ืœืคืจื•ืก ืืช ื”ืงื•ื“ ืœืฉืจืช ื”ื™ื™ืฆื•ืจ. ืžื›ื™ื•ื•ืŸ ืฉืื ื• ืจื•ืฆื™ื ืœืขืฉื•ืช ื–ืืช ืจืง ืขื‘ื•ืจ ืงื•ื“ ืžื”ืกื ื™ืฃ master, ืื ื• ื ื•ืชื ื™ื ืœืžืขืจื›ืช ื”ื•ืจืื•ืช ืžืชืื™ืžื•ืช ื‘ื”ื’ื“ืจื•ืช ื”ืคืจื™ืกื”. ืœืคื ื™ ืฉืชื ืกื” ืœื”ืฉืชืžืฉ ื‘ืงื•ื“ ืฉื ืกืชื›ืœ ืขืœื™ื• ื‘ืฉืœื‘ ื”ื‘ื ื‘ืคืจื•ื™ืงื˜ ืฉืœืš, ื‘ืจืฆื•ื ื™ ืœื”ื–ื”ื™ืจ ืื•ืชืš ืฉื—ื™ื™ื‘ ืœื”ื™ื•ืช ืœืš ืกืงืจื™ืคื˜ ืืžื™ืชื™ ืฉื ืงืจื ืœืคืจื™ืกื”.

deploy:
  # ะกะพะฑั€ะฐั‚ัŒ Docker-ะบะพะฝั‚ะตะนะฝะตั€ ะธ ะพั‚ะฟั€ะฐะฒะธั‚ัŒ ะตะณะพ ะฝะฐ Docker Hub
  provider: script
  script: bash deploy.sh
  on:
    branch: master

ืกืงืจื™ืคื˜ ื”ืคืจื™ืกื” ืคื•ืชืจ ืฉืชื™ ื‘ืขื™ื•ืช:

  • ื‘ื ื•, ืชื™ื™ื’ื• ื•ืฉืœื—ื• ืืช ื”ืชืžื•ื ื” ืœ- Docker Hub ื‘ืืžืฆืขื•ืช ื›ืœื™ CI (ื‘ืžืงืจื” ืฉืœื ื•, Travis CI).
  • ื˜ืขื™ื ืช ื”ืชืžื•ื ื” ืขืœ ื”ืฉืจืช, ืขืฆื™ืจืช ื”ืงื•ื ื˜ื™ื™ื ืจ ื”ื™ืฉืŸ ื•ื”ืชื—ืœืช ืงื•ื ื˜ื™ื™ื ืจ ื—ื“ืฉ (ื‘ืžืงืจื” ืฉืœื ื•, ื”ืฉืจืช ืคื•ืขืœ ืขืœ ืคืœื˜ืคื•ืจืžืช DigitalOcean).

ืจืืฉื™ืช, ืขืœื™ืš ืœื”ื’ื“ื™ืจ ืชื”ืœื™ืš ืื•ื˜ื•ืžื˜ื™ ืœื‘ื ื™ื™ื”, ืชื™ื•ื’ ื•ื“ื—ื™ืคืช ื”ืชืžื•ื ื” ืœ- Docker Hub. ื›ืœ ื–ื” ื“ื•ืžื” ืžืื•ื“ ืœืžื” ืฉื›ื‘ืจ ืขืฉื™ื ื• ื‘ืื•ืคืŸ ื™ื“ื ื™, ืคืจื˜ ืœื›ืš ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื ืืกื˜ืจื˜ื’ื™ื” ืœื”ืงืฆืืช ืชื’ื™ื ื™ื™ื—ื•ื“ื™ื™ื ืœืชืžื•ื ื•ืช ื•ืื•ื˜ื•ืžืฆื™ื” ืฉืœ ื›ื ื™ืกื•ืช. ื”ื™ื” ืœื™ ืงื•ืฉื™ ืขื ื›ืžื” ืคืจื˜ื™ื ืฉืœ ืกืงืจื™ืคื˜ ื”ืคืจื™ืกื”, ื›ื’ื•ืŸ ืืกื˜ืจื˜ื’ื™ื™ืช ืชื™ื•ื’, ื›ื ื™ืกื”, ืงื™ื“ื•ื“ ืžืคืชื— SSH, ื™ืฆื™ืจืช ื—ื™ื‘ื•ืจ SSH. ืื‘ืœ ืœืžื–ืœื™ ื”ื—ื‘ืจ ืฉืœื™ ื˜ื•ื‘ ืžืื•ื“ ืขื bash, ื›ืžื• ืขื ื”ืจื‘ื” ื“ื‘ืจื™ื ืื—ืจื™ื. ื”ื•ื ืขื–ืจ ืœื™ ืœื›ืชื•ื‘ ืืช ื”ืชืกืจื™ื˜ ื”ื–ื”.

ืื–, ื”ื—ืœืง ื”ืจืืฉื•ืŸ ืฉืœ ื”ืชืกืจื™ื˜ ื”ื•ื ื”ืขืœืืช ื”ืชืžื•ื ื” ืœ- Docker Hub. ื–ื” ื“ื™ ืงืœ ืœืขืฉื•ืช. ืกื›ื™ืžืช ื”ืชื™ื•ื’ ืฉื‘ื” ื”ืฉืชืžืฉืชื™ ื›ื•ืœืœืช ืฉื™ืœื•ื‘ ืฉืœ git hash ื•ืชื’ git, ืื ืงื™ื™ื ื›ื–ื”. ื–ื” ืžื‘ื˜ื™ื— ืฉื”ืชื’ ื”ื•ื ื™ื™ื—ื•ื“ื™ ื•ืžืงืœ ืขืœ ื–ื™ื”ื•ื™ ื”ืžื›ืœื•ืœ ืฉืขืœื™ื• ื”ื•ื ืžื‘ื•ืกืก. DOCKER_USERNAME ะธ DOCKER_PASSWORD ื”ื ืžืฉืชื ื™ ืกื‘ื™ื‘ืช ืžืฉืชืžืฉ ืฉื ื™ืชืŸ ืœื”ื’ื“ื™ืจ ื‘ืืžืฆืขื•ืช ืžืžืฉืง Travis CI. Travis CI ื™ืขื‘ื“ ืื•ื˜ื•ืžื˜ื™ืช ื ืชื•ื ื™ื ืจื’ื™ืฉื™ื ื›ื“ื™ ืฉืœื ื™ื™ืคืœื• ืœื™ื“ื™ื™ื ื”ืœื ื ื›ื•ื ื•ืช.

ื”ื ื” ื”ื—ืœืง ื”ืจืืฉื•ืŸ ืฉืœ ื”ืชืกืจื™ื˜ deploy.sh.

#!/bin/sh
set -e # ะžัั‚ะฐะฝะพะฒะธั‚ัŒ ัะบั€ะธะฟั‚ ะฟั€ะธ ะฝะฐะปะธั‡ะธะธ ะพัˆะธะฑะพะบ

IMAGE="<username>/<repository>"                             # ะžะฑั€ะฐะท Docker
GIT_VERSION=$(git describe --always --abbrev --tags --long) # Git-ั…ััˆ ะธ ั‚ะตะณะธ

# ะกะฑะพั€ะบะฐ ะธ ั‚ะตะณะธั€ะพะฒะฐะฝะธะต ะพะฑั€ะฐะทะฐ
docker build -t ${IMAGE}:${GIT_VERSION} .
docker tag ${IMAGE}:${GIT_VERSION} ${IMAGE}:latest

# ะ’ั…ะพะด ะฒ Docker Hub ะธ ะฒั‹ะณั€ัƒะทะบะฐ ะพะฑั€ะฐะทะฐ
echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
docker push ${IMAGE}:${GIT_VERSION}

ืžื” ื™ื”ื™ื” ื”ื—ืœืง ื”ืฉื ื™ ืฉืœ ื”ืกืงืจื™ืคื˜ ืชืœื•ื™ ืœื—ืœื•ื˜ื™ืŸ ื‘ืื™ื–ื” ืžืืจื— ืืชื” ืžืฉืชืžืฉ ื•ืื™ืš ื”ื—ื™ื‘ื•ืจ ืืœื™ื• ืžืื•ืจื’ืŸ. ื‘ืžืงืจื” ืฉืœื™, ืžื›ื™ื•ื•ืŸ ืฉืื ื™ ืžืฉืชืžืฉ ื‘-Digital Ocean, ืื ื™ ืžืฉืชืžืฉ ื‘ืคืงื•ื“ื•ืช ื›ื“ื™ ืœื”ืชื—ื‘ืจ ืœืฉืจืช doctl. ื‘ืขืช ืขื‘ื•ื“ื” ืขื AWS, ื›ืœื™ ื”ืฉื™ืจื•ืช ื™ืฉืžืฉ aws, ื•ื›ืŸ ื”ืœืื”.

ื”ื’ื“ืจืช ื”ืฉืจืช ืœื ื”ื™ื™ืชื” ืงืฉื” ื‘ืžื™ื•ื—ื“. ืื–, ื”ืงืžืชื™ ื˜ื™ืคื” ืขืœ ืกืžืš ืชืžื•ื ืช ื”ื‘ืกื™ืก. ื™ืฉ ืœืฆื™ื™ืŸ ืฉื”ืžืขืจื›ืช ืฉื‘ื—ืจืชื™ ื“ื•ืจืฉืช ื”ืชืงื ื” ื™ื“ื ื™ืช ื—ื“ ืคืขืžื™ืช ืฉืœ Docker ื•ื”ืฉืงื” ื™ื“ื ื™ืช ื—ื“ ืคืขืžื™ืช ืฉืœ Docker. ื”ืฉืชืžืฉืชื™ ื‘ืื•ื‘ื•ื ื˜ื• 18.04 ื›ื“ื™ ืœื”ืชืงื™ืŸ ืืช Docker, ืื– ืื ืืชื” ื’ื ืžืฉืชืžืฉ ื‘ืื•ื‘ื•ื ื˜ื• ื›ื“ื™ ืœืขืฉื•ืช ืืช ืื•ืชื• ื”ื“ื‘ืจ, ืืชื” ื™ื›ื•ืœ ืคืฉื•ื˜ ืœืขืงื•ื‘ ื–ื” ืžื“ืจื™ืš ืคืฉื•ื˜.

ืื ื™ ืœื ืžื“ื‘ืจ ื›ืืŸ ืขืœ ืคืงื•ื“ื•ืช ืกืคืฆื™ืคื™ื•ืช ืœืฉื™ืจื•ืช, ืžื›ื™ื•ื•ืŸ ืฉื”ื™ื‘ื˜ ื–ื” ื™ื›ื•ืœ ืœื”ืฉืชื ื•ืช ืžืื•ื“ ื‘ืžืงืจื™ื ืฉื•ื ื™ื. ืื ื™ ืจืง ืืชืŸ ืชื•ื›ื ื™ืช ืคืขื•ืœื” ื›ืœืœื™ืช ืฉืชืชื‘ืฆืข ืœืื—ืจ ื”ืชื—ื‘ืจื•ืช ื‘ืืžืฆืขื•ืช SSH ืœืฉืจืช ืขืœื™ื• ื™ืชืคืจืก ื”ืคืจื•ื™ืงื˜:

  • ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœืžืฆื•ื ืืช ื”ืžื›ื•ืœื” ืฉืคื•ืขืœืช ื›ืจื’ืข ื•ืœืขืฆื•ืจ ืื•ืชื”.
  • ืื– ืืชื” ืฆืจื™ืš ืœื”ืคืขื™ืœ ืžื™ื›ืœ ื—ื“ืฉ ื‘ืจืงืข.
  • ื™ื”ื™ื” ืขืœื™ืš ืœื”ื’ื“ื™ืจ ืืช ื”ื™ืฆื™ืื” ื”ืžืงื•ืžื™ืช ืฉืœ ื”ืฉืจืช ืœ 80 - ื–ื” ื™ืืคืฉืจ ืœืš ืœื”ื™ื›ื ืก ืœืืชืจ ื‘ื›ืชื•ื‘ืช ื›ืžื• example.com, ืžื‘ืœื™ ืœืฆื™ื™ืŸ ืืช ื”ื™ืฆื™ืื”, ื‘ืžืงื•ื ืœื”ืฉืชืžืฉ ื‘ื›ืชื•ื‘ืช ื›ืžื• example.com:5000.
  • ืœื‘ืกื•ืฃ, ืขืœื™ืš ืœืžื—ื•ืง ืืช ื›ืœ ื”ืžื›ื•ืœื•ืช ื•ื”ืชืžื•ื ื•ืช ื”ื™ืฉื ื•ืช.

ื”ื ื” ื”ืžืฉืš ื”ืชืกืจื™ื˜.

# ะะฐะนั‚ะธ ID ั€ะฐะฑะพั‚ะฐัŽั‰ะตะณะพ ะบะพะฝั‚ะตะนะฝะตั€ะฐ
CONTAINER_ID=$(docker ps | grep takenote | cut -d" " -f1)

# ะžัั‚ะฐะฝะพะฒะธั‚ัŒ ัั‚ะฐั€ั‹ะน ะบะพะฝั‚ะตะนะฝะตั€, ะทะฐะฟัƒัั‚ะธั‚ัŒ ะฝะพะฒั‹ะน, ะพั‡ะธัั‚ะธั‚ัŒ ัะธัั‚ะตะผัƒ
docker stop ${CONTAINER_ID}
docker run --restart unless-stopped -d -p 80:5000 ${IMAGE}:${GIT_VERSION}
docker system prune -a -f

ื›ืžื” ื“ื‘ืจื™ื ืฉืฆืจื™ืš ืœืฉื™ื ืœื‘ ืืœื™ื”ื

ื™ืชื›ืŸ ืฉื›ืฉืชืชื—ื‘ืจ ืœืฉืจืช ื“ืจืš SSH ืž-Travis CI ืชืจืื” ืื–ื”ืจื” ืฉืชืžื ืข ืžืžืš ืœื”ืžืฉื™ืš ื‘ื”ืชืงื ื” ืฉื›ืŸ ื”ืžืขืจื›ืช ืชื—ื›ื” ืœืชื’ื•ื‘ืช ื”ืžืฉืชืžืฉ.

The authenticity of host '<hostname> (<IP address>)' can't be established.
RSA key fingerprint is <key fingerprint>.
Are you sure you want to continue connecting (yes/no)?

ืœืžื“ืชื™ ืฉื ื™ืชืŸ ืœืงื•ื“ื“ ืžืคืชื— ืžื—ืจื•ื–ืช ื‘-base64 ืขืœ ืžื ืช ืœืฉืžื•ืจ ืื•ืชื• ื‘ืฆื•ืจื” ืฉื‘ื” ื ื™ืชืŸ ืœืขื‘ื•ื“ ืื™ืชื• ื‘ืฆื•ืจื” ื ื•ื—ื” ื•ืืžื™ื ื”. ื‘ืฉืœื‘ ื”ื”ืชืงื ื”, ื ื™ืชืŸ ืœืคืขื ื— ืืช ื”ืžืคืชื— ื”ืฆื™ื‘ื•ืจื™ ื•ืœื›ืชื•ื‘ ืื•ืชื• ืœืงื•ื‘ืฅ known_hosts ืขืœ ืžื ืช ืœื”ื™ืคื˜ืจ ืžื”ืฉื’ื™ืื” ืœืขื™ืœ.

echo <public key> | base64 # ะฒั‹ะฒะพะดะธั‚ <ะฟัƒะฑะปะธั‡ะฝั‹ะน ะบะปัŽั‡, ะทะฐะบะพะดะธั€ะพะฒะฐะฝะฝั‹ะน ะฒ base64>

ื‘ืคื•ืขืœ, ืคืงื•ื“ื” ื–ื• ืขืฉื•ื™ื” ืœื”ื™ืจืื•ืช ื›ืš:

echo "123.45.67.89 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== [email protected]" | base64

ื•ื”ื ื” ืžื” ืฉื”ื•ื ืžื™ื™ืฆืจ - ืžื—ืจื•ื–ืช ืžืงื•ื“ื“ืช base64:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

ื”ื ื” ื”ืคืงื•ื“ื” ืฉื”ื•ื–ื›ืจื” ืœืžืขืœื”

install:
  - echo < ะฟัƒะฑะปะธั‡ะฝั‹ะน ะบะปัŽั‡, ะทะฐะบะพะดะธั€ะพะฒะฐะฝะฝั‹ะน ะฒ base64> | base64 -d >> $HOME/.ssh/known_hosts

ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ืื•ืชื” ื’ื™ืฉื” ืขื ืžืคืชื— ืคืจื˜ื™ ื‘ืขืช ื™ืฆื™ืจืช ื—ื™ื‘ื•ืจ, ืฉื›ืŸ ื™ื™ืชื›ืŸ ืฉืชื–ื“ืงืง ืœืžืคืชื— ืคืจื˜ื™ ื›ื“ื™ ืœื’ืฉืช ืœืฉืจืช. ื›ืฉืืชื” ืขื•ื‘ื“ ืขื ื”ืžืคืชื—, ืืชื” ืจืง ืฆืจื™ืš ืœื•ื•ื“ื ืฉื”ื•ื ืžืื•ื—ืกืŸ ื‘ืฆื•ืจื” ืžืื•ื‘ื˜ื—ืช ื‘ืžืฉืชื ื” ืกื‘ื™ื‘ืช Travis CI ื•ืฉื”ื•ื ืœื ื™ื•ืฆื’ ื‘ืฉื•ื ืžืงื•ื.

ื“ื‘ืจ ื ื•ืกืฃ ืฉื™ืฉ ืœืฆื™ื™ืŸ ื”ื•ื ืฉื™ื™ืชื›ืŸ ืฉืชืฆื˜ืจืš ืœื”ืจื™ืฅ ืืช ื›ืœ ืกืงืจื™ืคื˜ ื”ืคืจื™ืกื” ื›ืฉื•ืจื” ืื—ืช, ืœืžืฉืœ - ืขื doctl. ื–ื” ืขืฉื•ื™ ืœื“ืจื•ืฉ ืžืืžืฅ ื ื•ืกืฃ.

doctl compute ssh <droplet> --ssh-command "ะฒัะต ะบะพะผะฐะฝะดั‹ ะฑัƒะดัƒั‚ ะทะดะตััŒ && ะทะดะตััŒ"

TLS/SSL ื•ืื™ื–ื•ืŸ ืขื•ืžืกื™ื

ืื—ืจื™ ืฉืขืฉื™ืชื™ ืืช ื›ืœ ืžื” ืฉื”ื•ื–ื›ืจ ืœืขื™ืœ, ื”ื‘ืขื™ื” ื”ืื—ืจื•ื ื” ืฉื ืชืงืœืชื™ ื‘ื” ื”ื™ื™ืชื” ืฉืœืฉืจืช ืœื ื”ื™ื” SSL. ืžืื– ืื ื™ ืžืฉืชืžืฉ ื‘ืฉืจืช Node.js, ืขืœ ืžื ืช ืœื”ื›ืจื™ื— ั€ะฐะฑะพั‚ะฐั‚ัŒ ืคืจื•ืงืกื™ ื”ืคื•ืš Nginx ื•-Let's Encrypt, ืืชื” ืฆืจื™ืš ืœื”ืชืขืกืง ื”ืจื‘ื”.

ืžืžืฉ ืœื ืจืฆื™ืชื™ ืœืขืฉื•ืช ืืช ื›ืœ ืชืฆื•ืจืช ื”-SSL ื”ื–ื• ื‘ืื•ืคืŸ ื™ื“ื ื™, ืื– ืคืฉื•ื˜ ื™ืฆืจืชื™ ืžืื–ืŸ ืขื•ืžืกื™ื ื•ืจืฉืžืชื™ ืืช ื”ืคืจื˜ื™ื ืฉืœื• ื‘-DNS. ื‘ืžืงืจื” ืฉืœ DigitalOcean, ืœืžืฉืœ, ื™ืฆื™ืจืช ืชืขื•ื“ื” ื‘ื—ืชื™ืžื” ืขืฆืžื™ืช ืœื—ื™ื“ื•ืฉ ืื•ื˜ื•ืžื˜ื™ ืขืœ ืžืื–ืŸ ื”ืขื•ืžืก ื”ื™ื ื”ืœื™ืš ืคืฉื•ื˜, ื—ื™ื ืžื™ ื•ืžื”ื™ืจ. ืœื’ื™ืฉื” ื–ื• ื™ืชืจื•ืŸ ื ื•ืกืฃ ืฉื”ื™ื ืžืงืœื” ืžืื•ื“ ืขืœ ื”ื’ื“ืจืช SSL ื‘ืžืกืคืจ ืฉืจืชื™ื ื”ืคื•ืขืœื™ื ืžืื—ื•ืจื™ ืžืื–ืŸ ืขื•ืžืกื™ื ื‘ืžื™ื“ืช ื”ืฆื•ืจืš. ื–ื” ืžืืคืฉืจ ืœืฉืจืชื™ื ืขืฆืžื ืœื "ืœื—ืฉื•ื‘" ืขืœ SSL ื‘ื›ืœืœ, ืื‘ืœ ื‘ืื•ืชื• ื–ืžืŸ ืœื”ืฉืชืžืฉ ื‘ืคื•ืจื˜ ื›ืจื’ื™ืœ 80. ืื– ื”ื’ื“ืจืช SSL ืขืœ ืื™ื–ื•ืŸ ืขื•ืžืกื™ื ื”ื™ื ื”ืจื‘ื” ื™ื•ืชืจ ืงืœื” ื•ื ื•ื—ื” ืžืฉื™ื˜ื•ืช ื—ืœื•ืคื™ื•ืช ืœื”ื’ื“ืจืช SSL.

ื›ืขืช ื ื™ืชืŸ ืœืกื’ื•ืจ ืืช ื›ืœ ื”ืคื•ืจื˜ื™ื ื‘ืฉืจืช ืฉืžืงื‘ืœื™ื ื—ื™ื‘ื•ืจื™ื ื ื›ื ืกื™ื - ืžืœื‘ื“ ื”ืคื•ืจื˜ 80, ืžืฉืžืฉ ืœืชืงืฉื•ืจืช ืขื ืžืื–ืŸ ื”ืขื•ืžืก ื•ื”ื™ืฆื™ืื” 22 ืขื‘ื•ืจ SSH. ื›ืชื•ืฆืื” ืžื›ืš, ื ื™ืกื™ื•ืŸ ืœื’ืฉืช ื™ืฉื™ืจื•ืช ืœืฉืจืช ื‘ื™ืฆื™ืื•ืช ืื—ืจื•ืช ืžืœื‘ื“ ืฉืชื™ ืืœื” ื™ื™ื›ืฉืœ.

ืชื•ืฆืื•ืช ืฉืœ

ืื—ืจื™ ืฉืขืฉื™ืชื™ ืืช ื›ืœ ืžื” ืฉื“ื™ื‘ืจืชื™ ืขืœื™ื• ื‘ื—ื•ืžืจ ื”ื–ื”, ืœื ื”ืคืœื˜ืคื•ืจืžื” ืฉืœ Docker ื•ืœื ื”ืžื•ืฉื’ื™ื ืฉืœ ืจืฉืชื•ืช CI/CD ืื•ื˜ื•ืžื˜ื™ื•ืช ื”ืคื—ื™ื“ื• ืื•ืชื™ ื™ื•ืชืจ. ื”ืฆืœื—ืชื™ ืœื”ื’ื“ื™ืจ ืฉืจืฉืจืช ืื™ื ื˜ื’ืจืฆื™ื” ืจืฆื™ืคื”, ืฉื‘ืžื”ืœื›ื” ื ื‘ื“ืง ื”ืงื•ื“ ืœืคื ื™ ืฉื”ื•ื ื ื›ื ืก ืœื™ื™ืฆื•ืจ ื•ื”ืงื•ื“ ื ืคืจืก ืื•ื˜ื•ืžื˜ื™ืช ื‘ืฉืจืช. ื›ืœ ื–ื” ืขื“ื™ื™ืŸ ื—ื“ืฉ ื™ื—ืกื™ืช ืขื‘ื•ืจื™, ื•ืื ื™ ื‘ื˜ื•ื— ืฉื™ืฉ ื“ืจื›ื™ื ืœืฉืคืจ ืืช ื–ืจื™ืžืช ื”ืขื‘ื•ื“ื” ื”ืื•ื˜ื•ืžื˜ื™ืช ืฉืœื™ ื•ืœื”ืคื•ืš ืื•ืชื” ืœื™ืขื™ืœื” ื™ื•ืชืจ. ืื– ืื ื™ืฉ ืœืš ืจืขื™ื•ื ื•ืช ื‘ืขื ื™ื™ืŸ ื”ื–ื”, ืื ื ื”ื•ื“ืข ืœื™. ืœื™ ืœึธื“ึทืขึทืช. ืื ื™ ืžืงื•ื•ื” ืฉืžืืžืจ ื–ื” ืขื–ืจ ืœืš ื‘ืžืืžืฆื™ืš. ืื ื™ ืจื•ืฆื” ืœื”ืืžื™ืŸ ืฉืื—ืจื™ ืฉืงืจืืช ืื•ืชื•, ืœืžื“ืช ื”ืจื‘ื” ื›ืžื• ืฉืื ื™ ืœืžื“ืชื™ ืชื•ืš ื›ื“ื™ ื”ื‘ื ืช ื›ืœ ืžื” ืฉื“ื™ื‘ืจืชื™ ืขืœื™ื•.

ื .ื‘. ืฉืœื ื• ื–ื™ืจืช ืžืกื—ืจ ื™ืฉ ืชืžื•ื ื” ืกึทื•ึธืจ, ืฉื ื™ืชืŸ ืœื”ืชืงื™ืŸ ื‘ืงืœื™ืง ืื—ื“. ื ื™ืชืŸ ืœื‘ื“ื•ืง ืืช ืคืขื•ืœืช ื”ืžื›ื•ืœื•ืช ื‘ื›ืชื•ื‘ืช VPS. ื›ืœ ื”ืœืงื•ื—ื•ืช ื”ื—ื“ืฉื™ื ืžืงื‘ืœื™ื 3 ื™ืžื™ ื‘ื“ื™ืงื” ืœืœื ืชืฉืœื•ื.

ืงื•ืจืื™ื ื™ืงืจื™ื! ื”ืื ืืชื” ืžืฉืชืžืฉ ื‘ื˜ื›ื ื•ืœื•ื’ื™ื•ืช CI/CD ื‘ืคืจื•ื™ืงื˜ื™ื ืฉืœืš?

ื™ืฆื™ืจืช ืฉืจืฉืจืช CI/CD ื•ืื•ื˜ื•ืžืฆื™ื” ืฉืœ ืขื‘ื•ื“ื” ืขื Docker

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”