Docker ຄືຫຍັງ? ພ້ອມການໃຊ້ງານເບື້ອງຕົ້ນ

xangnam phiasakha
VtCamp
Published in
5 min readMay 20, 2018
https://www.techrepublic.com/article/how-to-run-nginx-as-a-docker-container/

ບົດຄວາມນີ້ຈະເປັນພື້ນຖານຂອງພື້ນຖານການໃຊ້ docker ເພື່ອການສຶກສາໃນຂັ້ນ advance ກວ່ານີ້ອີກ. ສຳລັບຜູ້ຂຽນກໍຫາສຶກສາ dockeມາໄດ້ບໍນານສະນັ້ນຖ້າມີຂໍ້ຜິດພາດປະການໃດກໍຕີລັງກາສາມຕະລົບນັບສາມບາດມານະທີ່ນີ້ດ່ວຍ (ຫະຫະຫະ ^^).

Docker ແມ່ນຫຍັງ ?

ເວົ້າກັນແບບບ້ານໆເລີຍ docker ມັນແມ່ນສິ່ງທີ່ຈະເຣັດໃຫ້ເຣົາສາມາດນຳເອົາ
ໂປຮເຈັກທີ່ເຣົາພັດທະນາຂຶ້ນນັ້ນມາ Run ເປັນ product ໄດ້ງ່າຍ ແລະ ສະດວກຂຶ້ນ.
ໃນການພັດທະນາ applicatioຫນຶ່ງໆຂື້ນມານັ້ນເຣົາມັກປະສົບກັບບັນຫາເລຶ່ອງ
ການເອົາ project ຂອງເຣົາໄປຕິດຕັ້ງໃຫ້ເຄື່ອງອື່ນໆ ເພາະວ່າ ສະພາບແວດລ້ອມຂອງເຄື່ອງທີ່ເຣົາໃຊ້ພັດທະນາກັບເຄື່ອງທີ່ເຣົາໄປຕິດຕັ້ງນັ້ນຕ່າງກັນ
ຕົວຢ່າງເຊັ່ນ: ເມື່ອເຣົາພັດທະນາ application ດ່ວຍ java ທີ່ມີການຕິດຕໍກັບຖານຂໍ້ມູນທີ່ເປັນ mysql ເວລາເຣົາຈະເອົາໄປຕິດຕັ້ງໃຫ້ກັບຄົນອື່ນເຣົາຕ້ອງລົງ java
ໃຫ້ກັບເຄື່ອງນັ້ນ. ລົງ program mysql server ຍັງຕ້ອງມາ config ທີ່ application ໃຫ້ສາມາດຕິດຕໍ່ກັບຖານຂໍ້ມຸນຂອງເຄື່ອງນັ້ນໄດ້ແລະເລື່ອງອື່ນໆອີກ
ຫຼາຍບັນຫາໃຫ້ເຈັບຫົວ.ແຕ່ຖ້າໃຊ້ docker ບັນເລື່ອງເກົ່ານີ້ຈະຫມົດໄປ (ຕຽມເຈີບັນຫາໄຫມ່ໄດ້ເລີຍ ຫະຫະຫະ ^^).ແລະ ທີ່ສຳຄົນຖ້າໃຊ້ docker ເຮົາສາມາດລົບ ຫຼື ຕິດຕັ້ງ application ໄດ້ງ່າຍເວລາເຮົາ config ມັນພາດຂຶ້ນມາ.

ຕິດຕັ້ງ Docker ໃນ linux

ໃນການຕິດຕັ້ງ docker ນັ້ນສາມາດເຂົ້າໄປທີ່ເວັບໄຊຫຼັກໄດ້ທີ່ Install Docker.
ການຕິດຕັ້ງ docker ນັ້ນງ່າຍໃນ linux ພຽງແຕ່ run command ຢູ່ໃນ
CLI ດັ່ງນີ້:

$ curl -fsSL https://get.docker.com/ | sh

