αž˜αž‚αŸ’αž‚αž»αž‘αŸ’αž‘αŸαžŸαž€αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžšαžŸαŸαžš Docker

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

αž˜αž‚αŸ’αž‚αž»αž‘αŸ’αž‘αŸαžŸαž€αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžšαžŸαŸαžš Docker

តើ Docker Compose αž‡αžΆαž’αŸ’αžœαžΈ?

Docker Compose αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž˜αž½αž™ Docker αŸ” αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž…αž“αžΆαž‘αžΎαž„αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‚αž˜αŸ’αžšαŸ„αž„αŸ”

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

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

αž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆ Docker Compose αžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž–αžŽαŸŒαž“αžΆαžœαžΆαžαžΆαž˜αžšαž”αŸ€αž”αžŸαžΆαž˜αž‰αŸ’αž‰ αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαŸ‚αž˜αž½αž™αŸ”

αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαžšαžœαžΆαž„ Docker αž“αž·αž„ Docker Compose

Docker αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž’αž»αž„αž“αžΈαž˜αž½αž™αŸ— (αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜) αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαž‡αžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

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

αž˜αž‚αŸ’αž‚αž»αž‘αŸ’αž‘αŸαžŸαž€αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžšαžŸαŸαžš Docker
Docker (αž’αž»αž„αžαŸ‚αž˜αž½αž™) αž“αž·αž„ Docker Compose (αž’αž»αž„αž…αŸ’αžšαžΎαž“)

αž€αžšαžŽαžΈαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αž˜αŸ’αž˜αžαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Docker Compose

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

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

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

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

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

αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ client-server αžŠαŸ„αž™αž”αŸ’αžšαžΎ Docker Compose

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž’αŸ’αž“αž€αžŠαžΉαž„αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎ Docker Compose αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ αžœαžΆαž‡αžΆαž–αŸαž›αžœαŸαž›αžΆαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœαžŠαŸ†αž”αžΌαž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž”αž€αžšαžŽαŸαž“αŸαŸ‡αŸ” αž˜αžΆαž“αž“αŸαž™αžαžΆ αž™αžΎαž„αž€αŸ†αž–αž»αž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž‚αŸαž αž‘αŸ†αž–αŸαžšαžαžΌαž…αž˜αž½αž™ (αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ) αž“αŸ…αž€αŸ’αž“αž»αž„ Python αžŠαŸ‚αž›αž’αžΆαž…αž”αž‰αŸ’αž…αŸαž‰αž―αž€αžŸαžΆαžšαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αŸ†αžŽαŸ‚αž€αž“αŸƒαž’αžαŸ’αžαž”αž‘αŸ” αž―αž€αžŸαžΆαžšαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαŸ’αž“αžΎαžšαžŸαž»αŸ†αž–αžΈαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŠαŸ„αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ (αž’αžαž·αžαž·αž‡αž“) αžŠαŸ‚αž›αž”αžΆαž“αžŸαžšαžŸαŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„ Python αž•αž„αžŠαŸ‚αžšαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž―αž€αžŸαžΆαžšαž–αžΈαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž αžΆαž‰αž’αžαŸ’αžαž”αž‘αžŠαŸ‚αž›αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ’αž“αž»αž„αžœαžΆαž“αŸ…αž›αžΎαž’αŸαž€αŸ’αžšαž„αŸ‹αŸ”

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

αžαŸ„αŸ‡αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎαž‚αž˜αŸ’αžšαŸ„αž„αŸ”

▍ ៑. αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž‚αž˜αŸ’αžšαŸ„αž„

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

  • αž―αž€αžŸαžΆαžš docker-compose.yml. αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž―αž€αžŸαžΆαžš Docker Compose αžŠαŸ‚αž›αž“αžΉαž„αž˜αžΆαž“αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αŸ”
  • αžαžαž―αž€αžŸαžΆαžš server. αžœαžΆαž“αžΉαž„αž˜αžΆαž“αž―αž€αžŸαžΆαžšαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αŸ’αžŸαžΆαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”
  • αžαžαž―αž€αžŸαžΆαžš client. αž―αž€αžŸαžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αžαž·αžαž·αž‡αž“αž“αžΉαž„αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ”

αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒαžαžαž―αž€αžŸαžΆαžšαžŸαŸ†αžαžΆαž“αŸ‹αžšαž”αžŸαŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‚αž½αžšαžαŸ‚αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

.
β”œβ”€β”€ client/
β”œβ”€β”€ docker-compose.yml
└── server/
2 directories, 1 file

▍ ្. αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ

αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αž™αžΎαž„αž“αžΉαž„αž”αŸ‰αŸ‡αž›αžΎαž…αŸ†αžŽαž»αž…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž˜αž½αž™αž…αŸ†αž“αž½αž“αž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„ Docker αŸ”

2 αž€. αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžš

αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αžαžαž―αž€αžŸαžΆαžš server αž αžΎαž™αž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžšαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαŸ–

  • αž―αž€αžŸαžΆαžš server.py. αžœαžΆαž“αžΉαž„αž˜αžΆαž“αž›αŸαžαž€αžΌαžŠαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ”
  • αž―αž€αžŸαžΆαžš index.html. αž―αž€αžŸαžΆαžšβ€‹αž“αŸαŸ‡β€‹αž“αžΉαž„β€‹αž˜αžΆαž“β€‹αž”αŸ†αžŽαŸ‚αž€β€‹αž“αŸƒβ€‹αž’αžαŸ’αžαž”αž‘β€‹αžŠαŸ‚αž›β€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈβ€‹αž’αžαž·αžαž·αž‡αž“β€‹αž‚αž½αžšβ€‹αž”αž‰αŸ’αž…αŸαž‰αŸ”
  • αž―αž€αžŸαžΆαžš Dockerfile. αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž―αž€αžŸαžΆαžš Docker αžŠαŸ‚αž›αž“αžΉαž„αž˜αžΆαž“αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž”αžšαž·αž™αžΆαž€αžΆαžŸαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ”

αž“αŸαŸ‡αž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž˜αžΆαžαž·αž€αžΆαž“αŸƒαžαžαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‚αž½αžšαž˜αžΎαž›αž‘αŸ…αžŠαžΌαž… server/:

.
β”œβ”€β”€ Dockerfile
β”œβ”€β”€ index.html
└── server.py
0 directories, 3 files

2 ខ. αž€αžΆαžšαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž―αž€αžŸαžΆαžš Python αŸ”

αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž―αž€αžŸαžΆαžš server.py αž€αžΌαžŠαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

#!/usr/bin/env python3

# Π˜ΠΌΠΏΠΎΡ€Ρ‚ систСмных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ python.
# Π­Ρ‚ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для создания Π²Π΅Π±-сСрвСра.
# Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ особСнноС, эти Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ вмСстС с Python.

import http.server
import socketserver

# Π­Ρ‚Π° пСрСмСнная Π½ΡƒΠΆΠ½Π° для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запросов ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΊ сСрвСру.

handler = http.server.SimpleHTTPRequestHandler

# Π’ΡƒΡ‚ ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ сСрвСр ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½Π° ΠΏΠΎΡ€Ρ‚Π΅ 1234. 
# ΠŸΠΎΡΡ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ эти свСдСния, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π½Π°ΠΌ ΠΎΡ‡Π΅Π½ΡŒ пригодятся Π² дальнСйшСм, ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с docker-compose.

with socketserver.TCPServer(("", 1234), handler) as httpd:

    # Благодаря этой ΠΊΠΎΠΌΠ°Π½Π΄Π΅ сСрвСр Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ постоянно, оТидая запросов ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

   httpd.serve_forever()

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

2 αž‚. αž€αžΆαžšαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž―αž€αžŸαžΆαžš HTML

