αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžαŸ’αžŸαŸ‚αžŸαž„αŸ’αžœαžΆαž€αŸ‹ CI/CD αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž‡αžΆαž˜αž½αž™ Docker

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαžšαžŸαŸαžšαž‚αŸαž αž‘αŸ†αž–αŸαžšαžŠαŸ†αž”αžΌαž„αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž“αŸ…αž…αž»αž„αž‘αžŸαžœαžαŸ’αžŸαžšαŸαž‘αžΈ 90 αŸ” αž“αŸ…αž–αŸαž›αž“αŸ„αŸ‡ αžœαžΆαž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŽαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž½αž€αžœαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αž›αŸ†αžŠαžΆαž”αŸ‹αž€αžΆαžšαž„αžΆαžšαŸ” αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ Apache αž“αŸ…αž›αžΎαž€αžΆαžšαž”αž„αŸ’αž αŸ„αŸ‡αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž˜αž½αž™αž…αŸ†αž“αž½αž“ αž’αŸ’αž“αž€αž’αžΆαž…αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž“αŸαŸ‡αžαžΆαž˜αžšαž™αŸˆ FTP αžŠαŸ„αž™αžŸαžšαžŸαŸαžšαž’αŸ’αžœαžΈαž˜αž½αž™αžŠαžΌαž…αž‡αžΆ ftp://ftp.example.com. αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž‰αŸ’αž…αžΌαž›αžˆαŸ’αž˜αŸ„αŸ‡ αž“αž·αž„αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž αžΎαž™αž•αŸ’αž‘αž»αž€αž―αž€αžŸαžΆαžšαž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ” αž˜αžΆαž“αž–αŸαž›αžαž»αžŸαž‚αŸ’αž“αžΆ αž’αŸ’αžœαžΈαŸ—αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αž‡αžΆαž„αž–αŸαž›αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αŸ”

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžαŸ’αžŸαŸ‚αžŸαž„αŸ’αžœαžΆαž€αŸ‹ CI/CD αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž‡αžΆαž˜αž½αž™ Docker

αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž–αžΈαžšαž‘αžŸαžœαžαŸ’αžŸαžšαŸαž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž–αŸαž›αž“αŸ„αŸ‡αž˜αž€ αž’αŸ’αžœαžΈαŸ—αž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž…αŸ’αžšαžΎαž“αŸ” αž‚αŸαž αž‘αŸ†αž–αŸαžšαž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸ’αž˜αž»αž‚αŸ’αžšαžŸαŸ’αž˜αžΆαž‰ αž–αž½αž€αžœαžΆαžαŸ’αžšαžΌαžœαžαŸ‚αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αž˜αž»αž“αž–αŸαž›αž…αŸαž‰αž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž•αž›αž·αžαž€αž˜αŸ’αž˜αŸ” αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžαŸ‚αž˜αž½αž™αž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‘αŸ…αž‡αžΆαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž–αžΈαž€αŸ’αžšαŸ„αž™αž€αžΆαžšαž•αŸ’αž‘αž»αž€αžαž»αž›αŸ’αž™αž—αžΆαž– αž αžΎαž™αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αŸ†αžŽαŸ‚αž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‡αžΆαžšαžΏαž„αž’αž˜αŸ’αž˜αžαžΆαŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž–αž·αžŸαŸαžŸαŸ” αž αžΎαž™β€‹αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αžŠαžΉαž„β€‹αžαžΆβ€‹αžαŸ’αž‰αž»αŸ†β€‹αžαŸ’αžšαžΌαžœβ€‹αž€αžΆαžšβ€‹αžŸαž˜αžαŸ’αžαž—αžΆαž–β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αžŠαžΆαž€αŸ‹β€‹αž–αž„αŸ’αžšαžΆαž™β€‹αž‚αŸαž αž‘αŸ†αž–αŸαžšβ€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž•αž›αž·αžβ€‹αžŠαŸ„αž™β€‹αž’αž“αž»αžœαžαŸ’αžβ€‹αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–β€‹αžαŸ‚β€‹αž˜αž½αž™β€‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ– αž€αžΆαžšβ€‹αžŸαžšαžŸαŸαžšβ€‹αž€αžΌαžŠβ€‹αž‘αŸ…β€‹αžŸαžΆαžαžΆ master αž“αŸ…αž›αžΎ GitHub αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αž αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŠαžΉαž„αžαžΆ αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“αžΆαž”αžΆαž“αž“αžΌαžœαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αžŽαŸ’αžŠαžΆαž‰αžαžΌαž…αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž…αž„αŸ‹αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž…αž„αŸ’αž€αŸ„αž˜ Kubernetes αžŠαŸαž’αŸ† αž¬αž”αŸ’αžšαžΎαž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆ Docker Swarm αž¬αžšαž€αŸ’αžŸαžΆαž€αŸ’αžšαž»αž˜αž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŠαŸ‚αž›αž˜αžΆαž“αž•αž αž—αŸ’αž“αžΆαž€αŸ‹αž„αžΆαžš αž“αž·αž„αž‚αŸ’αžšαž”αŸ‹αž”αŸ’αžšαž—αŸαž‘αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαžŸαž˜αŸ’αžšαŸαž…αž”αžΆαž“αž“αžΌαžœαž‚αŸ„αž›αžŠαŸ…αž“αŸƒαž€αžΆαžšαž’αŸ’αžœαžΎαž±αŸ’αž™αž€αžΆαžšαž„αžΆαžšαž˜αžΆαž“αž—αžΆαž–αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžαžΆαž˜αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž”αžΆαž“ αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαžŸαŸ’αž‚αžΆαž›αŸ‹ CI/CD αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αžΆαž“αž‚αž˜αŸ’αžšαŸ„αž„αžαžΌαž…αž˜αž½αž™ (αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž‚αž˜αŸ’αžšαŸ„αž„ Node.js) αž αžΎαž™αž’αŸ’αž“αž€αž…αž„αŸ‹αžŠαžΉαž„αž–αžΈαžšαž”αŸ€αž”αž’αŸ’αžœαžΎαžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜αž“αŸƒαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‚αž˜αŸ’αžšαŸ„αž„αž“αŸαŸ‡ αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž’αžΆαž“αžΆαžαžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž“αžΉαž„αž’αŸ’αžœαžΈαžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž•αž›αž·αžαž€αž˜αŸ’αž˜ αž“αŸ„αŸ‡αžαŸ’αž‰αž»αŸ† αž‚αž·αžαžαžΆαž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž“αžΉαž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αŸ”

αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž‡αžΆαž˜αž»αž“

αž’αŸ’αž“αž€αž’αžΆαž“αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžšαŸ†αž–αžΉαž„αžαžΆαž“αžΉαž„αž˜αžΆαž“αž€αžΆαžšαž™αž›αŸ‹αžŠαžΉαž„αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž’αŸ†αž–αžΈαž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ αž“αž·αž„αž€αžΆαžšαžŸαžšαžŸαŸαžšαž’αž€αŸ’αžŸαžš Bash αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αžαž‚αžΆαžαŸ‹αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž‚αžŽαž“αžΈ Travis CI ΠΈ αžŠαž»αž€αž‘αŸαžšαž αžΆαž”αŸ‹.

αž‚αŸ„αž›αž”αŸ†αžŽαž„

αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž˜αž·αž“αž“αž·αž™αžΆαž™αžαžΆαž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆ "αž€αžΆαžšαž”αž„αŸ’αžšαŸ€αž“" αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž‘αŸαŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž―αž€αžŸαžΆαžšαž‡αžΆαž…αŸ’αžšαžΎαž“αž‘αŸ€αžαžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžšαŸ€αž“ αž“αž·αž„αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ‚αž›αžŸαžΆαž€αžŸαž˜αž“αžΉαž„αžαŸ’αž‰αž»αŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž αž“αž·αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αžΌαžŠαž‘αŸ…αž€αžΆαž“αŸ‹αž€αžΆαžšαž•αž›αž·αž αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž€αŸ’αž“αž»αž„αž›αž·αžαž·αžαž†αŸ’αž›αž„αžŠαŸ‚αž“αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž˜αž½αž™αŸ”