ພຽງເທົ່ານີ້ກໍ່ສຳເລັດ ຖ້າຕ້ອງການຕິດຕັ້ງລົງໃນເຄື່ອງທີ່ບໍ່ແມ່ນ linux ສາມາດເບິ່ງ
ລາຍລະອ່ຽດໄດ້ຕາມ link ນີ້ໄດ້ເລີຍ. Install docker on window install docker on Mac Os X ຈາກນັ້ນ
ກໍ່ທົດລອງ run command ເພື່ອຕິດຕັ້ງ container ດັ່ງນີ້:

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
535020c3e8ad: Pull complete
af340544ed62: Pull complete
Digest: sha256:a68868bfe696c00866942e8f5ca39e3e31b79c1e50feaee4ce5e28df2f051d5c
Status: Downloaded newer image for hello-world:latest
Hello from Docker.
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker Engine CLI client contacted the Docker Engine daemon.
2. The Docker Engine daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker Engine daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker Engine daemon streamed that output to the Docker Engine CLI client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker Hub account:
https://hub.docker.com
For more examples and ideas, visit:
https://docs.docker.com/userguide/

ຈາກຄຳສັງ docker ດ້ານເທິງນັ້ນແມ່ນເຮົາ run image ທີ່ຊື່ວ່າ hello-world
ເຊິ່ງຖ້າ image hello-world ບໍ່ຢູ່ໃນ local ຂອງ host ເຮົາມັນຈະໄປ pull ມາຈາກ dockerhub ມາໃຫ້ເຮົາແບບອັດໂຕໂນມັດ.

Dockerfile

ຄື file ທີ່ໃຊ້ລວມຊຸດຄຳສັງທີ່ໃຊ້ຕິດຕັ້ງ environment ໃຫ້ກັບ application
ຂອງເຮົາ ຕົວຢ່າງ Dockerfile

# Firefox over VNC
#
# VERSION 0.3
FROM ubuntu# Install vnc, xvfb in order to create a 'fake' display and firefox
RUN apt-get update && apt-get install -y x11vnc xvfb firefox
RUN mkdir ~/.vnc
# Setup a password
RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way, but it does the trick)
RUN bash -c 'echo "firefox" >> /.bashrc'
EXPOSE 5900
CMD ["x11vnc", "-forever", "-usepw", "-create"]

ຕົວຢ່າງນີ້ມາຈາກ website ຂອງທາງ docker ເອງ (ໃຫ້ credit).
ໃນການໃຊ້ງານ Dockerfile ມັນຈະຖືກ build ໃຫ້ກາຍເປັນ image
ເພື່ອນຳໄປ runເປັນ container (ເບິ່ງຫົວຂໍ້ຕໍ່ໄປ).

Docker Image

docker image ຄືຜົນໄດ້ຮັບຈາກການ build Dockerfile ທີ່ໄດ້ກ່າວໄວ້ແລ້ວ
ດ່ວຍຄຳສັ່ງ.

$ dcoker build --name some-image-name .

ຢ່າໄດ້ລືມຈຳເມັດທ້າຍຄຳສັງເດັດຂາດ ມັນເຮັດໃຫ້ຜູ້ຂຽນເຈັບຫົວ ເຈັບຕັບກັນມາແລ້ວ
(ໂອ່ຍ!!! ພະສົງ) ເຊິ່ງ docker image ນີ້ເອງທີ່ເຮົາຈະໃຊ້ run ເປັນ container ເພື່ອໃຊ້ສຳລອງເປັນສະພາບແວດລ້ອມ dev ຂອງເຮົາໃນເຄື່ອງທີ່ເປັນ production
ມັນປ່ຽບໄດ້ກັບ file excusable ຂອງ application.

Docker Container

ມັນຄືຜົນຈາກການ run Docker image ທີ່ບັນຈຸ application ທີ່ເຮົາໃຊ້ໃນການຈຳລອງສະພາບເເວ້ດລ້ອມເພື່ອ run application ທີ່ເຮົາພັດທະນາຂຶ້ນ
ຕົວຢ່າງຄຳສັ່ງ :

$ docker run -d --name some-name -p 80:80 nginx