αž‘αŸ…αž€αžΆαž“αŸ‹β€‹αž―αž€αžŸαžΆαžš index.html αž”αž“αŸ’αžαŸ‚αž˜αž’αžαŸ’αžαž”αž‘αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

Docker-Compose is magic!

αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαž‘αŸ…αž’αžαž·αžαž·αž‡αž“αŸ”

2 αžƒαŸ” αž€αžΆαžšαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž―αž€αžŸαžΆαžš Docker

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

# На всякий случай напоминаю, Ρ‡Ρ‚ΠΎ Dockerfile всСгда Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π°.
# Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово 'FROM'.
# Π—Π΄Π΅ΡΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π· python (с DockerHub).
# Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹, Π² качСствС ΠΈΠΌΠ΅Π½ΠΈ ΠΎΠ±Ρ€Π°Π·Π°, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ 'python', Π° Π² качСствС вСрсии - 'latest'.

FROM python:latest

# Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ ΠΊΠΎΠ΄, написанный Π½Π° Python, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ 'server.py' ΠΈ 'index.html'.
# Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово 'ADD'.
# ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, 'server.py', прСдставляСт собой имя Ρ„Π°ΠΉΠ»Π°, хранящСгося Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅.
# Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, '/server/', это ΠΏΡƒΡ‚ΡŒ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π² ΠΎΠ±Ρ€Π°Π·Π΅.
# Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» Π² ΠΏΠ°ΠΏΠΊΡƒ ΠΎΠ±Ρ€Π°Π·Π° '/server/'.

ADD server.py /server/
ADD index.html /server/

# Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ 'WORKDIR', Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎΠ²ΠΎΠΉ для вас.
# Она позволяСт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ΠΎΠ±Ρ€Π°Π·Π°.
# Π’ качСствС Ρ‚Π°ΠΊΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ всС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΌΡ‹ устанавливаСм '/server/'.

WORKDIR /server/

αž₯αž‘αžΌαžœαž“αŸαŸ‡αžŸαžΌαž˜αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎαž’αžαž·αžαž·αž‡αž“αŸ”

▍ ៣. αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž’αžαž·αžαž·αž‡αž“

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

3 αž€. αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžš

αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αžαžαž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” client αž αžΎαž™αž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžšαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαŸ–

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

αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αžαžαž―αž€αžŸαžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” client/ αž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž“αŸƒαž€αžΆαžšαž„αžΆαžšαž“αŸαŸ‡αžœαžΆαž‚αž½αžšαžαŸ‚αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡:

.
β”œβ”€β”€ client.py
└── Dockerfile
0 directories, 2 files

3 ខ. αž€αžΆαžšαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž―αž€αžŸαžΆαžš Python

αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž―αž€αžŸαžΆαžš client.py αž€αžΌαžŠαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

#!/usr/bin/env python3

# Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Python.
# Она ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»Π° 'index.html' с сСрвСра.
# НичСго особСнного ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, эта Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° устанавливаСтся вмСстС с Python.

import urllib.request

# Π­Ρ‚Π° пСрСмСнная содСрТит запрос ΠΊ 'http://localhost:1234/'.
# Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, сСйчас Π²Ρ‹ Π·Π°Π΄Π°Ρ‘Ρ‚Π΅ΡΡŒ вопросом ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ 'http://localhost:1234'.
# localhost ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ сСрвСром.
# 1234 - это Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π°ΠΌ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π»ΠΎΡΡŒ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ настройкС сСрвСрного ΠΊΠΎΠ΄Π°.

fp = urllib.request.urlopen("http://localhost:1234/")

# 'encodedContent' соотвСтствуСт Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΠΎΡ‚Π²Π΅Ρ‚Ρƒ сСрвСра ('index.html').
# 'decodedContent' соотвСтствуСт раскодированному ΠΎΡ‚Π²Π΅Ρ‚Ρƒ сСрвСра (Ρ‚ΡƒΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ вывСсти Π½Π° экран).

