Difference between revisions of "Docker"
From CMU ITSC Network
| Line 198: | Line 198: | ||
* โดยปกติกรณีสั่ง run container ถ้าไม่ได้ระบุ option เกี่ยวกับ network, container จะต่อเข้ากับ network bridge และกำหนด ip address ให้โดยอัตโนมัติ<br>[[File:Bridge1.png|link=]]  | * โดยปกติกรณีสั่ง run container ถ้าไม่ได้ระบุ option เกี่ยวกับ network, container จะต่อเข้ากับ network bridge และกำหนด ip address ให้โดยอัตโนมัติ<br>[[File:Bridge1.png|link=]]  | ||
<syntaxhighlight lang=powershell>  | <syntaxhighlight lang=powershell>  | ||
| + | PS D:\> docker run -d --name nginx nginx  | ||
| + | 4b0f396b24625fdae8066723efe76bb53b2e60031780e1b5bb168ace1161b5fa  | ||
PS D:\> docker inspect bridge  | PS D:\> docker inspect bridge  | ||
[  | [  | ||
| Line 244: | Line 246: | ||
     }  |      }  | ||
]  | ]  | ||
| + | PS D:\> docker stop nginx  | ||
| + | nginx  | ||
| + | PS D:\> docker rm nginx  | ||
| + | nginx  | ||
</syntaxhighlight>  | </syntaxhighlight>  | ||
Revision as of 05:25, 12 March 2019
What is Docker
- Software Container เป็นการสร้างสภาพแวดล้อมสำหรับ software โดยแยกออกออกมาเพื่อไม่ให้กวนกับ software อื่น ๆ บนระบบปฏิบัติการเดียวกัน สามารถนำ Container ไปทำงานบนเครื่องไหนก็ได้จะได้ผลเหมือนกัน
 - Docker เป็น engine ในการจัดการ Software Container ที่ใช้งานได้ง่าย ไม่ซับซ้อน เป็นที่แพร่หลาย
 - Container VS VM

*image from https://www.docker.com 
Pain point
- ต้องติดตั้ง ตั้งค่า server ที่จะรัน Application
 - ไม่สามารถติดตั้งหรืออัพเกรด Library บางอย่างบน OS ได้เนื่องจากกระทบกับ Application อื่น
 - เครื่อง Dev กับ Production ไม่เหมือนกัน
 
Docker Architecture
Docker Engine
- Docker Client คือพวก CLI ของ Docker ที่ใช้ในการจัดการ
 - Docker Daemon คือ service ของ Docker ที่รันบน Server เราจะเรียก Server นี้ว่า Docker Machine
 
Docker Hub
- เป็น Repository หรือเรียกว่า Registry ทำหน้าที่ให้บริการ Docker Image มี Image ของผู้พัฒนาโปรแกรมต่าง ๆ ให้ใช้งาน มีการจัดเก็บ version ของ image อย่างเป็นระบบ มีเอกสารคู่มือการใช้งาน Image
 
โดยให้บริการที่ https://hub.docker.com ใช้งานได้ฟรี
- สามารถสร้าง Private Registry บน Server เองได้
 
Docker Image
- เป็น Template ที่สร้างขึ้นโดยนักพัฒนาเป็นชุดของ Software/Library สามารถดึง(pull)มาจาก Registry เพื่อใช้งานหรือสร้างขึ้นมาเองได้
 - เป็นไฟล์แบบอ่านอย่างเดียว
 
Docker Container
- คือ Image ที่ถูกรันขึ้นมาใช้งาน โดยจะมีสภาพแวดล้อมตาม Image ต้นแบบ
 - ไฟล์หรืออะไรที่ถูกสร้างขึ้นมาใน Container จะหายไปเมื่อมีการลบ Container
 - สามารถการเปลี่ยนแปลงใน Container กลับไปเป็น Image ได้เรียกว่า commit
 
Docker Machine
- Docker Desktop for Windows https://docs.docker.com/docker-for-windows/install/
 - Docker for Ubuntu https://docs.docker.com/install/linux/docker-ce/ubuntu/
 