αž“αŸαŸ‡αž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž›αŸ†αž αžΌαžšαž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž›αŸαžαž€αžΌαžŠαžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž αŸ„αŸ‡αž‘αŸ…αž€αžΆαž“αŸ‹αžŸαžΆαžαžΆαžƒαŸ’αž›αžΆαŸ†αž„αžŽαžΆαž˜αž½αž™ αž›αžΎαž€αž›αŸ‚αž„αžαŸ‚ master, αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αž:

  • αž‚αž˜αŸ’αžšαŸ„αž„αžŸαžΆαž„αžŸαž„αŸ‹αž“αŸ…αž›αžΎ Travis CI αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αŸ”
  • αžšαžΆαž›αŸ‹αž―αž€αžαžΆ αž€αžΆαžšαž’αŸ’αžœαžΎαžŸαž˜αžΆαž αžšαžŽαž€αž˜αŸ’αž˜ αž“αž·αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž–αžΈαž…αž»αž„αžŠαž›αŸ‹αž…αž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ‚αž›αŸαžαž€αžΌαžŠαžŠαŸ‚αž›αž’αŸ’αž›αžΆαž€αŸ‹αž…αžΌαž› master, αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜:

  • αž’αŸ’αžœαžΈβ€‹αž‚αŸ’αžšαž”αŸ‹β€‹αž™αŸ‰αžΆαž„β€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αžšαŸ€αž”αžšαžΆαž”αŸ‹β€‹αžαžΆαž„β€‹αž›αžΎβ€‹, αž”αžΌαž€ ...
  • αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– Docker αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž€αžΌαžŠ αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ αž“αž·αž„αž”αžšαž·αžŸαŸ’αžαžΆαž“αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αŸ”
  • αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžšαžΌαž”αž—αžΆαž–αž‘αŸ… Docker Hub αŸ”
  • αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž•αž›αž·αžαž€αž˜αŸ’αž˜αŸ”
  • αž€αŸ†αž–αž»αž„αž”αž„αŸ’αž αŸ„αŸ‡αžšαžΌαž”αž—αžΆαž–αž–αžΈ Docker Hub αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ”
  • αž€αžΆαžšαž”αž‰αŸ’αžˆαž”αŸ‹αž€αž»αž„αžαžΊαž“αŸαžšαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ αž“αž·αž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžαŸ’αž˜αžΈαž˜αž½αž™αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžšαžΌαž”αž—αžΆαž–αžαŸ’αž˜αžΈαŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αž·αž“αžŠαžΉαž„αž’αŸ’αžœαžΈαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž’αŸ†αž–αžΈ Docker αžšαžΌαž”αž—αžΆαž– αž“αž·αž„αž€αž»αž„αžαžΊαž“αŸαžš αž€αž»αŸ†αž”αžΆαžšαž˜αŸ’αž—αŸ” αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αŸ’αž“αžΆαž’αŸ†αž–αžΈαžœαžΆαŸ”

តើ CI/CD αž‡αžΆαž’αŸ’αžœαžΈ?

αž’αž€αŸ’αžŸαžšαž€αžΆαžαŸ‹ CI/CD αžαŸ†αžŽαžΆαž„αž±αŸ’αž™ "αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹ / αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹" αŸ”

▍ αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‚αžΊαž‡αžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž’αŸ’αžœαžΎαž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž…αŸ†αž–αŸ„αŸ‡αžƒαŸ’αž›αžΆαŸ†αž„αž€αžΌαžŠαž”αŸ’αžšαž—αž–αžŸαŸ†αžαžΆαž“αŸ‹αžšαž”αžŸαŸ‹αž‚αž˜αŸ’αžšαŸ„αž„ (αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαžŸαžΆαžαžΆαž˜αž½αž™ master) αž‘αž“αŸ’αž‘αžΉαž˜αž“αžΉαž„αž“αŸαŸ‡αž‚αž»αžŽαž—αžΆαž–αž“αŸƒαž›αŸαžαž€αžΌαžŠαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αžΆαž“αžΆαžαžΆαž˜αžšαž™αŸˆαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αŸ”

▍ αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‡αžΆαž”αž“αŸ’αžαž‚αžΊαž‡αžΆαž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αžΌαžœαž€αžΌαžŠαž‘αŸ…αž€αŸ’αž“αž»αž„αž•αž›αž·αžαž€αž˜αŸ’αž˜αž‰αžΉαž€αž‰αžΆαž”αŸ‹αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈαž–αžΈαžšαž“αŸƒαž’αž€αŸ’αžŸαžšαž€αžΆαžαŸ‹ CI/CD αž–αŸαž›αžαŸ’αž›αŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαžαžΆαž‡αžΆ "αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž”αž“αŸ’αž"αŸ” αž“αŸαŸ‡αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αžΉαž„ "αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž”αž“αŸ’αž" αž”αŸ‰αž»αž“αŸ’αžαŸ‚ "αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž”αž“αŸ’αž" αž”αž„αŸ’αž€αž”αŸ‹αž“αŸαž™αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŠαŸ„αž™αžŠαŸƒαž˜αž»αž“αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‚αž˜αŸ’αžšαŸ„αž„αŸ”

αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž’αŸ’αž›αžΆαž”αŸ‹αžšαŸ€αž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆ αž€αžαŸ‹αž…αŸ†αžŽαžΆαŸ†. αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž‚αž˜αŸ’αžšαŸ„αž„αž‚αŸαž αž‘αŸ†αž–αŸαžšαžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž€αŸ†αž–αž»αž„αž’αŸ’αžœαžΎαž€αžΆαžš αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž…αž“αžΆαž‘αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžαŸ‹αžαŸ’αžšαžΆαŸ” αžŠαŸ†αž”αžΌαž„αžαŸ’αž‰αž»αŸ†αž–αŸ’αž™αžΆαž™αžΆαž˜αž’αŸ’αžœαžΎ JAMStack-project αž¬αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ front-end αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“ server αžŠαžΎαž˜αŸ’αž”αžΈαž‘αžΆαž‰αž™αž€αž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž–αžΈαžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš hosting αž“αž·αž„ project deployment capabilities αžŠαŸ‚αž›αžœαžΆαž•αŸ’αžαž›αŸ‹αž‡αžΌαž“ Netlify. αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αžΎαž“αž‘αžΎαž„ αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž•αŸ’αž“αŸ‚αž€αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžšαž”αžŸαŸ‹αžœαžΆ αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸαž™αžαžΆαžαŸ’αž‰αž»αŸ†αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαžαž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· αž“αž·αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αŸ”

αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αžΊαž‡αžΆαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ Express αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αžŸαŸ’αžαžΆαž“ Node.js αž”αž˜αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React αž‘αŸ†αž–αŸαžšαžαŸ‚αž˜αž½αž™ αž“αž·αž„αž‚αžΆαŸ†αž‘αŸ’αžš API αž…αŸ†αž αŸ€αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŠαŸ‚αž›αž˜αžΆαž“αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αŸ” αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž“αŸαŸ‡αž’αŸ’αžœαžΎαžαžΆαž˜αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžšαŸ’αžαžŠαŸ‚αž›αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž“αŸ…αž€αŸ’αž“αž»αž„ αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™ αž˜αž‚αŸ’αž‚αž»αž‘αŸ’αž‘αŸαžŸαž€αŸαž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž‡αž„αŸ‹αž–αŸαž‰αž›αŸαž‰αŸ”

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž–αž·αž‚αŸ’αžšαŸ„αŸ‡αž‡αžΆαž˜αž½αž™ αž˜αž·αžαŸ’αžαž—αž€αŸ’αžαž·αžŠαŸ‚αž›αž‡αžΆαž’αŸ’αž“αž€αž‡αŸ†αž“αžΆαž‰αž•αŸ’αž“αŸ‚αž€αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜ αž αžΎαž™αž”αžΆαž“αžŸαž½αžšαž‚αžΆαžαŸ‹αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎ αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΌαž…αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž”αžΆαž“αŸ” αž‚αžΆαžαŸ‹αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αžαŸ’αž‰αž»αŸ†αž“αžΌαžœαž‚αŸ†αž“αž·αžαž“αŸƒαž›αŸ†αž αžΌαžšαž€αžΆαžšαž„αžΆαžšαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž‚αž½αžšαž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αžšαŸ€αž”αžšαžΆαž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž‚αŸ„αž›αžŠαŸ…αž“αŸƒαž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αŸ” αž€αžΆαžšαž˜αžΆαž“αž‚αŸ„αž›αžŠαŸ…αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž˜αžΆαž“αž“αŸαž™αžαžΆαžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ Docker αŸ”

Dockers

Docker αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αž’αžšαž‚αž»αžŽαž…αŸ†αž–αŸ„αŸ‡αž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆ containerization αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸ‚αž€αž…αžΆαž™αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž”αžšαž·αž™αžΆαž€αžΆαžŸαžŠαžΌαž…αž‚αŸ’αž“αžΆ αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαžœαŸαž‘αž·αž€αžΆ Docker αžαŸ’αž›αž½αž“αžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž”αžšαž·αžŸαŸ’αžαžΆαž“αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž€αŸαžŠαŸ„αž™αŸ” αžŠαŸ†αž”αžΌαž„αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž™αž€αžŠαŸƒαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž“αŸ…αž›αžΎαž§αž”αž€αžšαžŽαŸαž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ Docker (CLI) αŸ” αžŸαŸαž…αž€αŸ’αžαžΈαžŽαŸ‚αž“αžΆαŸ† αž˜αž‚αŸ’αž‚αž»αž‘αŸ’αž‘αŸαžŸαž€αŸαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ Docker αž˜αž·αž“αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆαž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹ αž“αž·αž„αž’αžΆαž…αž™αž›αŸ‹αž”αžΆαž“αž“αŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž–αžΈαžœαžΆ αž’αŸ’αž“αž€αž’αžΆαž…αžšαŸ€αž“αžαžΆ αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž‡αŸ†αž αžΆαž“αžŠαŸ†αž‘αžΎαž„αžŠαŸ†αž”αžΌαž„ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž‘αžΆαž‰αž™αž€ Docker Desktop (αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Mac ឬ Windows)αŸ”

Docker Hub αž‚αžΊαž”αŸ’αžšαž αžΆαž€αŸ‹αž”αŸ’αžšαž αŸ‚αž›αž“αžΉαž„ GitHub αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ git repositories ឬ registry αž˜αŸ‰αŸ„αž„αž„αž„ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž‰αŸ’αž…αž”αŸ‹ 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

