# Docker Basic (part 2)

ကျနော်တို့ ဒီ အပိုင်းမှာ nginx container လေးကိုဆောက်ကြည့်ကြမယ်။ ဘာလို့ nginx လဲဆိုတော့ သူကဆောက်ပြီးသား image ရှိတယ်(ကိုယ်တိုင် ဆောက်စရာမလို၊ Dockerfile ကိုယ်တိုင်ရေးစရာမလို)။ပြီးတော့ သူက browser ကနေလှမ်း access လုပ်လို့ရတဲ့ sample page လေးပါတယ်။ အဲ့တာကြောင့် run နေမှန်း လွယ်လွယ်ကူကူသိရတယ်။ ဒီ အပိုင်းကို လိုက်လုပ်ဖို့ docker desktop ကို install ပြီးသားဖြစ်ရပါမယ်။ ပြီးတော့ Docker Basic (part 1) ကိုဖတ်ပြီးသားဖြစ်ရင်ပိုကောင်းပါတယ်။

**Get Nginx image**

အရင်ဆုံးကျနော်တို့ docker hub ([https://hub.docker.com/](https://hub.docker.com/) [](https://hub.docker.com/))ကိုသွားလိုက်မယ်။ ပြီးရင် nginx ဆိုပြီး search box မှာ ရှာ၊ result ထဲက nginx ဆိုတာကို click လိုက်ရင် အောက်က page လေးကျလာမယ်။

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688572674795/2a8fb22f-20b0-4078-bd3e-9cea747a4577.png align="center")

အဲ့ဒီမှာ Supported tags ဆိုတဲ့အပိုင်းလေးကို တချက်ကြည့်ကြည့်ပါ။ အဲ့တာက ကျနော်တို့ nginx imge မှာရနိုင်တဲ့ tag တွေရဲ့ list ဖြစ်တယ်။ tag ဆိုတာက docker image ရဲ့ version တွေလို့ ယူဆလို့ရတယ်။ ကျနော်တို့က nginx ရဲ့ 1.25.1 version ကို လိုချင်တယ်ဆိုပါစို့။

```bash
docker pull nginx:1.25.1
```

ဆိုပြီး terminal မှာရိုက်လိုက်ရင် သူ့ဘာသူ download လုပ်သွားလိမ့်မယ်။ download လုပ်လိုက်တဲ့ image ဘယ်ရောက်သွားလဲကျနော်တို့သိစရာမလိုဘူး။ docker engine ကအဲ့တာတွေကို handle လိမ့်မယ်။ ဘာလို့လဲဆိုတော့ အဲ့ဒီ image ကို container ဆောက်တဲ့အခါကျရင်လည်း docker engine ကပဲဆောက်ပေးမှာကိုး။ ကျနော်တို့ docker pull nginx ဆိုပြီး tag မထည့်ပဲ ရိုက်လိုက်ရင်လည်းရတယ်။ အဲ့ဒီကျရင် default tag ဖြစ်တဲ့ latest ဆိုတဲ့ tag ကိုသုံးသွားလိမ့်မယ်။ latest ဆိုတဲ့ tag က image ရဲ့ latest အဖြစ်ဆုံး version ကိုရည်ညွှန်းပါတယ်။

အဲ့တာဆို အခု ကျနော်တို့ မှာ nginx image လေးရလာပြီ။ ကိုယ့် ရဲ့ local မှာရှိိတဲ့ images တွေကို ကြည့်ချင်ရင်

```bash
docker images
```

ဆိုတဲ့ command လေးနဲ့ကြည့်လို့ရတယ်။

**Build container from image**

```bash
docker run nginx:1.25.1
```

အပေါ်က command လေးကို terminal မှာ ရိုက်လိုက်မယ်။ အဲ့တာဆို start ဖြစ်ပြီးသား container လေးတစ်ခုရသွားလိမ့်မယ်။ သူက အလုပ် ၂ ခုလုပ်ပေးပါတယ်။

1. image ကနေ container တည်ဆောက်ပေးပါတယ်။
    
2. ဆောက်လိုက်တဲ့ container ကို start ပေးပါတယ်။
    

docker ps ဆိုတဲ့ command လေးနဲ့ start ဖြစ်နေတဲ့ container တွေကို ကြည့်လို့ရတယ်။ ပုံမှန်ဆို nginx install ပြီးသွားရင် browser ထဲသွားပြီး [localhost](http://localhost) လို့ရိုက်ကြည့်လိုက်ရင် nginx ရဲ့ welcome page လေးကျလာလိမ့်မယ်။ အဲ့ဒီတော့ အခုbrowser မှာ [localhost](http://localhost) ဆိုပြီးရိုက်ကြည့်မယ်။ ဘာမှကျလာမှာမဟုတ်ဘူး။ ဘာလို့လဲဆိုတော့ container တွေက host os ကနေ isolate လုပ်ထားတဲ့ environment မှာ run နေလို့ဖြစ်တယ်။ ctrl + c နှိပ်ပြီး container ကိုခနရပ်လိုက်မယ်။

**Accessing Application**

nginx က port 80 မှာ run တယ်။ ဒါဆို ခုနက container ရဲ့ port 80 မှာ nginx က active ဖြစ်နေလိမ့်မယ်။ ဒါပေမဲ့ container ဆိုတာ က host os ကနေ isolate ဖြစ်နေတဲ့ အတွက် host os က nginx service run နေမှန်း သိမှာမဟုတ်ဘူး။ ဒါဆို ကျနော်တို့က application ကိုဘယ်လို access လုပ်ကြမလဲ။ ရှင်းပါတယ် container ရဲ့ port 80 ကို လက်ရှိ host os ရဲ့ port တစ်ခုခုနဲ့ ချိတ်ပေးဖို့လိုက်မယ် ။ အဲ့လို ချိတ်ပေးဖို့ docker run command မှာ -p ဆိုတဲ့ flag လေးထည့်ပေးလိုက်လို့ရတယ်။

```bash
docker run -p 1234:80 nginx:1.25.1
```

ဆိုပြီးရိုက်ကြည့်မယ်။ ပြီးရင် ကျနော်တို့ browser ထဲသွားပြီး [localhost:1234](http://localhost:1234) ကို၀င်ကြည့်ကြည့်မယ်။ welcome page လေးတွေ့ရပါပြီ။ ဘာတွေဖြစ်သွားတာလဲဆိုတော့ container လေးရဲ့ port 80 ကို ကိုယ့် host os ကြီးရဲ့ port 1234 နဲ့ချိတ်ပေးလိုက်တယ်။ အဲ့ဒီတော့ browser ကနေ [localhost:1234](http://localhost:1234) ကို သွားကြည့်လိုက်တဲ့အခါမှာ container ရဲ့ port 80 ဆီကိုရောက်သွားတာဖြစ်တယ်။ container ရဲ့ port 80 မှာက nginx run နေတယ်။ ဒါကြောင့် nginx welcome page လေးထွက်လာတာပါ။ ctrl + c နှိပ်ပြီး ရပ်လိုက်မယ်။

**Running in background mode**

ပြသနာတစ်ခုကျန်နေသေးတယ်။ ခုနက docker run -p 1234:80 ဆိုပြီးရိုက်လိုက်တော့ command line မှာ process ကြီးက တန်းလန်းကြီးပွင့်နေတယ်။ ကျနော်တို့ ctrl + c နှိပ်လိုက်ရင် အဲ့ဒီ container က ရပ်သွားလိမ့်မယ်။ ကျနော်တို့ nginx ကို access လုပ်လို့ရတော့မှာ မဟုတ်ဘူး။ အဲ့ဒီတော့ ဒါကြီးကအဆင်မပြေဘူး။ ကျနော်တို့ container ကို အဲ့လို terminal မှာတန်းလန်း ပွင့်နေတာမဟုတ်ပဲ။ background မှာ run ရမယ်။ အဲ့ဒီအတွက် -d ဆိုတဲ့ flag လေးထည့်ပေးလို့ရတယ်။

```bash
docker run -d -p 1234:80 nginx:1.25.1
```

ဆိုပြီးရိုက်ကြည့်လိုက်မယ်။ container id အပြည့်အစုံကို echo ပြပြီး process ကနောက်ကွယ်မှာ run နေလိမ့်မယ်။ ဒါဆို ကျနော်တို့ terminal ကိုဖွင့်ထားစရာမလိုပဲ container ကို run နေလို့ရပြီ။ ဒါပေမယ့် ဘယ်လို container ကိုဘယ်လို ပြန်ရပ်ရမလဲ။ ကျနော်တို့ ctrl + c နှိပ်လို့မရတော့ဘူး။

**Starting/Stoping/Removing Containers**

```bash
docker ps 
```

ဆိုတဲ့ command လေးရိုက်လိုက်ရင် run နေတဲ့ container တွေကျလာလိမ့်မယ်။ အဲ့ဒီမှာ CONTAINER ID ဆိုတဲ့ field လေးပါတယ်။ သူ့တန်ဖိုးက 516e32dd898f အဲ့ဒီလို random character တွေပါတဲ့ စာစုလေးဖြစ်လိမ့်မယ်။

```bash
docker stop 516e32dd898f
```

docker stop container\_id ဆိုတဲ့ command လေးကိုရိုက်လိုက်ရင် container က stop သွားလိမ့်မယ်။ continer\_id နေရာမှာ ကျနော်တို့ docker ps ကနေ ရလာတဲ့ container id လေးထည့်ပေးရပါမယ်။ အပေါ်မှာကျနော်ပြထားတာ က နမူနာ container id ပါ။ စာဖတ်သူအတွက် ဆိုအဲ့ဒီ id ကတူမှာမဟုတ်ပါဘူး ။ stop သွားကြောင်း docker ps ဆိုတာကို ရိုက်ပြီးပြန်ကြည့်လို့ရတယ်။ ခုနက run နေတဲ့ container လေးရှိတော့မှာမဟုတ်ဘူး။

stop သွားတဲ့ container လေးကိုပြန် start ချင်ရင်

```bash
docker start 516e32dd898f
```

docker start container\_id ဆိုတဲ့ command လေးနဲ့ပြန် start လို့ရတယ်။

container ကို တစ်ခါထဲဖျက်ပစ်ချင်ရင်

```bash
docker rm 516e32dd898f
```

အပေါ်က command လေးနဲ့ဖျက်ပစ်လို့ရပါတယ်။ ဒါပေမဲ့ သူက stop ပြီးသား container တွေကိုပဲ ဖျက်လို့ရပါတယ်။ အဲ့လိုမဟုတ်ဘဲ run နေတဲ့ container ကိုတစ်ခါထဲ stop ပြီးဖျက်ပစ်ချင်ရင် -f ဆိုတဲ့ flag လေးထည့်ပေးလိုက်လို့ရပါတယ်။

```bash
docker rm -f 516e32dd898f
```

တစ်ခုသတိထားရမှာက container ကိုဖျက်ပြီးသွားရင် docker start container\_id နဲ့ container ကိုပြန် run လို့မရတော့ပါဘူး။ docker run ဆိုတဲ့ command ကိုပြန်သုံးပြီး image ကနေ container အသစ်ပြန်ဆောက်ပေးမှရပါမယ်။

**Giving name to containers**

ကျနော်တို့မှာ ပြသနာ တစ်ခုကျန်ပါသေးတယ်။ အဲ့တာက container\_id ပါ။ သူက random စာစုလေးဖြစ်တဲ့အတွက်မှတ်ရမလွယ်ပါဘူး။ ကျနော် container တစ်ခု start/stop ချင်ရင် docker ps ရိုက် copy သွားကူးအဲ့လိုလုပ်နေမှသာ ရမယ်ဖြစ်နေပါတယ်။ အဲ့တာကို ဖြေရှင်းလို့ရပါတယ်။ အဲ့တာက — name ဆိုတဲ့ flag လေးပါ။ အဲ့တာကို container ဆောက်တဲ့အခါ (docker run ဆိုတဲ့ command run တဲ့အခါမှာ) ထည့်ပေးလို့ရပါတယ်။

```bash
docker run --name demo-app -dp nginx:1.25.1
```

container ကိုအဲ့လိုဆောက်လိုက်မယ်ဆို ကျနော် တို့ docker start/stop လုပ်တဲ့အခါ container id အစား

```bash
docker stop demo-app
```

```bash
docker start demo-app
```

အဲ့လိုရေးလို့ရပါပြီ။ အခုဆို ကျနော်တို့ container လေးတစ်ခုကို ဘယ်လိုစဆောက်ရမလဲ ဘယ်လို run ရမလဲ နားလည်သွားပါပြီ။ command တွေကို အကျဥ်းချုပ်ပြီးပြန်ကြည့်ကြည့်ရအောင်

```bash
docker pull imagename:tagname
```

image ကို download လုပ်တဲ့ command ပါ။

```bash
docker run --name containerName -dp hostOsPort:containerPort imagename:tagname
```

image ကနေ container တည်ဆောက်တဲ့ command ပါ။

— name က container ကို container id အစား နံမည်နဲ့သုံးလို့ရအောင်နံမည်လေးပေးလိုက်တာပါ။  
\-d က container ကို terminal မှာတန်းလန်းပွင့်နေမယ့်အစား background မှာ run ဖို့သုံးတာပါ။  
\-p က container port ကို host os port နဲ့ bind ပေးဖို့သုံးပါတယ်။

```bash
docker start containerId/name
```

container ကို start ဖို့သုံးပါတယ်။ သတိထားရမှာက အခုကို container ကို စလို့ရတဲ့ command က ၂ခုရှိပါပြီ။ docker run နဲ့ docker start ပါ။ docker run က image name ကိုထည့်ပေးရပြီး docker start က container id or name ကိုထည့်ပေးရပါတယ်။

```bash
docker stop containerId/name
```

container ကို stop ဖို့သုံးပါတယ်။

```bash
docker ps -a
```

docker ps ဆိုပြီးရိုက်လိုက်ရင် run နေတဲ့ containers တွေကိုပြပါလိမ့်မယ်။ -a ဆိုတဲ့ flag လေးထည့်လိုက်ရင်တော့ stop နေတဲ့ container တွေရော run နေတဲ့ container တွေရောအကုန်ပြပါလိမ့်မယ်။

```bash
docker images
```

ကိုယ့်စက်ထဲမှာရှိနေတဲ့ docker images တွေကိုပြပါလိမ့်မယ်။