ຈາກຄຳສັ່ງດ້ານເທິງບັນການ run image nginx.

ຕົວຢ່າງການໃຊ້ງານ Docker ຂັ້ນພື້ນຖານ

ເພື່ອເປັນການສະແດງໃຫ້ເຫັນການໃຊ້ງານ Docker ຈະຂໍ້ຍົກຕົວຢ່າງຂອງການ run ghost blog ເຊິ່ງເຄີຍອະທິບາຍໄວ້ແລ້ວຢູ່ທີ່ໂພດກ່ອນຫນ້ານີ້ ຖ້າຍັງບໍ່ໄດ້ອ່ານໃຫ້
click link ນີ້ເລີຍ: How To Install Ghost blog when use Docker. ເອົາເປັນວ່າມາເລີມໃຊ້ງານກັນ ແບບພື້ນຖານກັນເລີຍ.
ກ່ອນອື່ນນັ້ນເຮົາຈະສະແດງໃຫ້ເຫັນການໃຊ້ image ຂອງຄົນອື່ນເສຍກ່ອນຍັງຈະບໍ່ເວົ້າເຖິງການສ້າງ dockerfile ເນິື່ອງມາຈາກມັນຈະເຮັດໃຫ້ບົດຄວາມຍາວເກິນໄປ.ແຕ່ຈະເອົາໄປເວົ້າກັນໃນບົດຄວາມຕໍ່ໆໄປ.

ການ run ແລະ pull image ຈາກ dockerhub

ສຳລັບ image ຂອງ ghost blog ນັ້ນເຮົາຈະໃຊ້ image ຕາມ link ນີ້ເລີຍ
docker image.
ຄຳສັ່ງທີ່ໃຊ້ນຳເອົາ image ມາໄວ້ທີ່ເຄື່ອງຂອງເຮົານັ້ນມີຢູ່2ວິທີດ່ວຍກັນຄື່:

$ docker run -d -p 3268:3268 --name some-ghost ghost

ແລະ

$ docker pull ghost

ຄຳສັ່ງທັງ 2 ມີຄວາມແຕກຕ່າງກັນບ່ອນວ່າຄຳສັ່ງທຳອິດນັ້ນຈະເປັນການ run image ghost ໄປໃນຕົວເລີຍສ່ວນຄຳສັ່ງທີ່ສອງເປັນການດຶງ image ghost ມາເກັບໄວ້ທີ່ເຄື່ອງຂອງເຮົາຈະບໍ່ run image. ເຊິ່ງເຮົາຈະຕ້ອງມາ run image ໃນພາຍຫຼັງເອົາເອງ.ເຊິ່ງການ run image ແມ່ນໃຊ້ຄືຄຳສັ່ງທີ່ຫນື່ງ ມັນຈະບໍ່ download ຈາກ dockerhub ມາອີກ.
ແລະຄຳສັ່ງຕ່າງໆໃນການໃຊ້ງານ ghost blog ລາຍລະອຽດແມ່ນຢູ່ໃນ dockerhub
ຂອງ ghost blog ແລ້ວ.

ເບິ່ງລາຍການຂອງ docker container

ເມື່ອ run docker image ແລ້ວເຮົາຈະໄດ້ docker container ເຊິ່ງເຮົາຈະໃຊ້ຄຳສັ່ງ.

$ docker ps

ກໍ່ຈະສະແດງລາຍການ container ທີ່ເຮົາ run docker image ດັ່ງນີ້:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
a92cf3703ecf xangwebapp "pm2 start bin/www -i" 3 seconds ago Up 2 seconds test2
b50fd2aa7573 tutum/mongodb "/run.sh" 28 seconds ago Up 27 seconds 27017/tcp, 28017/tcp test1

3. ການເບິ່ງ docker image ທີ່ເກັບໄວ້ໃນເຄື່ອງຂອງເຮົາ

ເມື່ອເຮົາຕ້ອງການເບິ່ງ image ທີ່ເຮົາ pullມາເກັບໄວ້ໃນເຄື່ອງຂອງເຮົາ docker
ຈະໃຊ້ຄຳສັງ.