encodedContent = fp.read()
decodedContent = encodedContent.decode("utf8")

# Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ содСрТимоС Ρ„Π°ΠΉΠ»Π°, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ с сСрвСра ('index.html').

print(decodedContent)

# Π—Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ соСдинСниС с сСрвСром.

fp.close()

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

៣ αž‚. αž€αžΆαžšαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž―αž€αžŸαžΆαžš Docker

αžŠαžΌαž…αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™αŸ” Dockerfileαž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž”αžšαž·αžŸαŸ’αžαžΆαž“αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœ Python αž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž›αŸαžαž€αžΌαžŠαž’αžαž·αžαž·αž‡αž“ Dockerfile:

# Π’ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ Π² сСрвСрном Dockerfile.

FROM python:latest

# Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ 'client.py' Π² ΠΏΠ°ΠΏΠΊΡƒ '/client/'.

ADD client.py /client/

# УстанавливаСм Π² качСствС Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ '/client/'.

WORKDIR /client/

▍ ៀ. Docker αžαŸ‚αž„

αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž”αžΆαž“αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹ αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‚αž˜αŸ’αžšαŸ„αž„αž–αžΈαžšαž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαŸ– αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αž“αž·αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœαŸ” αž–αž½αž€αž‚αŸαž˜αŸ’αž“αžΆαž€αŸ‹αŸ—αž˜αžΆαž“αž―αž€αžŸαžΆαžšαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“ Dockerfile. αžšαž αžΌαžαž˜αž€αžŠαž›αŸ‹αž–αŸαž›αž“αŸαŸ‡ αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αž”αžΆαž“αž€αžΎαžαž‘αžΎαž„αž˜αž·αž“αž‘αžΆαž“αŸ‹αž αž½αžŸαž–αžΈαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸƒαž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ Docker αž‘αŸαŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™ Docker Compose αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αžŸαžΌαž˜αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž―αž€αžŸαžΆαžš docker-compose.ymlαžŠαŸ‚αž›αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αžαžαž―αž€αžŸαžΆαžšαžŠαžΎαž˜αž‚αž˜αŸ’αžšαŸ„αž„αŸ”

αžŸαžΌαž˜αž…αŸ†αžŽαžΆαŸ†αžαžΆαž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αž˜αž·αž“αž–αŸ’αž™αžΆαž™αžΆαž˜αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αž“αžΌαžœαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž’αžΆαž…αž”αŸ’αžšαžΎαž”αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„ docker-compose.yml. αž‚αŸ„αž›αžŠαŸ…αž…αž˜αŸ’αž”αž„αžšαž”αžŸαŸ‹αž™αžΎαž„αž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαžŠαžΎαžšαžαžΆαž˜αž§αž‘αžΆαž αžšαžŽαŸαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αžŠαŸ‚αž›αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž’αŸ’αž“αž€αž“αžΌαžœαž…αŸ†αžŽαŸαŸ‡αžŠαžΉαž„αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸƒ Docker Compose αŸ”

αž“αŸαŸ‡αž‡αžΆαž€αžΌαžŠαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαžΆαž€αŸ‹αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš docker-compose.yml:

# Π€Π°ΠΉΠ» docker-compose Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с Ρ‚Π΅Π³Π° вСрсии.
# ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ "3" Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это - самая свСТая вСрсия Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания этого ΠΊΠΎΠ΄Π°.

version: "3"

# Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ docker-composes Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с сСрвисами.
# 1 сСрвис = 1 ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€.
# БСрвисом ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚, сСрвСр, сСрвСр Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…...
# Π Π°Π·Π΄Π΅Π», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄ΡƒΡ‚ описаны сСрвисы, начинаСтся с 'services'.