αžšαžΌαž”αž—αžΆαž–αŸ”

αž€αžΆαžšαž…αž»αŸ‡αž”αž‰αŸ’αž‡αžΈαžšαžΌαž”αž—αžΆαž–

αžšαžαŸ‹ docker

αž€αž»αž„αžαžΊαž“αŸαžš

αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž»αž„αžαžΊαž“αŸαžšαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžšαžΌαž”αž—αžΆαž–

αžšαž»αž‰ docker

αžšαžΌαž”αž—αžΆαž–αŸ”

αž€αžΆαžšαž”αž„αŸ’αž αŸ„αŸ‡αžšαžΌαž”αž—αžΆαž–αž‘αŸ…αž”αž‰αŸ’αž‡αžΈαžˆαŸ’αž˜αŸ„αŸ‡

docker αž‘αžΆαž‰

αžšαžΌαž”αž—αžΆαž–αŸ”

αž€αŸ†αž–αž»αž„αž•αŸ’αž‘αž»αž€αžšαžΌαž”αž—αžΆαž–αž–αžΈαž”αž‰αŸ’αž‡αžΈαžˆαŸ’αž˜αŸ„αŸ‡

docker ps

αž€αž»αž„αžαžΊαž“αŸαžš

αž€αžΆαžšαž…αž»αŸ‡αž”αž‰αŸ’αž‡αžΈαž’αž»αž„

αž”αŸ’αžšαž–αŸαž“αŸ’αž’ docker αž€αžΆαžαŸ‹αž…αŸαž‰

αžšαžΌαž”αž—αžΆαž–/αž€αž»αž„αžαžΊαž“αŸαžš

αž€αžΆαžšαžŠαž€αž’αž»αž„αž“αž·αž„αžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž˜αž·αž“αž”αŸ’αžšαžΎ

▍ Dockerfile

αžαŸ’αž‰αž»αŸ†αžŠαžΉαž„αž–αžΈαžšαž”αŸ€αž”αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž•αž›αž·αžαž€αž˜αŸ’αž˜αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€αŸ” αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ Webpack αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž…αž“αžΆαž‘αžΎαž„αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React αžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαŸ‚αž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŠαŸ‚αž›αž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž›αžΎ Node.js αž“αŸ…αž›αžΎαž…αŸ’αžšαž€ 5000. αžœαžΆαž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

npm i         # установка зависимостСй
npm run build # сборка React-прилоТСния
npm run start # запуск Node-сСрвСра

αžœαžΆαž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆαžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž˜αžΆαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž§αž‘αžΆαž αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαž˜αŸ’αž—αžΆαžšαŸˆαž“αŸαŸ‡αž‘αŸαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž–αž·αžŸαŸ„αž’αž“αŸ αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Node αžŸαžΆαž˜αž‰αŸ’αž‰αžŽαžΆαž˜αž½αž™αž“αžΉαž„αž’αŸ’αžœαžΎαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΎαž€αž»αž„αžαžΊαž“αŸαžš αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž•αŸ’αžαž›αŸ‹αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŠαž›αŸ‹ Docker αŸ” αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžαžΆαž˜αžšαž™αŸˆαž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž αŸ…αžαžΆ DockerfileαžŠαŸ‚αž›αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αžαžαž«αžŸαž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αŸ” αžŠαŸ†αž”αžΌαž„αž―αž€αžŸαžΆαžšαž“αŸαŸ‡αž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž˜αž·αž“αž’αžΆαž…αž™αž›αŸ‹αž”αžΆαž“αŸ”

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αŸ’αžœαžΈαžŠαŸ‚αž›αžœαžΆαž˜αžΆαž“αž–αžŽαŸŒαž“αžΆαžαŸ‚αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž–αž·αžŸαŸαžŸ αžŠαŸ‚αž›αžŸαŸ’αžšαžŠαŸ€αž„αž“αžΉαž„αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž”αžšαž·αž™αžΆαž€αžΆαžŸαž€αžΆαžšαž„αžΆαžšαŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ–

  • FROM - αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž―αž€αžŸαžΆαžšαŸ” αžœαžΆαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžšαžΌαž”αž—αžΆαž–αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžŠαŸ‚αž›αž’αž»αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžΆαž„αžŸαž„αŸ‹αŸ”
  • αž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„ - αž…αž˜αŸ’αž›αž„αž―αž€αžŸαžΆαžšαž–αžΈαž”αŸ’αžšαž—αž–αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€αž‘αŸ…αž€αž»αž„αžαžΊαž“αŸαžšαŸ”
  • 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 container αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αŸ” αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αž αŸ„αŸ‡αž€αž»αž„αžαžΊαž“αŸαžšαž‘αŸ… Docker Hub αŸ” αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž˜αžΆαž“αž“αŸαž™αžαžΆ αž–αž½αž€αž™αžΎαž„αž”αžΆαž“αžˆαžΆαž“αž‘αŸ…αž˜αž»αžαž™αŸ‰αžΆαž„αž›αŸ’αž’ αž†αŸ’αž–αŸ„αŸ‡αž‘αŸ…αžšαž€αž‚αŸ„αž›αžŠαŸ…αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αžαŸ’αžšαžΌαžœαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŸαŸ†αžŽαž½αžšαž–αžΈαžšαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαŸ–

  • αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž§αž”αž€αžšαžŽαŸ CI αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαžΆαž€αž›αŸ’αž”αž„ αž“αž·αž„αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αžΌαžŠαŸ”
  • αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž•αž›αž·αžαž€αž˜αŸ’αž˜αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αžœαžΆαž’αžΆαž…αž‘αžΆαž‰αž™αž€ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΌαžŠαžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αž™αžΎαž„αž”αŸ’αžšαžΎ Travis CI. αž‡αžΆαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ - αžŒαžΈαž‘αžΈαž αŸ’αž‚αžΆαž›αž˜αž αžΆαžŸαž˜αž»αž‘αŸ’αžš.