$ docker images

ຜົນທີ່ໄດ້ຮັບຈາກຄຳສັ່ງຂ້ອງເທິງຈະປະມານນີ້:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
xangwebapp latest 36ca762e64fe 2 weeks ago 345.7 MB
my/app latest 5ebc9e5e4cea 3 weeks ago 334.4 MB
readytalk/nodejs latest 480761f7fdd6 4 weeks ago 286.8 MB
tutum/mongodb latest 64ca9521c703 6 weeks ago 502.8 MB

ການremote ເຂົ້າໄປຂ້າງໃນ host ຂອງ container ທີ່ runຢູ່

ເມື່ອເຮົາ run docker image ແລ້ວ ເຮົາຕ້ອງການເຂົ້າໄປໃນ docker host
ຂອງ container ນັ້ນໆຈະຕ້ອງໃຊ້ຄຳສັ່ງ.

$ docker exec -it [container name] [command]

ເຊິ່ງ [container name] ແມ່ນຊື່ຂອງ container ທີ່ເຮົາກຳນົດໄວ້ໃນ
flag --name ແລະ [command] ແມ່ນ ແມ່ນ shell ທີ່ເຮົາຈະ run ໃນ docker host ຂອງ container ນັ້ນ. ຖ້າເຮົາຕ້ອງການ run shell ປະເພດ bash ເຮົາກໍ່ກຳນົດດັງນີ້.

$ docker exec -it some-name bash

ມັນກໍ່ຈະປະກົດ cli ແບບປົກກະຕິ.ເຊິ່ງເຮົາສາມາດໃຊ້ຄຳສັ່ງຫຍັງກໍ່ໄດ້ ເຊິ່ງຄຳສັ່ງນັ້ນຈະ run ຢູ່ host ຂອງ contaner ນັ້ນເທົ່ານັ້ນຈະບໍ່ມີຜົນກະທົບຫຍັງກັບ host
ຂອງເຄື່ອງເຮົາ ເພາະ docker ໄດ້ຈຳລອງ container ນັ້ນ ເປັນອີກເຄື່ອງຫນຶ່ງ.

docker communication between container

ເມື່ອເຮົາຕິດຕັ້ງ docker ມັນຈະສ້າງ network ໃຫ້ 3 network ເຊິ່ງເຮົາສາມາດໃຊ້ຄຳສັ່ງ docker network ls ເຊິ່ງຈະໄດ້:

$ docker network ls
NETWORK ID NAME DRIVER
7fca4eb8c647 bridge bridge
9f904ee27bf5 none null
cf03ee007fb4 host host

ແຕ່ໂດຍ default ແລ້ວການເຊື່ອມຕໍ່ລະຫວ່າງ container ຈະຕິດຕໍ່ຜ່ານ bridge network ນອກຈາກເຮົາສາມາດກຳນົດ network ເອງດ່ວຍ flag
--net<network>. ສຳລັບ bridge docker ຈະໃຊ້ interface
docker0.

docker0   Link encap:Ethernet  HWaddr 02:42:F9:7A:48:53
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:f9ff:fe7a:4853/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:17 errors:0 dropped:0 overruns:0 frame:0
TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1148 (1.1 KiB) TX bytes:258 (258.0 B)
eth0 Link encap:Ethernet HWaddr 08:00:27:C2:E4:61
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fec2:e461/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1660 errors:0 dropped:0 overruns:0 frame:0
TX packets:1095 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:203141 (198.3 KiB) TX bytes:174168 (170.0 KiB)

ສຳລັບການເຊື່ອມຕໍ່ລະຫວ່າງ container ນັ້ນເຮົາຈະໃຊ້ network ແບບ default ຖ້າຢາກໃຊ້ໂຕອື່ນກໍ່ໄດ້ ເຊິ່ງເຮົາຈະຕ້ອງກຳນັດ flag ໄວ້ຕອນທີ່
ເຮົາ run docker ຂຶ້ນມາ.ດັງຕົວຢ່າງຕົວຢ່າງລຸ້ມນີ້.

