{"id":482,"date":"2020-06-10T11:45:05","date_gmt":"2020-06-10T04:45:05","guid":{"rendered":"https:\/\/www.marketenterprise.vn\/blog\/?p=482"},"modified":"2021-12-27T19:48:58","modified_gmt":"2021-12-27T12:48:58","slug":"docker-la-gi","status":"publish","type":"post","link":"https:\/\/www.marketenterprise.vn\/blog\/docker-la-gi.html","title":{"rendered":"DOCKER L\u00c0 G\u00cc?"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">T\u00f4i \u0111\u00e3 b\u1eaft \u0111\u1ea7u v\u1edbi docker nh\u01b0 th\u1ebf n\u00e0o?<\/h2>\n\n\n\n<p>M\u00ecnh chia s\u1ebb c\u00e2u chuy\u1ec7n x\u00e0m c\u1ee7a b\u1ea3n th\u00e2n m\u00ecnh tr\u01b0\u1edbc nh\u00e9. Tr\u01b0\u1edbc \u0111\u00e2y khi m\u1edbi l\u1eadp tr\u00ecnh PHP, m\u00ecnh hay s\u1eed d\u1ee5ng <strong>XAMPP<\/strong> hay <strong>WAMP<\/strong> \u0111\u1ec3 l\u1eadp tr\u00ecnh (c\u1ee5c n\u00e0y l\u00e0 web apache, mysql v\u00e0 php), m\u1ecdi chuy\u1ec7n v\u1eabn t\u1ed1t \u0111\u1eb9p \u0111\u1ebfn khi c\u00f3 y\u00eau c\u1ea7u m\u1edbi l\u00e0 s\u1eed d\u1ee5ng SQL Server thay cho MySQL, v\u00e0 t\u1eeb \u0111\u00e2y c\u00e2u chuy\u1ec7n c\u1ee7a m\u00ecnh v\u1edbi <strong>XAMPP<\/strong> <strong>WAMP<\/strong> \u0111\u00e3 kh\u00f4ng c\u00f2n m\u1ea5y vui v\u1ebb n\u1eefa.<br><br><\/p>\n\n\n\n<p>\u0110\u00f3 ch\u1ec9 m\u1edbi \u0111\u01a1n gi\u1ea3n th\u00f4i, sau n\u00e0y v\u1edbi d\u1ef1 \u00e1n x\u00e0i c\u00e1c c\u00f4ng ngh\u1ec7 kh\u00e1c, th\u01b0 vi\u1ec7n kh\u00e1c, database kh\u00e1c, ch\u1eb3ng h\u1ea1n python &#8211; flask l\u00e0m backend, <a href=\"https:\/\/www.marketenterprise.vn\/blog\/vuejs-la-gi.html\">Vue.js<\/a> l\u00e0m front end, Mongodb l\u00e0m database, ch\u01b0a k\u1ec3 version n\u1eefa nh\u00e9, theo c\u00e1ch c\u0169 m\u00e0 c\u00e0i h\u1ebft \u0111\u1ed1ng n\u00e0y v\u00f4 m\u00e1y \u0111\u00e3 m\u1ec7t, \u0111\u1ee5ng v\u1edbi ph\u1ea7n m\u1ec1m n\u00e0o \u0111\u00f3 trong m\u00e1y n\u1eefa th\u00ec t\u00e8o lu\u00f4n h\u1ec7 \u0111i\u1ec1u h\u00e0nh v\u00e0 c\u00e0i l\u1ea1i h\u1ebft\u00a0 \ud83d\ude41 , c\u00f2n ch\u01b0a k\u1ec3 n\u1ebfu b\u1ea1n l\u00e0m 2-3 d\u1ef1 \u00e1n kh\u00e1c nhau v\u1edbi c\u00f4ng ngh\u1ec7 kh\u00e1c nhau n\u1eefa.<br><br><\/p>\n\n\n\n<p>V\u00e0 m\u00ecnh \u0111\u00e3 \u0111\u01b0\u1ee3c ti\u1ebfp c\u1eadn v\u1edbi <strong>Docker<\/strong> \u0111\u1ec3 c\u00f3 th\u1ec3 t\u1ea1o ra m\u1ed9t m\u00f4i tr\u01b0\u1eddng \u1ea3o h\u00f3a ch\u1ee9a \u0111\u1ea7y \u0111\u1ee7 c\u00e1c c\u00e0i \u0111\u1eb7t c\u1ea7n thi\u1ebft t\u00f9y theo t\u1eebng d\u1ef1 \u00e1n, chuy\u1ec3n \u0111\u1ed5i linh \u0111\u1ed9ng d\u1ec5 d\u00e0ng m\u00e0 ko \u1ea3nh h\u01b0\u1edfng \u0111\u1ebfn m\u00e1y host (m\u00e1y th\u1eadt c\u1ee7a m\u00ecnh \u0111ang c\u00e0i docker &#8211; \u1edf b\u00e0i n\u00e0y m\u00ecnh g\u1ecdi l\u00e0 m\u00e1y host cho d\u1ec5 nh\u00e9).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><br>T\u1ea1i sao l\u1ea1i ch\u1ecdn Docker?<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Khi l\u1eadp tr\u00ecnh th\u00ec team dev ph\u1ea3i \u0111\u1ed3ng nh\u1ea5t c\u00e1c c\u00f4ng ngh\u1ec7, c\u00e1c version v\u1edbi nhau: S\u1eed d\u1ee5ng docker \u0111\u1ec3 t\u1ea1o ra container theo y\u00eau c\u1ea7u c\u1ee7a d\u1ef1 \u00e1n, dev ch\u1ec9 \u00f4m v\u1ec1 ch\u1ea1y th\u00f4i l\u00e0 \u0111\u1ed3ng b\u1ed9 h\u1ebft, khi c\u1ea7n chuy\u1ec3n d\u1ef1 \u00e1n kh\u00e1c th\u00ec \u00f4m c\u00e1i container c\u1ee7a d\u1ef1 \u00e1n \u0111\u00f3 v\u1ec1 ch\u1ea1y l\u00e0 \u0111\u01b0\u1ee3c r\u1ed3i.<br><br><\/li><li>Test: Khi tester ki\u1ec3m tra th\u00ec \u00f4m c\u00e1i container v\u1ec1 ch\u1ea1y m\u1ed9t c\u00e1ch \u0111\u01a1n gi\u1ea3n, kh\u00f4ng c\u1ea7n c\u00e0i \u0111\u1eb7t g\u00ec nhi\u1ec1u.<br><br><\/li><li>Deploy: Hi\u1ec7n nay c\u00f3 nhi\u1ec1u Cloud service \u0111\u00e3 t\u00edch h\u1ee3p h\u1ed7 tr\u1ee3 docker l\u00ean c\u00e1c d\u1ecbch v\u1ee5 c\u1ee7a h\u1ecd nh\u01b0 Amazon hay Google Platform,&#8230; n\u00ean vi\u1ec7c deploy s\u1ebd \u0111\u01b0\u1ee3c h\u1ed7 tr\u1ee3 d\u1ec5 d\u00e0ng h\u01a1n nhi\u1ec1u v\u1edbi docker<br><br><\/li><li>Ngo\u00e0i ra, v\u1edbi xu h\u01b0\u1edbng s\u1eed d\u1ee5ng c\u00f4ng ngh\u1ec7 microservice hi\u1ec7n nay th\u00ec docker l\u00e0 m\u1ed9t ph\u1ea7n kh\u00f4ng th\u1ec3 thi\u1ebfu \u0111\u01b0\u1ee3c, th\u1eed t\u01b0\u1edfng t\u01b0\u1ee3ng xem n\u1ebfu b\u1ea1n c\u00f3 100 c\u00e1i microservice v\u00e0 kh\u00f4ng c\u00f3 docker, b\u1ea1n s\u1ebd ph\u1ea3i qu\u1ea3n l\u00fd 100 c\u00e1i server ho\u1eb7c vps? Vi\u1ec7c n\u00e0y s\u1ebd c\u1ef1c k\u1ef3 v\u1ea5t v\u1ea3 v\u00e0 t\u1ed1n nhi\u1ec1u th\u1eddi gian. V\u1edbi vi\u1ec7c s\u1eed d\u1ee5ng Docker th\u00ec vi\u1ec7c \u0111\u00f3 \u0111\u01a1n gi\u1ea3n h\u01a1n r\u1ea5t nhi\u1ec1u.<br><br><\/li><\/ul>\n\n\n\n<p>Th\u00eam n\u1eefa c\u00e1c c\u00f4ng ty l\u1edbn \u0111\u00e3 t\u00edch h\u1ee3p Docker v\u00e0o s\u1ea3n ph\u1ea9m c\u1ee7a h\u1ecd kh\u00e1 nhi\u1ec1u r\u1ed3i, c\u00f9ng \u0111i\u1ec3m danh nh\u00e9<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Docker c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c t\u00edch h\u1ee3p v\u00e0o c\u00e1c c\u00f4ng c\u1ee5, bao g\u1ed3m c\u1ea3 Amazon Web Services, Ansible, CFEngine, Chef, Google Cloud Platform, IBM,&nbsp; Jelastic,&nbsp; Jenkins, Microsoft Azure,&nbsp; OpenStack Nova, OpenSVC,<sup> <\/sup>HPE Helion Stackato, Puppet, Salt, Vagrant, v\u00e0 VMware vSphere Containers.<br><br><\/li><li>D\u1ef1 \u00e1n Cloud Foundry Diego t\u00edch h\u1ee3p Docker v\u00e0o Cloud Foundry PaaS<br><br><\/li><li>Red Hat c\u0169ng t\u00edch h\u1ee3p Docker v\u00e0o OpenShift<br><br><\/li><li>Apprenda t\u00edch h\u1ee3p Docker trong phi\u00ean b\u1ea3n 6.0 s\u1ea3n ph\u1ea9m c\u1ee7a m\u00ecnh<br><br><br><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">T\u1ea1i sao l\u1ea1i ch\u1ecdn Docker?<\/h2>\n\n\n\n<p>B\u1eaft \u0111\u1ea7u t\u1eeb nh\u1eefng ng\u00e0y \u0111\u1ea7u ti\u00ean, m\u00f4 h\u00ecnh server th\u01b0\u1eddng s\u1ebd l\u00e0 <strong>M\u00e1y ch\u1ee7 v\u1eadt l\u00fd<\/strong> + H<strong>\u1ec7 \u0111i\u1ec1u h\u00e0nh OS<\/strong> + <strong>Application<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"641\" height=\"271\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110631\/pasted-image-0.png\" alt=\"\" class=\"wp-image-485\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110631\/pasted-image-0.png 641w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110631\/pasted-image-0-300x127.png 300w\" sizes=\"auto, (max-width: 641px) 100vw, 641px\" \/><\/figure>\n\n\n\n<p>V\u1eady mu\u1ed1n x\u00e0i 2 d\u1ecbch v\u1ee5 th\u00ec ta ph\u1ea3i c\u00f3 2 server nh\u01b0 v\u1eady, v\u00e0 chi ph\u00ed cho m\u1ed7i server nh\u01b0 v\u1eady l\u00e0 kh\u00f4ng h\u1ec1 \u00edt m\u1ed9t t\u00ed n\u00e0o.Ti\u1ebfp theo l\u00e0 s\u1ef1 ra \u0111\u1eddi c\u1ee7a c\u00f4ng ngh\u1ec7 \u1ea3o h\u00f3a <strong>virtualization<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"711\" height=\"401\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110738\/pasted-image-0-2.png\" alt=\"\" class=\"wp-image-486\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110738\/pasted-image-0-2.png 711w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110738\/pasted-image-0-2-300x169.png 300w\" sizes=\"auto, (max-width: 711px) 100vw, 711px\" \/><\/figure>\n\n\n\n<p>Okie v\u1eady x\u00e0i 2 service th\u00ec kh\u00f4ng c\u1ea7n \u0111\u1ebfn 2 server n\u1eefa, c\u1ea7n 1 server v\u00e0 t\u1ea1o 2 <strong>virtual machine <\/strong>ri\u00eang l\u00e0 xong. C\u0169ng \u1ed5n nh\u1ec9?<\/p>\n\n\n\n<p><br><br>Nh\u01b0ng gi\u1edd 1 server 100Gb \u1ed5 c\u1ee9ng, 8Gb ram, 4 core CPU, c\u00f2n m\u1ed9t <strong>virtual machine<\/strong> m\u1edf l\u00ean c\u1ea7n 20Gb \u1ed5 c\u1ee9ng, 2Gb ram v\u00e0 2 core CPU; v\u1eady m\u1edf c\u00e1i <strong>virtual<\/strong> \u0111\u00f3 l\u00ean ng\u1eafm c\u00e1i c\u0169ng t\u1ed1n t\u1eebng \u0111\u00f3 t\u00e0i nguy\u00ean r\u1ed3i, m\u1edf 2- 3 c\u00e1i l\u00e0 full resource d\u00f9 ch\u1ea3 l\u00e0m g\u00ec v\u1edbi n\u00f3 c\u1ea3. C\u0169ng h\u01a1i h\u01a1i ph\u00ed ph\u1ea1m nh\u1ec9.V\u1eady \u0111\u1ebfn l\u01b0\u1ee3t c\u00f4ng ngh\u1ec7 \u1ea3o h\u00f3a <strong>containerization<\/strong> \u0111\u01b0\u1ee3c sinh ra<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"711\" height=\"401\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110802\/pasted-image-0-3.png\" alt=\"\" class=\"wp-image-487\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110802\/pasted-image-0-3.png 711w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110802\/pasted-image-0-3-300x169.png 300w\" sizes=\"auto, (max-width: 711px) 100vw, 711px\" \/><\/figure>\n\n\n\n<p><br><br>V\u1eady c\u00f4ng ngh\u1ec7 n\u00e0y kh\u00e1c <strong>virtualization<\/strong> ch\u1ed7 n\u00e0o? \u0110\u00f3 ch\u00ednh l\u00e0 <strong>containerization<\/strong> s\u1eed d\u1ee5ng c\u00e1c <strong>container<\/strong>, c\u00e1c <strong>container<\/strong> n\u00e0y s\u1ebd s\u1eed d\u1ee5ng chung nh\u00e2n <strong>OS kernel<\/strong> v\u1edbi m\u00e1y ch\u1ee7 host, \u0111i\u1ec1u n\u00e0y c\u00f3 ngh\u0129a l\u00e0 khi <strong>container<\/strong> ho\u1ea1t \u0111\u1ed9ng c\u1ea7n t\u00e0i nguy\u00ean, n\u00f3 s\u1ebd tr\u1ef1c ti\u1ebfp l\u1ea5y t\u1eeb m\u00e1y host nh\u01b0 m\u1ed9t ph\u1ea7n m\u1ec1m b\u00ecnh th\u01b0\u1eddng ch\u1ea1y tr\u00ean m\u00e1y host v\u1eady, \u0111i\u1ec1u n\u00e0y tr\u00e1nh l\u00e3ng ph\u00ed t\u00e0i nguy\u00ean t\u1eeb m\u00e1y \u1ea3o khi kh\u00f4ng s\u1eed d\u1ee5ng nh\u01b0 trong c\u00f4ng ngh\u1ec7 <strong>virtualization<\/strong>.<\/p>\n\n\n\n<p><br><br>Gi\u1edd quay l\u1ea1i v\u1edbi <strong>Docker<\/strong> nh\u00e9.<\/p>\n\n\n\n<p>V\u1edbi c\u00f4ng ngh\u1ec7 \u1ea3o h\u00f3a <strong>virtualization<\/strong> ch\u1eafc \u0111a s\u1ed1 m\u1ecdi ng\u01b0\u1eddi \u0111\u1ec1u \u0111\u00e3 quen v\u1edbi <strong>Virtualbox<\/strong> hay <strong>VMware<\/strong> r\u1ed3i nh\u1ec9? V\u1eady th\u00ec c\u00f4ng ngh\u1ec7 <strong>containerization<\/strong> d\u00f9ng c\u00e1i g\u00ec \u0111\u00e2y? \u0110\u00f3 l\u00e0 <strong>Docker<\/strong>.<br><br><\/p>\n\n\n\n<p>Nh\u01b0 v\u1eady, <strong>Docker<\/strong> \u0111\u01a1n gi\u1ea3n l\u00e0 t\u00ean m\u1ed9t ph\u1ea7n m\u1ec1m &#8211; c\u00f4ng c\u1ee5 &#8211; c\u00f4ng ty s\u1eed d\u1ee5ng c\u00f4ng ngh\u1ec7 \u1ea3o h\u00f3a <strong>containerization<\/strong> \u0111\u1ec3 tri\u1ec3n khai c\u00e1c \u1ee9ng d\u1ee5ng application v\u00e0o trong <strong>container<\/strong> \u1ea3o h\u00f3a.<br><strong>Docker<\/strong> s\u1eed d\u1ee5ng nh\u00e2n <strong>kernel linux<\/strong> \u0111\u1ec3 ch\u1ea1y c\u00e1c <strong>container<\/strong>, tr\u00ean h\u1ec7 \u0111i\u1ec1u h\u00e0nh <strong>Linux<\/strong> Docker c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng tr\u1ef1c ti\u1ebfp nh\u00e2n c\u1ee7a m\u00e1y host; c\u00f2n v\u1edbi c\u00e1c h\u1ec7 \u0111i\u1ec1u h\u00e0nh <strong>Windows<\/strong>, <strong>MacOS<\/strong> &#8211; c\u00f3 th\u1ec3 v\u00ec l\u00fd do b\u1ea3o m\u1eadt n\u00ean docker kh\u00f4ng th\u1ec3 tr\u1ef1c ti\u1ebfp x\u00e0i chung <strong>kernel<\/strong> v\u1edbi c\u00e1c h\u1ec7 \u0111i\u1ec1u h\u00e0nh n\u00e0y n\u00ean tr\u00ean c\u00e1c h\u1ec7 \u0111i\u1ec1u h\u00e0nh n\u00e0y <strong>docker<\/strong> s\u1ebd t\u1ea1o ra m\u1ed9t m\u00e1y \u1ea3o <strong>virtual guest <\/strong>v\u1edbi nh\u00e2n linux \u0111\u1ec3 ch\u1ea1y c\u00e1c <strong>container<\/strong>.<br><br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"851\" height=\"541\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110835\/pasted-image-0-4-1.png\" alt=\"\" class=\"wp-image-488\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110835\/pasted-image-0-4-1.png 851w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110835\/pasted-image-0-4-1-300x191.png 300w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110835\/pasted-image-0-4-1-768x488.png 768w\" sizes=\"auto, (max-width: 851px) 100vw, 851px\" \/><\/figure>\n\n\n\n<h3>Docker architecture<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1009\" height=\"527\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110857\/pasted-image-0-5.png\" alt=\"\" class=\"wp-image-489\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110857\/pasted-image-0-5.png 1009w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110857\/pasted-image-0-5-300x157.png 300w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110857\/pasted-image-0-5-768x401.png 768w\" sizes=\"auto, (max-width: 1009px) 100vw, 1009px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Docker Engine<\/h3>\n\n\n\n<p>Docker Engine l\u00e0 ph\u1ea7n c\u1ed1t l\u00f5i c\u1ee7a Docker, \u0111\u01b0\u1ee3c x\u00e2y d\u1ef1ng theo ki\u1ec3u ki\u1ebfn tr\u00fac client-server v\u00e0 \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t tr\u00ean m\u00e1y Host. Docker Engine c\u00f3 3 th\u00e0nh ph\u1ea7n:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Server: Docker daemon (dockerd) d\u00f9ng \u0111\u1ec3 t\u1ea1o v\u00e0 qu\u1ea3n l\u00fd c\u00e1c images, containers, networks, volumes.<\/li><li>Rest API: controller cho docker daemon, ch\u1ec9 ra nh\u1eefng g\u00ec docker daemon s\u1ebd l\u00e0m.<\/li><li>Command Line Interface (CLI): N\u01a1i m\u00e0 Client s\u1eed d\u1ee5ng c\u00e1c c\u00e2u l\u1ec7nh Rest API \u0111\u1ec3 t\u01b0\u01a1ng t\u00e1c v\u1edbi Docker daemon<br><br><\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">The Docker client<\/h3>\n\n\n\n<p>Ng\u01b0\u1eddi d\u00f9ng t\u01b0\u01a1ng t\u00e1c v\u1edbi docker th\u00f4ng qua command trong terminal. Docker Client s\u1ebd s\u1eed d\u1ee5ng API g\u1eedi l\u1ec7nh t\u1edbi Docker Daemon.<br><br><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Docker registries<\/h3>\n\n\n\n<p>\u0110\u00e2y l\u00e0 n\u01a1i l\u01b0u tr\u1eef ri\u00eang c\u1ee7a Docker Images. Images \u0111\u01b0\u1ee3c push v\u00e0o registry v\u00e0 client s\u1ebd pull images t\u1eeb registry. C\u00f3 th\u1ec3 s\u1eed d\u1ee5ng registry c\u1ee7a ri\u00eang b\u1ea1n ho\u1eb7c registry c\u1ee7a nh\u00e0 cung c\u1ea5p nh\u01b0: AWS, Google Cloud, Microsoft Azure.<br><br><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Docker objects<\/h3>\n\n\n\n<p>Khi l\u00e0m vi\u1ec7c v\u1edbi <strong>Docker<\/strong> s\u1eed d\u1ee5ng c\u00e1c <strong>images<\/strong>, <strong>containers<\/strong>, <strong>volumes<\/strong>, <strong>networks<\/strong>; \u0111\u00f3 l\u00e0 c\u00e1c <strong>Docker Object<\/strong><br><br><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Images<\/h3>\n\n\n\n<p><strong>Docker images<\/strong> l\u00e0 m\u1ed9t d\u1ea1ng read-only templates v\u1edbi c\u00e1c l\u1ec7nh c\u1ea5u tr\u00fac \u0111\u1ec3 t\u1ea1o ra m\u1ed9t <strong>container<\/strong>. <strong>Docker images<\/strong> c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c t\u1ea3i v\u1ec1 t\u1eeb <strong>Docker hub<\/strong> v\u00e0 s\u1eed d\u1ee5ng, ho\u1eb7c c\u00f3 th\u1ec3 x\u00e2y d\u1ef1ng d\u1ef1a tr\u00ean m\u1ed9t <strong>images<\/strong> c\u01a1 s\u1edf &#8211; th\u01b0\u1eddng l\u00e0 b\u1ea3n ubuntu t\u1ed1i gi\u1ea3n ch\u1ec9 c\u00f3 c\u00e0i \u0111\u1eb7t duy nh\u1ea5t c\u00e1c service c\u1ea7n d\u00f9ng &#8211; c\u00f9ng v\u1edbi c\u00e1c l\u1ec7nh c\u1ea5u tr\u00fac c\u00e0i \u0111\u1eb7t \u0111\u1ec3 x\u00e2y d\u1ef1ng ra m\u1ed9t <strong>images<\/strong> m\u1edbi. C\u0169ng c\u00f3 th\u1ec3 x\u00e2y d\u1ef1ng m\u1ed9t <strong>Docker images<\/strong> b\u1eb1ng <strong>Dockerfile<\/strong> &#8211; ch\u1ee9a t\u1ea5t c\u00e1c c\u00e1c l\u1ec7nh \u0111\u1ec3 c\u1ea5u tr\u00fac n\u00ean m\u1ed9t <strong>container<\/strong>, khi ch\u1ea1y file n\u00e0y s\u1ebd sinh ra m\u1ed9t custom <strong>Docker images.<\/strong>Gi\u1ea3 s\u1eed \u1edf \u0111\u00e2y m\u00ecnh mu\u1ed1n s\u1eed d\u1ee5ng database mysql version 5.7, m\u00ecnh c\u00f3 th\u1ec3 d\u1ec5 d\u00e0ng t\u1ea3i image n\u00e0y m\u1ed9t c\u00e1ch d\u1ec5 d\u00e0ng b\u1eb1ng commandline \u201c<em>docker pull mysql:5.7<\/em>\u201d, mysql l\u00e0 t\u00ean c\u1ee7a image v\u00e0 5.7 l\u00e0 tag phi\u00ean b\u1ea3n c\u1ee7a image \u0111\u00f3, c\u00e1c b\u1ea1n c\u00f3 th\u1ec3 xem c\u1ee5 th\u1ec3 \u1edf Docker hub nh\u00e9<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"843\" height=\"368\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110924\/Screen-Shot-2020-06-02-at-15.43.04.png\" alt=\"\" class=\"wp-image-490\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110924\/Screen-Shot-2020-06-02-at-15.43.04.png 843w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110924\/Screen-Shot-2020-06-02-at-15.43.04-300x131.png 300w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10110924\/Screen-Shot-2020-06-02-at-15.43.04-768x335.png 768w\" sizes=\"auto, (max-width: 843px) 100vw, 843px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Containers<\/h3>\n\n\n\n<p>Sau khi run <strong>docker image <\/strong>s\u1ebd t\u1ea1o ra docker <strong>container<\/strong> t\u01b0\u01a1ng \u1ee9ng. T\u1ea5t c\u1ea3 \u1ee9ng d\u1ee5ng v\u00e0 m\u00f4i tr\u01b0\u1eddng c\u00e0i \u0111\u1eb7t trong <strong>image<\/strong> s\u1ebd \u0111\u01b0\u1ee3c ch\u1ea1y trong <strong>container<\/strong>. C\u00f3 th\u1ec3 s\u1eed d\u1ee5ng <strong>Docker API <\/strong>ho\u1eb7c <strong>CLI<\/strong> \u0111\u1ec3 qu\u1ea3n l\u00fd run, start, stop, delete <strong>docker<\/strong> <strong>container.<\/strong><\/p>\n\n\n\n<p>Th\u1eed ch\u1ea1y m\u1ed9t docker container v\u1edbi image mysql \u0111\u00e3 t\u1ea3i v\u1ec1 b\u1eb1ng l\u1ec7nh<\/p>\n\n\n\n\n\n<p>Ki\u1ec3m tra c\u00e1c container \u0111ang ch\u1ea1y b\u1eb1ng l\u1ec7nh \u201c<em>docker ps\u201d<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"376\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10111128\/Screen-Shot-2020-06-02-at-15.53.01-1024x376.png\" alt=\"\" class=\"wp-image-495\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10111128\/Screen-Shot-2020-06-02-at-15.53.01-1024x376.png 1024w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10111128\/Screen-Shot-2020-06-02-at-15.53.01-300x110.png 300w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10111128\/Screen-Shot-2020-06-02-at-15.53.01-768x282.png 768w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10111128\/Screen-Shot-2020-06-02-at-15.53.01.png 1051w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Nh\u01b0 v\u1eady ch\u00fang ta \u0111\u00e3 kh\u1edfi t\u1ea1o m\u1ed9t container c\u00f3 t\u00ean l\u00e0 mysql-5.7 t\u1eeb images mysql tag 5.7 v\u1edbi pass root l\u00e0 <em>my-secret-pw<\/em><\/p>\n\n\n\n<p>C\u00e1c b\u1ea1n c\u00f3 th\u1ec3 t\u00ecm hi\u1ec3u th\u00eam nhi\u1ec1u l\u1ec7nh <a href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/run\/\" target=\"_blank\" rel=\"noopener\">t\u1ea1i \u0111\u00e2y<\/a> nh\u00e9<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Volumes<\/h3>\n\n\n\n<p>D\u1eef li\u1ec7u \u0111\u01b0\u1ee3c sinh ra v\u00e0 s\u1eed d\u1ee5ng b\u1edfi c\u00e1c <strong>container<\/strong> \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef trong <strong>volumes<\/strong> &#8211; \u0111\u01b0\u1ee3c qu\u1ea3n l\u00fd b\u1edfi<strong> Docker API<\/strong> ho\u1eb7c <strong>CLI<\/strong>.&nbsp;<\/p>\n\n\n\n<p>C\u00e1c d\u1eef li\u1ec7u trong <strong>container<\/strong> ch\u1ec9 t\u1ed3n t\u1ea1i khi <strong>container<\/strong> \u0111\u00f3 ho\u1ea1t \u0111\u1ed9ng v\u00e0 s\u1ebd m\u1ea5t khi x\u00f3a <strong>container<\/strong>, vi\u1ec7c s\u1eed d\u1ee5ng <strong>volumes<\/strong> kh\u00f4ng l\u00e0m t\u0103ng k\u00edch th\u01b0\u1edbc c\u1ee7a m\u1ed9t <strong>container<\/strong>.<\/p>\n\n\n\n<p><br><br>C\u00f3 th\u1ec3 s\u1eed d\u1ee5ng<strong> -v <\/strong>ho\u1eb7c<strong> -mount<\/strong> flag \u0111\u1ec3 t\u1ea1o <strong>container<\/strong> v\u1edbi <strong>volume<\/strong>.<\/p>\n\n\n\n<p>\u1ede tr\u00ean ch\u00fang ta \u0111\u00e3 c\u00f3 \u0111\u01b0\u1ee3c container ch\u1ea1y mysql r\u1ed3i, v\u1eady v\u1ea5n \u0111\u1ec1 l\u00e0 khi c\u00f3 update data tr\u00ean container \u0111\u00f3, l\u00e0m sao ch\u00fang ta c\u00f3 th\u1ec3 l\u01b0u \u0111\u01b0\u1ee3c data l\u1ea1i v\u00e0o m\u00e1y host c\u1ee7a m\u00ecnh? Ch\u00fang ta c\u00f3 th\u1ec3 t\u1ea1o m\u1ed9t volumes m\u1edbi v\u00e0 mount v\u00e0o folder l\u01b0u tr\u1eef d\u1eef li\u1ec7u c\u1ee7a mysql \u0111\u1ec3 l\u1ea5y d\u1eef li\u1ec7u ra m\u00e1y host<\/p>\n\n\n\n<p><br><br>T\u1ea1o m\u1ed9t volume t\u00ean l\u00e0 database v\u00e0 \u00e1nh x\u1ea1 v\u00e0o m\u00e1y host theo \u0111\u01b0\u1eddng d\u1eabn \/Users\/nhanvien6\/Documents\/database b\u1eb1ng l\u1ec7nh<\/p>\n\n\n\n\n\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"dockerfile\">docker volume create --driver local \\\n    --opt type=nfs \\\n    --opt device=\/Users\/nhanvien6\/Documents\/database \\\n    database\n<\/pre>\n<p>Mount v\u00e0o container mysql<\/p><\/p>\n\n\n\n\n\n<h3 class=\"EnlighterJSRAW wp-block-heading\"><br><strong>Networks<\/strong><\/h3>\n\n\n\n<p>Cho ph\u00e9p k\u1ebft n\u1ed1i c\u00e1c container l\u1ea1i v\u1edbi nhau. K\u1ebft n\u1ed1i n\u00e0y c\u00f3 th\u1ec3 tr\u00ean 1 host ho\u1eb7c nhi\u1ec1u host. C\u00f3 5 network drivers trong docker:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><strong>Bridge<\/strong>: C\u00e1c bridge driver t\u1ea1o m\u1ed9t Linux bridge tr\u00ean host v\u00e0 \u0111\u01b0\u1ee3c qu\u1ea3n l\u00fd b\u1edfi Docker. Theo m\u1eb7c \u0111\u1ecbnh c\u00e1c container tr\u00ean m\u1ed9t bridge c\u00f3 th\u1ec3 giao ti\u1ebfp v\u1edbi nhau. Truy c\u1eadp b\u00ean ngo\u00e0i v\u00e0o container c\u0169ng c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c c\u1ea5u h\u00ecnh th\u00f4ng qua bridge driver. Ng\u01b0\u1eddi d\u00f9ng c\u00f3 th\u1ec3 t\u1ef1 \u0111\u1ecbnh ngh\u0129a trong l\u00fac t\u1ea1o ra networking. Ng\u01b0\u1ee3c l\u1ea1i s\u1ebd m\u1eb7c \u0111\u1ecbnh l\u00e0 docker0. \u0110\u01a1n gi\u1ea3n h\u01a1n l\u00e0 ki\u1ec3u n\u00e0y th\u00ec container s\u1ebd truy c\u1eadp \u0111\u01b0\u1ee3c Internet th\u00f4ng qua m\u00e1y Host<\/li><li><strong>Host<\/strong>: M\u1ed9t container s\u1eed d\u1ee5ng network stack c\u1ee7a host v\u00e0 kh\u00f4ng c\u00f3 s\u1ef1 ph\u00e2n t\u00e1ch namespace. C\u00e1c container c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng t\u1ea5t c\u1ea3 c\u00e1c interface tr\u00ean host.<\/li><li><strong>Overlay<\/strong>: T\u1ea1o m\u1ed9t overlay network h\u1ed7 tr\u1ee3 c\u00e1c m\u1ea1ng nhi\u1ec1u m\u00e1y ch\u1ee7(host). S\u1eed d\u1ee5ng k\u1ebft h\u1ee3p c\u00e1c Linux bridge local v\u00e0 VXLAN \u0111\u1ec3 overlay c\u00e1c giao ti\u1ebfp gi\u1eefa container sang container tr\u00ean c\u01a1 s\u1edf h\u1ea1 t\u1ea7ng m\u1ea1ng v\u1eadt l\u00fd (physical network infrastructure). S\u1eed d\u1ee5ng cho d\u1ecbch v\u1ee5 Docker swarm c\u00f3 th\u1ec3 li\u00ean l\u1ea1c \u0111\u01b0\u1ee3c v\u1edbi nhau<\/li><li><strong>None<\/strong>: V\u00f4 hi\u1ec7u h\u00f3a m\u1ea1ng<\/li><li><strong>Macvlan<\/strong>: Truy\u1ec1n t\u1ea3i theo \u0111\u1ecba ch\u1ec9 Mac (layer 2 trong m\u00f4 h\u00ecnh OSI). S\u1eed d\u1ee5ng khi mu\u1ed1n d\u00f9ng c\u00e1c container nh\u01b0 nh\u1eefng thi\u1ebft b\u1ecb physical devices.<br><br><\/li><\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Dockerfile<\/h3>\n\n\n\n<p><strong>Dockerfile<\/strong> l\u00e0 m\u1ed9t file d\u1ea1ng <strong>text<\/strong>, kh\u00f4ng c\u00f3 \u0111u\u00f4i, gi\u00fap thi\u1ebft l\u1eadp c\u1ea5u tr\u00fac cho <strong>docker image<\/strong> nh\u1edd ch\u1ee9a m\u1ed9t t\u1eadp h\u1ee3p c\u00e1c c\u00e2u l\u1ec7nh. T\u1eeb nh\u1eefng c\u00e2u l\u1ec7nh \u0111\u00f3, <strong>Docker<\/strong> c\u00f3 th\u1ec3 th\u1ef1c hi\u1ec7n \u0111\u00f3ng g\u00f3i m\u1ed9t <strong>docker images <\/strong>theo y\u00eau c\u1ea7u t\u00f9y bi\u1ebfn c\u1ee7a ri\u00eang b\u1ea1n.<br><br><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"531\" height=\"241\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10111714\/pasted-image-0-6.png\" alt=\"\" class=\"wp-image-497\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10111714\/pasted-image-0-6.png 531w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10111714\/pasted-image-0-6-300x136.png 300w\" sizes=\"auto, (max-width: 531px) 100vw, 531px\" \/><\/figure><\/div>\n\n\n\n<p><br><br>Gi\u1edd ta c\u1ea7n m\u1ed9t container PHP k\u1ebft n\u1ed1i v\u1edbi MySQL, c\u00f4ng vi\u1ec7c ta c\u1ea7n l\u00e0 t\u1ea1o m\u1ed9t container t\u1eeb image php v\u00e0 c\u00e0i th\u00eam extender h\u1ed7 tr\u1ee3 k\u1ebft n\u1ed1i MySQL cho PHP. V\u1edbi Dockerfile ta c\u00f3 th\u1ec3 x\u00e2y d\u1ef1ng m\u1ed9t customs image t\u1eeb image php v\u00e0 h\u1ed7 tr\u1ee3 k\u1ebft n\u1ed1i MySQL m\u1ed9t c\u00e1ch \u0111\u01a1n gi\u1ea3n nh\u01b0 sau<\/p>\n\n\n\n\n\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">FROM php:7.2-fpm\n \n# Install dependencies\nRUN apt-get update &amp;&amp; apt-get install -y\n \n# Install extensions\nRUN docker-php-ext-install pdo_mysql exif pcntl\n \nCMD [\"php-fpm\"]\n<\/pre>\n<p>C\u00e1c b\u1ea1n c\u00f3 th\u1ec3 t\u00ecm hi\u1ec3u th\u00eam v\u1ec1 dockerfile<a href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/\" target=\"_blank\" rel=\"noopener\"> t\u1ea1i \u0111\u00e2y<\/a><\/p><\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Docker-compose<\/h5>\n\n\n\n<p>Okie, v\u1eady v\u1edbi c\u00e1c c\u00e2u l\u1ec7nh trong <strong>Docker objects<\/strong> ch\u00fang ta \u0111\u00e3 c\u00f3 th\u1ec3 x\u00e2y d\u1ef1ng m\u1ed9t <strong>Container<\/strong> t\u1eeb <strong>Image<\/strong> \u0111\u01b0\u1ee3c t\u1ea3i v\u1ec1 t\u1eeb <strong>Docker registries<\/strong> (Docker hub) v\u1edbi c\u00e1c service v\u1ec1 l\u01b0u tr\u1eef v\u00e0 m\u1ea1ng b\u1eb1ng c\u00e1c Volumes &#8211; Networks. Ch\u00fang ta c\u0169ng c\u00f3 th\u1ec3 t\u1ef1 x\u00e2y d\u1ef1ng m\u1ed9t <strong>custom docker image<\/strong> b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng <strong>Dockerfile<\/strong>. V\u1eady v\u1edbi m\u1ed9t d\u1ef1 \u00e1n m\u00e0 ch\u00fang ta c\u1ea7n s\u1eed d\u1ee5ng nhi\u1ec1u container th\u00ec sao? L\u1ea7n l\u01b0\u1ee3t x\u00e2y d\u1ef1ng 5 6 c\u00e1i container nh\u01b0 v\u1eady th\u00ec kh\u00e1 m\u1ea5t th\u1eddi gian v\u00e0 c\u0169ng kh\u00f4ng vui cho l\u1eafm nh\u1ec9. \ud83d\ude42&nbsp;<br><br><\/p>\n\n\n\n<p>\u0110\u1eebng lo l\u1eafng v\u00ec \u0111\u00e3 c\u00f3 <strong>Docker-compose<\/strong> r\u1ed3i nh\u00e9. <strong>Docker-compose <\/strong>l\u00e0 m\u1ed9t c\u00f4ng c\u1ee5 tuy\u1ec7t v\u1eddi \u0111\u1ec3 \u0111\u1ecbnh ngh\u0129a v\u00e0 ch\u1ea1y nhi\u1ec1u <strong>container<\/strong> trong Docker. T\u1ea1o 1 file c\u1ea5u h\u00ecnh <strong>YAML<\/strong>, \u0111\u1ecbnh ngh\u0129a c\u00e1c services tr\u00ean \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n v\u00e0 \u0111\u1ecbnh ngh\u0129a t\u1ea5t c\u1ea3 c\u00e1c b\u01b0\u1edbc, c\u00e1c c\u1ea5u h\u00ecnh c\u1ea7n thi\u1ebft \u0111\u1ec3 x\u00e2y d\u1ef1ng c\u00e1c <strong>image<\/strong>, up c\u00e1c <strong>container<\/strong> v\u00e0 li\u00ean k\u1ebft ch\u00fang v\u1edbi nhau. Cu\u1ed1i c\u00f9ng, ch\u00fang ta c\u00f3 th\u1ec3 ch\u1ea1y t\u1ea5t c\u1ea3 <strong>container<\/strong> v\u1edbi m\u1ed9t l\u1ec7nh duy nh\u1ea5t.Nh\u01b0 v\u1eady <strong>Docker compose<\/strong> gi\u00fap ta t\u1ef1 \u0111\u1ed9ng t\u1ea3i c\u00e1c <strong>image<\/strong>, thi\u1ebft l\u1eadp c\u1ea5u h\u00ecnh t\u1ed1t h\u01a1n r\u1ea5t nhi\u1ec1u so v\u1edbi docker. N\u00f3 s\u1ebd c\u1ea7n m\u1ed9t file c\u1ea5u h\u00ecnh <strong>docker-compose.yml <\/strong>\u0111\u1ec3 ch\u1ea1y theo c\u00e1c <strong>image<\/strong> v\u00e0 c\u1ea5u h\u00ecnh trong \u0111\u00f3 \u0111\u1ec3 t\u1ea1o th\u00e0nh m\u1ed9t h\u1ec7 th\u1ed1ng c\u00e1c <strong>container<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"851\" height=\"921\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10111849\/pasted-image-0-7.png\" alt=\"\" class=\"wp-image-499\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10111849\/pasted-image-0-7.png 851w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10111849\/pasted-image-0-7-277x300.png 277w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2020\/06\/10111849\/pasted-image-0-7-768x831.png 768w\" sizes=\"auto, (max-width: 851px) 100vw, 851px\" \/><\/figure><\/div>\n\n\n\n<p><br><br>V\u00ed d\u1ee5 m\u00ecnh \u0111ang c\u1ea7n x\u00e2y d\u1ef1ng m\u00f4 h\u00ecnh g\u1ed3m Nginx &#8211; PHP &#8211; MySQL, th\u00ec m\u00ecnh c\u00f3 th\u1ec3 t\u1ea1o m\u1ed9t docker-compose \u0111\u01a1n gi\u1ea3n nh\u01b0 sau<\/p>\n\n\n\n\n\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\"># file name: docker-compose.yml\nversion: '3'\n \n# make services\nservices:\n \n # make service websever by nginx\n laravel-nginx:\n   image: nginx:1.18\n   container_name: laravel-nginx\n   hostname: nginx\n   ports:\n     - \"80:80\"\n   volumes:\n     - .\/docker\/config\/nginx\/:\/etc\/nginx\/conf.d\/\n     - .\/source\/:\/home\/website\/\n \n # make service language by PHP\n laravel-php:\n   build:\n     context: .\/docker\/config\/php\n     dockerfile: Dockerfile   \n   container_name: laravel-php\n   hostname: php\n   volumes:\n     - .\/source\/:\/home\/website\/\n   working_dir: \/home\/website\/\n \n # make service database by mysql\n laravel-mysql:\n   image: mysql:8.0.19\n   container_name: laravel-mysql\n   hostname: mysql\n   command: --default-authentication-plugin=mysql_native_password\n   environment:\n     MYSQL_DATABASE: db_laravel\n     MYSQL_ROOT_PASSWORD: 123456\n     MYSQL_USER: homestead\n     MYSQL_PASSWORD: secret\n   ports:\n     - \"3306:3306\"<\/pre>\n<p>Gi\u1edd m\u00ecnh ch\u1ec9 c\u1ea7n ch\u1ea1y l\u1ec7nh docker-compose up l\u00e0 s\u1ebd start \u0111\u01b0\u1ee3c c\u1ea3 3 d\u1ecbch v\u1ee5 n\u00e0y l\u00ean r\u1ed3i, l\u1ee3i h\u1ea1i qu\u00e1 =))<\/p><\/p>\n\n\n\n<p>Gi\u1ea3 s\u1eed m\u00ecnh kh\u00f4ng mu\u1ed1n x\u00e0i mysql 8.0.19 m\u00e0 x\u00e0i MySQL 5.7 th\u00ec m\u00ecnh ch\u1ec9 c\u1ea7n ch\u1ec9nh phi\u00ean b\u1ea3n c\u1ee7a MySQL trong file <strong>docker-compose.yml<\/strong> v\u00e0 ch\u1ea1y l\u1ea1i l\u1ec7nh <em>docker-compose up <\/em>l\u00e0 xong r\u1ed3i. Qu\u00e1 ti\u1ec7n l\u1ee3i nh\u1ec9.<br><br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">K\u1ebft<\/h2>\n\n\n\n<p>T\u00f3m l\u1ea1i, s\u1eed d\u1ee5ng docker c\u00f3 r\u1ea5t nhi\u1ec1u l\u1ee3i \u00edch cho vi\u1ec7c kh\u1edfi t\u1ea1o m\u00f4i tr\u01b0\u1eddng cho l\u1eadp tr\u00ecnh, test, deploy, microservice v\u00e0 \u0111ang l\u00e0 c\u00f4ng ngh\u1ec7 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng r\u1ed9ng r\u00e3i thay cho c\u00e1c m\u00f4i tr\u01b0\u1eddng c\u00e0i tr\u1ef1c ti\u1ebfp v\u00e0o m\u00e1y host.&nbsp;<\/p>\n\n\n\n<p>T\u00ecm hi\u1ec3u v\u1ec1 docker c\u00e1c b\u1ea1n c\u00f3 th\u1ec3 t\u00ecm hi\u1ec3u:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>C\u00e1c l\u1ec7nh <strong>Docker API<\/strong> ho\u1eb7c <strong>CLI<\/strong> \u0111\u1ec3 qu\u1ea3n l\u00fd tr\u1ef1c ti\u1ebfp c\u00e1c <strong>images<\/strong> v\u00e0 <strong>container<\/strong>.&nbsp;<\/li><li>D\u00f9ng <strong>Dockerfile<\/strong> \u0111\u1ec3 t\u00f9y bi\u1ebfn t\u1ea1o m\u1ed9t <strong>images<\/strong> theo c\u00e1c <strong>custom<\/strong> c\u1ea7n thi\u1ebft<\/li><li>D\u00f9ng<strong> Docker-compose <\/strong>\u0111\u1ec3 c\u00e0i \u0111\u1eb7t, qu\u1ea3n l\u00fd, c\u1ea5u h\u00ecnh cho nhi\u1ec1u <strong>container<\/strong><\/li><li>K\u1ebft h\u1ee3p <strong>Dockerfile<\/strong> v\u00e0 <strong>Docker-compose<\/strong> \u0111\u1ec3 x\u00e2y d\u1ef1ng m\u00f4 h\u00ecnh v\u1edbi nhi\u1ec1u t\u00f9y bi\u1ebfn h\u01a1n.<br><br><\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Tham kh\u1ea3o<\/h4>\n\n\n\n<p><a href=\"https:\/\/docs.docker.com\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.docker.com<\/a><br><a href=\"https:\/\/geekflare.com\/tag\/docker\/\" target=\"_blank\" rel=\"noopener\">https:\/\/geekflare.com\/tag\/docker\/<\/a><br><br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ch\u1eafc c\u00e1c b\u1ea1n c\u0169ng \u00edt nhi\u1ec1u \u0111\u00e3 nghe nh\u1eefng l\u1eddi \u0111\u1ed3n v\u1ec1 s\u1ef1 hay ho c\u1ee7a docker r\u1ed3i, v\u1eady docker th\u1ef1c ch\u1ea5t c\u00f3 hay ho nh\u01b0 v\u1eady kh\u00f4ng, hay ch\u1ec9 l\u00e0 m\u1ed9t m\u1edb h\u1ed7n \u0111\u1ed9n v\u1edbi m\u1ed9t \u0111\u1ed1ng l\u1ec7nh l\u1ea1 l\u00f9ng m\u00e0 dev d\u00ednh ph\u1ea3i n\u1eefa \u0111\u00e2y? B\u00e0i vi\u1ebft n\u00e0y m\u00ecnh s\u1ebd c\u00f9ng v\u1edbi c\u00e1c b\u1ea1n xem th\u1eed docker l\u00e0 g\u00ec, t\u1ea1i sao n\u00f3 l\u1ea1i \u201chot\u201d \u0111\u1ebfn th\u1ebf, c\u1ea5u tr\u00fac v\u00e0 c\u00e1ch th\u1ee9c ho\u1ea1t \u0111\u1ed9ng n\u00f3 nh\u01b0 th\u1ebf n\u00e0o. Qua \u0111\u00f3 c\u00e1c b\u1ea1n s\u1ebd c\u00f3 m\u1ed9t c\u00e1i nh\u00ecn t\u1ed5ng qu\u00e1t nh\u1ea5t v\u1ec1 Docker v\u00e0 c\u00f3 th\u1ec3 ti\u1ebfp c\u1eadn s\u1eed d\u1ee5ng n\u00f3 m\u1ed9t c\u00e1ch d\u1ec5 d\u00e0ng nh\u1ea5t.<\/p>\n","protected":false},"author":14,"featured_media":483,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[28,22],"class_list":["post-482","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology","tag-docker","tag-technical"],"_links":{"self":[{"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/posts\/482","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/comments?post=482"}],"version-history":[{"count":0,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/posts\/482\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/media\/483"}],"wp:attachment":[{"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/media?parent=482"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/categories?post=482"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/tags?post=482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}