services:

  # Как ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ сказано, ΠΌΡ‹ собираСмся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ клиСнтскоС ΠΈ сСрвСрноС прилоТСния.
  # Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΄Π²Π° сСрвиса.
  # ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ сСрвис (ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€): сСрвСр.
  # ΠΠ°Π·Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ.
  # ΠŸΠΎΠ½ΡΡ‚Π½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ сСрвиса ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ€ΠΎΠ»ΡŒ.
  # Π—Π΄Π΅ΡΡŒ ΠΌΡ‹, для имСнования ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ сСрвиса, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово 'server'.

  server:
 
    # ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово "build" позволяСт Π·Π°Π΄Π°Ρ‚ΡŒ
    # ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ Dockerfile, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания ΠΎΠ±Ρ€Π°Π·Π°,
    # ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сСрвис.
    # Π—Π΄Π΅ΡΡŒ 'server/' соотвСтствуСт ΠΏΡƒΡ‚ΠΈ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ сСрвСра,
    # которая содСрТит ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Dockerfile.

    build: server/

    # Команда, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ послС создания ΠΎΠ±Ρ€Π°Π·Π°.
    # Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ запуск "python ./server.py".

    command: python ./server.py

    # ВспомнитС ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² качСствС ΠΏΠΎΡ€Ρ‚Π° Π² 'server/server.py' ΡƒΠΊΠ°Π·Π°Π½ ΠΏΠΎΡ€Ρ‚ 1234.
    # Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ сСрвСру с нашСго ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° (Π½Π°Ρ…ΠΎΠ΄ΡΡΡŒ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°),
    # ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ этого ΠΏΠΎΡ€Ρ‚Π° Π½Π° ΠΏΠΎΡ€Ρ‚ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°.
    # Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово 'ports'.
    # ΠŸΡ€ΠΈ Π΅Π³ΠΎ использовании примСняСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ конструкция: [ΠΏΠΎΡ€Ρ‚ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°]:[ΠΏΠΎΡ€Ρ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°]
    # Π’ нашСм случаС Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ€Ρ‚ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° 1234 ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ связь с ΠΏΠΎΡ€Ρ‚ΠΎΠΌ
    # 1234 ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° этот ΠΏΠΎΡ€Ρ‚ сСрвСр 
    # ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ поступлСния запросов).

    ports:
      - 1234:1234

  # Π’Ρ‚ΠΎΡ€ΠΎΠΉ сСрвис (ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€): ΠΊΠ»ΠΈΠ΅Π½Ρ‚.
  # Π­Ρ‚ΠΎΡ‚ сСрвис Π½Π°Π·Π²Π°Π½ 'client'.

  client:
    # Π—Π΄Π΅ΡΡŒ 'client/ соотвСтствуСт ΠΏΡƒΡ‚ΠΈ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅, которая содСрТит
    # Ρ„Π°ΠΉΠ» Dockerfile для клиСнтской части систСмы.

    build: client/

    # Команда, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ послС создания ΠΎΠ±Ρ€Π°Π·Π°.
    # Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ запуск "python ./client.py".
 
    command: python ./client.py

    # ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово 'network_mode' ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для описания Ρ‚ΠΈΠΏΠ° сСти.
    # Π’ΡƒΡ‚ ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ 'localhost' ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°.

    network_mode: host

    # ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово 'depends_on' позволяСт ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π»ΠΈ сСрвис,
    # ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ, ΠΆΠ΄Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄ΡƒΡ‚ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ сСрвисы.
    # Нам Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сСрвис 'client' доТдался Π±Ρ‹ готовности ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ сСрвиса 'server'.
 
    depends_on:
      - server

▍ αŸ₯. αž€αžΆαžšαž€αžŸαžΆαž„αž‚αž˜αŸ’αžšαŸ„αž„

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž…αžΌαž› docker-compose.yml αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αžΌαž› αž‚αž˜αŸ’αžšαŸ„αž„αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αŸ” αž‡αŸ†αž αžΆαž“αž“αŸƒαž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αž™αžΎαž„αž“αŸαŸ‡αž‚αžΊαžŸαŸ’αžšαžŠαŸ€αž„αž“αžΉαž„αž€αžΆαžšαž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ docker buildαž”αŸ‰αž»αž“αŸ’αžαŸ‚αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž‚αžΊαž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž“αžΉαž„αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ–