$ docker run -d -p 80:80 --name nginx --link <name or id>:alias nginx

<name or id> ຄືຊື່ຂອງ container ຫຼື id ຂອງ container ນັ້ນ
alias ຄືຊື່ທີ່ຈະຖືກກຳນົດລົງໃນ file host ຂອງ docker host ເພື່ອເປັນຕົວແທນ ip ຂອງ container ນັ້ນໆ.

ການຄອບຄຸບ container

ເມື່ອເຮົາ run container ຂຶ້ນມາແລ້ວເຮົາສາຄອບຄຸມຈັດການ container ໄດ້ອີກດ່ວຍ ເຊັ່ນ:restart,stop,remove container.

restart container

$ docker restart <container name>

ລົບ contianer

$ docker rm <container name>

ເຮົາສາມາດໃຊ້ flag -f ເພື່ອລົບ container ເຖິງມັນຈະ run ຢູ່ພ້ອມດ່ຽວກັນນັ້ນກໍ່ລົບຊື່ທີ່ໃຊ້ອ້າງອີງ container ອີກດ່ວຍ.

stop container

$ docker stop <container name>

ນີ້ເປັນຄຳສັ່ງເບື້ອງຕົ້ນເທົ່ານັ້ນທີ່ໃຊ້ຈັດການ container ສາມາດສຶກສາເພີມເຕີມໄດ້ທີ່ເວັບໄຊຫຼັກຂອງ Docker.

ການລົບ image

ຖ້າຕ້ອງການລົບ image ອອກຈາກເຄື່ອງຂອງເຮົາສາມາດໃຊ້ຄຳສັງດົ່ງນີ້:

$ docker rmi <image:tag>

ສຳລັບ <image:tag> ແມ່ນຊື່ແລະ tag ຂອງມັນ ສາມາດໃຊ້ຄຳສັ່ງ
docker images ເບິ່ງລາຍລະອ່ຽດໄດ້. ຖ້າເຮົາໄດ້ run image ນັ້ນໄວ້ແລ້ວ
ແລະຜູ້ມັນກັບຊື່ໃດໜຶ່ງຈະບໍ່ສາມາດລົບມັນອອກໄດ້ຈະຕ້ອງໃຊ້ flag -f.

ສະຫຼຸບ

ຈາກທີ່ໄດ້ບອກເລົ່າເວົ້າສູ່ຟັງຂ້າງເທິງນັ້ນເປັນພຽງສ່ວນຫນຶ່ງຂອງ docker ເທົ່ານັ້ນ
ມັນຍັງມີອີກຫຼາຍຢ່າງ ແລະ ຄວາມເປັນໄປໄດ້ຫຼາຍໆຫົນທາງ. ສຳລັບນັກພັດທະນາຄິດວ່າໃນອານາຄົດ docker ຈະຕ້ອງມີບົດຕໍ່ການພັດທະນາ application ໂດຍສະເພາະ web application ທີ່ມີຄວາມຫຼາກຫຼາຍໃນການພັດທະນາ ຖ້າຈະນຳໄປຕິດຕັ້ງໃຊ້ເປັນ production ກໍ່ຄອນຂ້າງຍາກລຳບາກ. ແຕ່ຖ້າໃຊ້ docker ບັນຫານີ້ຈະຫຼຸດລົງໄດ້ຫຼາຍເລີຍ. ມັນດີແບບໃດນັ້ນກໍ່ລອງຟັງຄຳຂວັນຂອງ
Docker

" Build, Ship, and Run Any App, Anywhere "

ຂອບໃຈທີ່ອ່ານຈົນຈົບ ຂອບໃຈໂຕເອງທີ່ຂຽນຈົນຈົບບົດຄວາມ ສາມາດຕິດຕາມບົດຄວາມ docker ໄດ້ໃນພາຍພາກໜ້າ (ຫະຫະຫະຫະຫະຫະ). ^^(ຈົບແລ້ວ)^^

--

--