Workshop 1 : pull image
เปิด powshell ขึ้นมา แล้วพิมพ์คำสั่งในการ pull image
docker pull mysql:latest
docker pull ubuntu:latest
docker pull alpine
แสดง image ที่อยู่บนเครื่อง
docker images
REPOSITORY                 TAG                    IMAGE ID            CREATED             SIZE
mysql                      latest                 91dadee7afee        2 days ago          477MB
ubuntu                     latest                 47b19964fb50        4 weeks ago         88.1M
alpine                     latest                 caf27325b298        5 weeks ago         5.53MB
Workshop 2 : General Commands
| Command | Description | 
| docker build | Build an image from a Dockerfile | 
| docker commit | Create a new image from a container’s changes | 
| docker container | Manage containers | 
| docker cp | Copy files/folders between a container and the local filesystem | 
| docker exec | Run a command in a running container | 
| docker image | Manage images | 
| docker images | List images | 
| docker inspect | Return low-level information on Docker objects | 
| docker logs | Fetch the logs of a container | 
| docker network | Manage networks | 
| docker ps | List containers | 
| docker pull | Pull an image or a repository from a registry | 
| docker push | Push an image or a repository to a registry | 
| docker restart | Restart one or more containers | 
| docker rm | Remove one or more containers | 
| docker rmi | Remove one or more images | 
| docker run | Run a command in a new container | 
| docker stats | Display a live stream of container(s) resource usage statistics | 
| docker stop | Stop one or more running containers | 
| docker tag | Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE | 
| docker top | Display the running processes of a container | 
| docker volume | Manage volumes | 
https://docs.docker.com/engine/reference/commandline/docker/
Workshop 3 : push image
- สมัครบัญชี https://hub.docker.com
 - เข้าสู่ระบบแล้วสร้าง repository 
 - tag image เป็นชื่อบัญชีที่สร้าง
 
docker tag alpine:latest [accountname]/alpine:latest
- แสดงรายการ image
 
docker images
alpine                     latest                 caf27325b298        5 weeks ago         5.53MB
supawit/alpine             latest                 caf27325b298        5 weeks ago         5.53MB
- login เข้า hub.docker.com ด้วยบัญชีที่สร้าง
 
docker login -u [accountname]
- push image ที่ tag ไว้ขึ้น repository บน registry
 
docker push [accountname]/alpine:latest
Workshop 4 : Run Container
Interactive
- run container แบบ interactive terminal โดยให้ชื่อ container เป็น nginx และ map port 8080 ที่ docker machine เข้าไปเป็น port 80 ใน container
 
docker run -it --rm --name nginx -p 8080:80 nginx
- ทดสอบเปิด browser http://localhost:8080
 - ตรวจสอบ container
 
docker ps -a
- Ctrl+C เพื่อจบการทำงาน
 
Detach
- run container แบบ detach
 
docker run -it -d --name nginx -p 8080:80 nginx
- ทดสอบเปิด browser http://localhost:8080
 - ตรวจสอบ container
 
docker ps -a
- ทดสอบเข้า shell ใน container ด้วยการส่งคำสั่งไปทำงานบน container ที่ทำงานอยู่
 
docker exec -it nginx bash
- การหยุด/เริ่ม container
 
docker stop nginx
docker start nginx
- ลบ container
 
docker rm nginx
Docker Network
- เบื้องต้อน docker จะมี network มาให้ 3 รูปแบบ
 
PS D:\> docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
749dc07193c8        bridge              bridge              local
1e55901ecd55        host                host                local
98f00c775b7d        none                null                local
- bridge เป็น default network ที่ container เชื่อมสู่ภายนอกผ่าน virtual switch docker0 ผ่าน routing ของ virtual network ที่สร้างขึ้นด้วย docker engine
 - host เป็น network ที่ container ใช้ network interface ของ docker machine host
 - none เป็น network loopback ของ container ไม่มีการเชื่อมต่อสู่ภายนอก
 
- โดยปกติกรณีสั่ง run container ถ้าไม่ได้ระบุ option เกี่ยวกับ network, container จะต่อเข้ากับ network bridge และกำหนด ip address ให้โดยอัตโนมัติ

 
PS D:\> docker run -d --name nginx nginx
4b0f396b24625fdae8066723efe76bb53b2e60031780e1b5bb168ace1161b5fa
PS D:\> docker inspect bridge
[
    {
        "Name": "bridge",
        "Id": "749dc07193c80a8efd89629be5ab4abf8252fdb04d837ebec95176bdde50c293",
        "Created": "2019-03-12T03:41:54.6066118Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "4b0f396b24625fdae8066723efe76bb53b2e60031780e1b5bb168ace1161b5fa": {
                "Name": "nginx",
                "EndpointID": "d884ba8b25e4f665a6f232d9971c4255b9c53b54e2c222c94926a44970c80ba2",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
PS D:\> docker stop nginx
nginx
PS D:\> docker rm nginx
nginx