$ docker-compose build

▍ ៦. αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„

αž₯αž‘αžΌαžœβ€‹αž“αŸαŸ‡β€‹αž‚αž˜αŸ’αžšαŸ„αž„β€‹αž“αŸαŸ‡β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αŸ’αžšαž˜αžΌαž›β€‹αž•αŸ’αžαž»αŸ†β€‹αž αžΎαž™ αžœαžΆβ€‹αžŠαž›αŸ‹β€‹αž–αŸαž›β€‹αž…αžΆαž”αŸ‹β€‹αž•αŸ’αžαžΎαž˜β€‹αžœαžΆβ€‹αž αžΎαž™αŸ” αž‡αŸ†αž αžΆαž“αž“αŸƒαž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αž™αžΎαž„αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αž‡αŸ†αž αžΆαž“αžŠαŸ‚αž›αž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž’αž»αž„αž“αžΈαž˜αž½αž™αŸ— αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž· docker run:

$ docker-compose up

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡ αž’αžαŸ’αžαž”αž‘αžŠαŸ‚αž›αž”αžΆαž“αž‘αžΆαž‰αž™αž€αžŠαŸ„αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœαž–αžΈαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αž½αžšαžαŸ‚αž”αž„αŸ’αž αžΆαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αžΈαž™αŸ– Docker-Compose is magic!.

αžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžšαž½αž…αž˜αž€αž αžΎαž™ αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αŸ’αžšαžΎαž…αŸ’αžšαž€αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžš 1234 αž‘αŸ…αž“αžΉαž„αžŸαŸ†αžŽαžΎαžšαž”αžŸαŸ‹αž’αžαž·αžαž·αž‡αž“αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” http://localhost:1234/αžœαžΆαž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž‘αŸ†αž–αŸαžšαžŠαŸ‚αž›αž˜αžΆαž“αž’αžαŸ’αžαž”αž‘ Docker-Compose is magic!.

αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸ

αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž™αž›αŸ‹αžαžΆαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ Docker Compose αŸ”

αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αž‰αŸ’αžˆαž”αŸ‹ αž“αž·αž„αž›αž»αž”αž€αž»αž„αžαžΊαž“αŸαžš αž“αž·αž„αž’αž“αž’αžΆαž“αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ„αž™αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ docker-compose up:

$ docker-compose down

αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αŸ–

$ docker-compose logs -f [service name]

αž§αž‘αžΆαž αžšαžŽαŸ αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž™αžΎαž„ αžœαžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž“αŸαŸ‡αŸ– $ docker-compose logs -f [service name].

αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž αžΆαž‰αž”αž‰αŸ’αž‡αžΈαž’αž»αž„αž˜αž½αž™αŸ–

$ docker-compose ps

αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžšαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ–

$ docker-compose exec [service name] [command]

αž§αž‘αžΆαž αžšαžŽαŸ αžœαžΆαž’αžΆαž…αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ– docker-compose exec server ls.

αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αž„αŸ’αž αžΆαž‰αž”αž‰αŸ’αž‡αžΈαžšαžΌαž”αž—αžΆαž–αŸ–

$ docker-compose images

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

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

αž’αŸ’αž“αž€αž’αžΆαž“αž‡αžΆαž‘αžΈαžŸαŸ’αžšαž‘αžΆαž‰αŸ‹! αžαžΎαž’αŸ’αž“αž€αž”αŸ’αžšαžΎ Docker Compose αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αŸ?

αž˜αž‚αŸ’αž‚αž»αž‘αŸ’αž‘αŸαžŸαž€αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžšαžŸαŸαžš Docker

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

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