αžœαžΆαž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆαž“αŸ…αž‘αžΈαž“αŸαŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎαž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™ Travis CI αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎ CircleCI ឬ Github Actions αŸ” αž αžΎαž™αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™ DigitalOcean - AWS ឬ Linode αŸ”

αž™αžΎαž„αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ Travis CI αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž’αŸ’αžœαžΈαž˜αž½αž™αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžšαž½αž…αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αŸαŸ‡αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž₯αž‘αžΌαžœαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž“αž·αž™αžΆαž™αžŠαŸ„αž™αžŸαž„αŸ’αžαŸαž”αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžšαŸ€αž”αž…αŸ†αžœαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž„αžΆαžšαŸ”

Travis 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 dev αž€αŸ’αž“αž»αž„αž•αŸ’αž‘αŸƒαžαžΆαž„αž€αŸ’αžšαŸ„αž™ (αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž›αž€αŸ’αžαžŽαŸˆαž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†) αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αž„αŸ‹αž±αŸ’αž™αžƒαŸ’αž›αžΆαŸ†αž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αž„αŸ’αž αžΆαž‰αžšαžΌαž”αžαŸ†αžŽαžΆαž„αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αžŸαžΆαž€αž›αŸ’αž”αž„, αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αžšαž€αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžαŸ’αž›αžΈαŸ—αžŸαŸ’αžαžΈαž–αžΈαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ Jest, Travis CI αž“αž·αž„ Coveralls αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαž˜αžΌαž› αž“αž·αž„αž”αž„αŸ’αž αžΆαž‰αž–αŸαžαŸŒαž˜αžΆαž“αž“αŸαŸ‡αŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒαž―αž€αžŸαžΆαžš .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 key αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹ SSH αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αžŸαŸ†αžŽαžΆαž„β€‹αž›αŸ’αž’β€‹αžŠαŸ‚αž›β€‹αž˜αž·αžαŸ’αžβ€‹αž”αŸ’αžšαž»αžŸβ€‹αžšαž”αžŸαŸ‹β€‹αžαŸ’αž‰αž»αŸ†β€‹αž›αŸ’αž’β€‹αž‡αžΆαž˜αž½αž™β€‹αž“αžΉαž„ bash αžŠαžΌαž…β€‹αž“αžΉαž„β€‹αžšαžΏαž„β€‹αž‡αžΆβ€‹αž…αŸ’αžšαžΎαž“β€‹αž‘αŸ€αžαŸ” αž‚αžΆαžαŸ‹αž”αžΆαž“αž‡αž½αž™αžαŸ’αž‰αž»αŸ†αžŸαžšαžŸαŸαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž”αž“αŸαŸ‡αŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž•αŸ’αž“αŸ‚αž€αžŠαŸ†αž”αžΌαž„αž“αŸƒαžŸαŸ’αž‚αŸ’αžšαžΈαž”αž€αŸ†αž–αž»αž„αž•αŸ’αž‘αž»αž€αžšαžΌαž”αž—αžΆαž–αž‘αŸ… Docker Hub αŸ” αž“αŸαŸ‡αž–αž·αžαž‡αžΆαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž’αŸ’αžœαžΎαŸ” αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαžŠαžΆαž€αŸ‹αžŸαŸ’αž›αžΆαž€αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αŸ’αžšαžΎαž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž“αžΉαž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› git hash αž“αž·αž„ git tag αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“αŸ” αž“αŸαŸ‡αž’αžΆαž“αžΆαžαžΆαžŸαŸ’αž›αžΆαž€αž‚αžΊαž˜αžΆαž“αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹ αž“αž·αž„αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαžŠαŸ‚αž›αžœαžΆαž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αŸ” 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 αžαŸ’αž‰αž»αŸ†αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαžΎαž˜αŸ’αž”αžΈαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αž”αžŽαŸ’αžŒαž·αž. αž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ 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)?

αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αžšαŸ€αž“β€‹αžαžΆ string key αž’αžΆαž…β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž’αŸŠαž·αž“αž€αžΌαžŠβ€‹αž€αŸ’αž“αž»αž„ 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 αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœ tinker αž…αŸ’αžšαžΎαž“αŸ”

αžαŸ’αž‰αž»αŸ†αž–αž·αžαž‡αžΆαž˜αž·αž“αž…αž„αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ SSL αž“αŸαŸ‡αžŠαŸ„αž™αžŠαŸƒαž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž‘αžΎαž”αžαŸ‚αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαž»αž›αŸ’αž™αž—αžΆαž–αž”αž“αŸ’αž‘αž»αž€ αž“αž·αž„αž€αžαŸ‹αžαŸ’αžšαžΆαž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαžšαž”αžŸαŸ‹αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ DNS αŸ” αž§αž‘αžΆαž αžšαžŽαŸαž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈ DigitalOcean αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαžŠαŸ‚αž›αž…αž»αŸ‡αž αžαŸ’αžαž›αŸαžαžΆαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αžŠαŸ‚αž›αž”αž“αŸ’αžαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αŸ…αž›αžΎαž§αž”αž€αžšαžŽαŸαž•αŸ’αž‘αž»αž€αžαž»αž›αŸ’αž™αž—αžΆαž–αž‚αžΊαž‡αžΆαž“αžΈαžαž·αžœαž·αž’αžΈαžŸαžΆαž˜αž‰αŸ’αž‰ αž₯αžαž‚αž·αžαžαŸ’αž›αŸƒ αž“αž·αž„αž›αžΏαž“αŸ” αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡αž˜αžΆαž“αž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž”αž“αŸ’αžαŸ‚αž˜αžŠαŸ‚αž›αžœαžΆαž’αŸ’αžœαžΎαž±αŸ’αž™αž˜αžΆαž“αž—αžΆαž–αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ SSL αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž–αžΈαž€αŸ’αžšαŸ„αž™αž§αž”αž€αžšαžŽαŸαž•αŸ’αž‘αž»αž€αžαž»αž›αŸ’αž™αž—αžΆαž–αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ” αž“αŸαŸ‡αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžαŸ’αž›αž½αž“αž―αž„αž˜αž·αž“ "αž‚αž·αž" αž’αŸ†αž–αžΈ SSL αž‘αžΆαž›αŸ‹αžαŸ‚αžŸαŸ„αŸ‡ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αŸ’αž“αž»αž„αž–αŸαž›αžαŸ‚αž˜αž½αž™αž”αŸ’αžšαžΎαž…αŸ’αžšαž€αžŠαžΌαž…αž’αž˜αŸ’αž˜αžαžΆ 80. αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ SSL αž“αŸ…αž›αžΎ load balancer αž‚αžΊαž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž“αž·αž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž‡αžΆαž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αŸƒαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ SSL αŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αž”αž·αž‘αž…αŸ’αžšαž€αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŠαŸ‚αž›αž‘αž‘αž½αž›αž™αž€αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž…αžΌαž› - αž›αžΎαž€αž›αŸ‚αž„αžαŸ‚αž…αŸ’αžšαž€ 80αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž‘αžΆαž€αŸ‹αž‘αž„αž‡αžΆαž˜αž½αž™ Load Balancer αž“αž·αž„ Port 22 αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ SSH αŸ” αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αž€αžΆαžšαž–αŸ’αž™αžΆαž™αžΆαž˜αž…αžΌαž›αž”αŸ’αžšαžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸ…αž›αžΎαž…αŸ’αžšαž€αžŽαžΆαž˜αž½αž™αž€αŸ’αžšαŸ…αž–αžΈαž…αŸ’αžšαž€αž‘αžΆαŸ†αž„αž–αžΈαžšαž“αŸαŸ‡αž“αžΉαž„αž”αžšαžΆαž‡αŸαž™αŸ”

