Docker

From CMU ITSC Network

What is Docker

  • Software Container เป็นการสร้างสภาพแวดล้อมสำหรับ software โดยแยกออกออกมาเพื่อไม่ให้กวนกับ software อื่น ๆ บนระบบปฏิบัติการเดียวกัน สามารถนำ Container ไปทำงานบนเครื่องไหนก็ได้จะได้ผลเหมือนกัน
  • Docker เป็น engine ในการจัดการ Software Container ที่ใช้งานได้ง่าย ไม่ซับซ้อน เป็นที่แพร่หลาย
  • Container VS VM
    Docker-containerized-and-vm-transparent-bg.png
    *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-image-container.png

Docker Machine

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
    Create-repo.PNG
  • 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
docker ps -a
  • Ctrl+C เพื่อจบการทำงาน

Detach

  • run container แบบ detach
docker run -it -d --name nginx -p 8080:80 nginx
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 ให้โดยอัตโนมัติ
    Bridge1.png
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