αž›αž‘αŸ’αž’αž•αž›

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž“αž·αž™αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαž˜αŸ’αž—αžΆαžšαŸˆαž“αŸαŸ‡ αž‘αžΆαŸ†αž„αžœαŸαž‘αž·αž€αžΆ Docker αž“αž·αž„αž‚αŸ†αž“αž·αžαž“αŸƒαžαŸ’αžŸαŸ‚αžŸαž„αŸ’αžœαžΆαž€αŸ‹ CI/CD αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž”αžΆαž“αž’αŸ’αžœαžΎαž±αŸ’αž™αžαŸ’αž‰αž»αŸ†αž—αŸαž™αžαŸ’αž›αžΆαž…αž‘αŸ€αžαž αžΎαž™αŸ” αžαŸ’αž‰αž»αŸ†αž’αžΆαž…αžšαŸ€αž”αž…αŸ†αžαŸ’αžŸαŸ‚αžŸαž„αŸ’αžœαžΆαž€αŸ‹αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹ αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αžŠαŸ‚αž›αž€αžΌαžŠαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžΆαž€αž›αŸ’αž”αž„ αž˜αž»αž“αž–αŸαž›αžœαžΆαž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αž›αž·αž αž αžΎαž™αž€αžΌαžŠαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ” αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž“αŸ…αžαŸ‚αžαŸ’αž˜αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ† αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž”αŸ’αžšαžΆαž€αžŠαžαžΆαž˜αžΆαž“αžœαž·αž’αžΈαžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ‚αž›αž˜αŸ’αž’αž›αŸ†αž αžΌαžšαž€αžΆαžšαž„αžΆαžšαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αž“αž·αž„αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αž”αŸ’αžšαžŸαž·αž“β€‹αž”αžΎβ€‹αž’αŸ’αž“αž€β€‹αž˜αžΆαž“β€‹αž‚αŸ†αž“αž·αžβ€‹αžŽαžΆβ€‹αž˜αž½αž™β€‹αž€αŸ’αž“αž»αž„β€‹αž”αž‰αŸ’αž αžΆβ€‹αž“αŸαŸ‡β€‹αžŸαžΌαž˜β€‹αž”αŸ’αžšαžΆαž”αŸ‹β€‹αžαŸ’αž‰αž»αŸ†β€‹αŸ” αž…αŸ†αž–αŸ„αŸ‡αžαŸ’αž‰αž»αŸ†αŸ” αžŠαžΉαž„αŸ” αžαŸ’αž‰αž»αŸ†αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž”αžΆαž“αž‡αž½αž™αž’αŸ’αž“αž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαžαž·αžαžαŸ†αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αžαŸ’αž‰αž»αŸ†β€‹αž…αž„αŸ‹β€‹αž‡αžΏβ€‹αžαžΆβ€‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž–αžΈβ€‹αž”αžΆαž“β€‹αž’αžΆαž“β€‹αžœαžΆ αž’αŸ’αž“αž€β€‹αž”αžΆαž“β€‹αžšαŸ€αž“β€‹αž…αŸ’αžšαžΎαž“β€‹αžŠαžΌαž…β€‹αžŠαŸ‚αž›β€‹αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αžšαŸ€αž“β€‹αžαžŽαŸˆβ€‹αž–αŸαž›β€‹αžŠαŸ‚αž›β€‹αžšαž€β€‹αžƒαžΎαž‰β€‹αž’αŸ’αžœαžΈβ€‹αž‚αŸ’αžšαž”αŸ‹β€‹αž™αŸ‰αžΆαž„β€‹αžŠαŸ‚αž›β€‹αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αž“αž·αž™αžΆαž™β€‹αž’αŸ†αž–αžΈβ€‹αžœαžΆβ€‹αŸ”

PS αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž”αžŸαŸ‹αž™αžΎαž„ αž‘αžΈαž•αŸ’αžŸαžΆαžš αž˜αžΆαž“αžšαžΌαž”αž—αžΆαž–αž˜αž½αž™αŸ” DockersαžŠαŸ‚αž›αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αžŠαŸ„αž™αž…αž»αž…αžαŸ‚αž˜αŸ’αžαž„αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸƒαž’αž»αž„αž“αŸ… αž€αžΆαžš VPS. αž’αžαž·αžαž·αž‡αž“αžαŸ’αž˜αžΈαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αžšαž™αŸˆαž–αŸαž› 3 αžαŸ’αž„αŸƒαžŠαŸ„αž™αž˜αž·αž“αž‚αž·αžαžαŸ’αž›αŸƒαŸ”

αž’αŸ’αž“αž€αž’αžΆαž“αž‡αžΆαž‘αžΈαžŸαŸ’αžšαž‘αžΆαž‰αŸ‹! αžαžΎαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆ CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αŸ?

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžαŸ’αžŸαŸ‚αžŸαž„αŸ’αžœαžΆαž€αŸ‹ CI/CD αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž‡αžΆαž˜αž½αž™ Docker

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