Category: Virtual Machine

  • แนวทางการพัฒนา Web Application ด้วย django จาก local docker สู่ Google Cloud Run

    ในการพัฒนาแอพพลิเคชั่น เราก็จะเจอปัญหานึงเสมอ ๆ คือ เวอร์ชั่น (Version) ของเครื่องมือที่ใช้ในการพัฒนานั้น แต่ละโปรเจคมีความแตกต่างกัน เช่น ในกรณีของ การพัฒนา Web Application ด้วย django web framework เราอาจจะอยากใช้ python รุ่นล่าสุด คือ 3.8 แต่ในขณะเดียวกัน เมื่อหลังบ้านต้องการไปติดต่อ Tensorflow 2.0 ซึ่งยังต้องใช้งานกับ Python 3.6 เป็นต้น วิธีแก้ไขปัญหาทั่วไปคือ ติดตั้ง package ‘virtualenv’ เพื่อให้การพัฒนาแต่ละโปรเจค มี Environment แตกต่างกันได้

    แต่จากการใช้งานจริง พบว่า สุดท้าย ตอนเอาไป Production บนเครื่อง Server ก็ต้องตามไปติดตั้งเครื่องมือ และรุ่นที่ถูกต้อง แม้ใน Python จะมีคำสั่ง pip install -r requirements.txt ก็ตาม แต่ก็ยังไปติดปัญหาว่า OS ของเครื่องที่จะ Production นั้น รองรับรุ่นของเครื่องมืออีกหรือไม่ด้วย

    แนวทางการใช้ Container ด้วย Docker จึงเป็นที่นิยม เพราะ เมื่อเราพัฒนาเสร็จแล้ว สามารถ Pack เข้าไปใน Container แล้วเอาไป Deploy ได้ โดย (แทบจะ) ไม่ต้องกังวลกับ Environment ปลายทาง อีกทั้ง ยังสามารถทดสอบ Environment ใหม่ ๆ ก่อนจะ Deploy ได้ด้วย เช่นการเปลี่ยนรุ่นของ Python เป็นต้น

    ในบทความนี้ จะนำเสนอ แนวทางการสร้าง docker container เพื่อใช้เป็นฐานในการพัฒนา django และ สามารถต่อยอด ติดตั้ง package อื่น ๆ ตามต้องการ ตั้งแต่ Development ไปจนถึง Deployment สู่ Serverless Environment อย่าง Google Cloud Run

    สร้าง Development Container

    เริ่มจาก สร้างโฟลเดอร์ใหม่ขึ้นมา ในนั้นมี 2 ไฟล์ คือ Dockerfile และ requirements.txt กับ โฟลเดอร์ ชื่อ code

    Dockerfile

    • ใช้ image ของ python เป็นรุ่น 3.7-slim ซึ่งตัดส่วนที่ไม่จำเป็นออกแล้ว (ไม่ใช้ alpine เนื่องจาก พบรายงานว่า แม้จะมีขนาดเล็กกว่า แต่ถูกจำกัดทรัพยากรบางอย่าง ทำให้ทำงานได้ช้ากว่า)
    • สร้าง /code แล้วเข้าไปใช้พื้นที่นี้ (เหมือนคำสั่ง mkdir /code ; cd /code อะไรประมาณนั้น)
    • สั่งให้ copy ไฟล์ requirements.txt ไปใช้ที่ root ( / )
    • จากนั้น Upgrade คำสั่ง pip เป็นรุ่นล่าสุด แล้ว ติดตั้ง package ตามที่กำหนดใน requirements.txt
    • เปิด Port 8080 ไว้ เพื่อใช้ในการทดสอบ และเป็นไปในแนวทางเดียวกับการใช้บน Google Cloud Run ต่อไป
    FROM python:3.7-slim
    WORKDIR /code/
    COPY requirements.txt /
    RUN pip install -U pip \
        && pip install -r /requirements.txt
    EXPOSE 8080

    requirements.txt

    ในการพัฒนา django เมื่อทำการติดตั้ง package ใดเพิ่มเติมด้วยคำสั่ง pip install ก็จะบันทึกรายการ พร้อมรุ่นของ package มาในไฟล์นี้ ในที่นี้ ใช้ django, guincorn และ whitenoise เป็นหลัก (จะมีรายการ dependency ติดเข้ามาด้วย)

    Django==2.2.6
    gunicorn==19.9.0
    pytz==2019.3
    sqlparse==0.3.0
    whitenoise==4.1.4

    จากนั้นใช้คำสั่งต่อไปนี้ สร้าง (build) docker image จากไฟล์ Dockerfile ข้างต้น โดยมี option ที่เกี่ยวข้องดังนี้

    docker build --rm -f "Dockerfile" -t mydjango:dev .
    • –rm เมื่อ build แล้ว ก็ลบ container ชั่วคราวทิ้ง
    • -f กำหนดว่าจะเรียกจากไฟล์ใด วิธีนี้ มีประโยชน์ เวลาที่จะต้องมี Dockerfile ทั้ง Development และ Production ในโฟลเดอร์เดียวกัน ซึ่งจำเป็นต้องใช้ชื่อไฟล์ที่แตกต่างกัน
    • -t เป็นตั้งชื่อ docker image และ ชื่อ tag
    • . คือ ให้ build จากตำแหน่งปัจจุบัน

    ขั้นตอนนี้จะได้ docker image ชื่อ mydjango และมี tag เป็น dev แล้ว้

    (ในที่นี้ พัฒนาบนเครื่องคอมพิวเตอร์ที่เป็น Windows 10 ซึ่ง %CD% จะให้ค่า Current Directory แบบ Absolute path ออกมา เช่นเดียวกับบน Linux ที่ใช้ $(pwd) )

    ต่อไป สั่ง run ด้วยคำสั่ง และ options ดังต่อไปนี้

    docker run --rm -it -p 8080:8080  -v %CD%\code:/code  mydjango:dev bash
    • –rm เมื่อจบการทำงาน ก็ลบ container ชั่วคราวทิ้ง
    • -it คือ interactive และเปิด TTY
    • -p เพื่อเชื่อม port 8080 จากภายนอก เข้าไปยัง port 8080 ภายใน container
    • -v เพื่อเชื่อม Volume หรือโฟลเดอร์ของเครื่อง host กับ /code ภายใน container ขั้นตอนนี้สำคัญ
    • bash ข้างท้าย เพื่อส่งคำสั่ง เรียก bash shell ขึ้นมา ซึ่งจะสัมพันธ์กับ -it ข้างต้น ทำให้สามารถใช้งาน shell ภายใน container ได้เลย

    ผลที่ได้คือ bash shell และ อยู่ที่ /code ภายใน container

    root@757bcbb07c7f:/code#

    ตอนนี้ เราก็สามารถสร้าง django ได้ตามปรกติแล้ว (คลิกดูตัวอย่างเบื้องต้น) แต่ในตัวอย่างนี้ จะเริ่มจากการสร้าง project ชื่อ main เพื่อใช้ในขั้นตอนต่อไป ด้วยคำสั่งต่อไปนี้

    django-admin startproject main
    cd main

    ในระหว่างการพัฒนา สามารถใช้คำสั่ง runserver โดยเปิด Port 8080 ใน container เพื่อทดสอบได้ดังนี้ (สอดคล้องตามที่อธิบายข้างต้น)

    python manage.py runserver 0.0.0.0:8080

    สร้าง Production Docker Image

    คำสั่งข้างต้น สามารถใช้ได้เฉพาะขั้นตอนการพัฒนา แต่เมื่อพัฒนาเสร็จแล้ว ควรใช้ Application Server แทน ในที่นี้จำใช้ gunicorn แต่ก่อนอื่น จะต้องปรับ Configuration ของ django ให้พร้อมในการ Deployment ก่อน

    main/settings.py

    # แก้ไข
    DEBUG = False
    ALLOWED_HOSTS = ['localhost','SERVICE-ID.run.app']
    
    # เพิ่ม
    MIDDLEWARE = [
        ...
        # Whitenoise
        'whitenoise.middleware.WhiteNoiseMiddleware',
        ...
    ]
    # เพิ่ม
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

    มีเพิ่มเติมคือ whitenoise ซึ่งเป็น package สำหรับจัดการเกี่ยวกับการให้บริการ static file ในตัว มิเช่นนั้นจะต้องไปตั้งค่าใน Web Server ให้จัดการแทน

    เมื่อเราตั้งค่า DEBUG = False จะต้องกำหนด ALLOWED_HOSTS เสมอ ในที่นี้กำหนดให้เป็น localhost และ Production URL (SERVICE-ID.run.app) ที่จะเกิดขึ้นเมื่อสร้าง Service บน Google Cloud Run ครั้งแรกไปแล้ว (ค่อยกลับมาแก้ไขแล้ว Revision อีกครั้ง)

    ใช้คำสั่งต่อไปนี้เพื่อรวบรวม static files ต่าง ๆ มาไว้ในที่เดียวกัน ในที่นี้ คือที่ โฟลเดอร์ static

    python manage.py collectstatic

    ทดสอบ Production ด้วย gunicorn ด้วยคำสั่งต่อไปนี้

    gunicorn --bind 0.0.0.0:8080 main.wsgi

    ทดสอบเรียก Local Admin Console ( http://localhost:8080/admin ) ดู ถ้าเรียก static file เช่นกลุ่ม css ได้ ก็พร้อมสำหรับจะนำขึ้น Google Cloud Run ต่อไป

    สุดท้าย สร้าง Production Dockerfile และ สรุป requirements.txt ดังนี้

    Dockerfile.production

    FROM python:3.7-slim
    WORKDIR /code
    COPY ./code/* ./
    RUN pip install -U pip \
        && pip install -r requirements.txt
    EXPOSE 8080
    CMD [ "gunicorn","--bind","0.0.0.0:8080", "main.wsgi"]

    requirements.txt

    pip freeze > requirements.txt

    จากนั้น ใช้คำสั่งต่อไปนี้ เพื่อสร้าง Production Docker Image (ออกมาจาก Development Container shell ก่อน) โดยจะใช้ tag เป็น latest

    docker build -t mydjango:latest -f "Dockerfile.production" .

    ส่ง Production Docker Image ขึ้น Google Container Registry

    Google Cloud Run จะเรียกใช้ docker image ที่อยู่บน Google Container Registry เท่านั้น

    • เปิด Google Console
    • สร้าง Project ใหม่ และ ตั้งค่า Billing
    • เปิดใช้งาน Google Cloud Run และ Google Container Registry
    • ติดตั้อง Google Cloud SDK เพื่อให้สามารถ push ขึ้นได้ และ ยืนยันตัวตนด้วย Google Account

    แล้วใช้คำสั่งต่อไปนี้ เพื่อ tag

    docker tag mydjango:latest gcr.io/YOUR-GCP-PROJECT-ID/SERVICE-NAME
    • YOUR-GCP-PROJECT-ID เป็น Project ID ที่สร้างขึ้น
    • SERVICE-NAME ชื่อ service ที่จะสร้าง

    แล้วก็ push ขึ้น Google Container Registry

    docker push gcr.io/YOUR-GCP-PROJECT-ID/SERVICE-NAME

    สร้าง Google Cloud Run Service

    สร้าง Service โดยเลือก Image ที่ต้องการ

    เมื่อเสร็จแล้วจะได้ URL อย่าลืมเอาไปแก้ไขใน main/settings.py ในส่วนของ ALLOWED_HOSTS แทน SERVICE-ID.run.app

    จากนั้น build, tag และ push ขึ้น Google Cloud Registry อีกครั้ง แล้ว Deploy New Revision เป็นอันเรียบร้อย

    อันนี้เป็นการ Proof of Concept ในบทความต่อไป จะนำเสนอตัวอย่างการใช้งานจริงครับ

  • แลกเปลี่ยนเรียนรู้ Virtual Desktop Infrastructure (VDI)

    ผมได้จัดแลกเปลี่ยนเรียนรู้ เรื่อง “การจัดการห้องบริการคอมพิวเตอร์ในแนวทาง Virtual Desktop Infrastructure” เมื่อวันที่ 11 มิถุนายน 2562 ณ ห้องปฏิบัติการคอมพิวเตอร์ 3 งานเทคโนโลยีสารสนเทศ ฝ่ายสารสนเทศและทรัพยากรการเรียนรู้ อาคารวิทยบริการ ชั้น 3 มหาวิทยาลัยสงขลานครินทร์ วิทยาเขตตรัง

    คิดว่านำมาเล่าสู่กันฟังในที่นี้น่าจะเกิดประโยชน์

    คุณลักษณะของระบบ

    • VMware vSphere ESXi 6.7 เป็น software จัดการ server
    • Dell EMC PowerEdge Systems เป็น hardware ชนิด Rack Server จำนวน 5 เครื่อง แต่ละเครื่องมี RAM 512 GB มี GPU ชนิด NVIDIA Tesla M10 32 GB และมี SAN Storage ขนาด 50 TB
    • L2/3 network switch ที่มี 10 G Base-T จำนวน 2 ตัว
    • VMware Horizon 7 เป็น software สำหรับทำ VDI
    • เครื่องที่ให้ใช้งานเป็น PCoIP zero client จำนวน 480 ชุด
    • user account เป็น Local Microsoft AD สำหรับห้องคอม

    ประโยชน์ที่ได้รับจากการแลกเปลี่ยนเรียนรู้ในครั้งนี้

    • ได้ทดลองใช้งานเป็นผู้ใช้งาน
    • ได้รับข้อคิดเห็นจากประสบการณ์ใช้งานตั้งแต่จัดซื้อเป็นเวลาเกือบ 1 ปีแล้ว
    • ได้เห็นวิธีการ cloning VM ทำภายใน server สะดวกมาก เพราะ zero client ไม่มี hard disk เป็นแค่จอภาพ+อุปกรณ์เชื่อมต่อกับ server

    สิ่งที่ต้องเตรียมพร้อมในการนำระบบ VDI ไปใช้งาน

    • ผู้ดูแลต้องมีความรู้เกี่ยวกับระบบ Virtualization Technology
    • ผู้ดูแลต้องมีความรู้เกี่ยวกับ DHCP Sever, DNS Server
    • ผู้ดูแลต้องมีความรู้เกี่ยวกับ Microsoft AD
    • ผู้ดูแลต้องมีความรู้พื้นฐานการจัดการ PC , Windows
    • ผู้ดูแลควรมีการติดตั้งและทดสอบโปรแกรมที่จะนำมาใช้กับระบบ VDI
    • ผู้ดูแลต้องมีความรู้เกี่ยวกับระบบ Server และ Network
    • ระบบไฟฟ้าและเครื่องปรับอากาศภายในห้อง Data Center ที่มีประสิทธิภาพ

    ปัญหาที่เจอในการใช้งานระบบ VDI

    • vcenter ล่ม (ระบบไฟฟ้าภายในห้อง Data Center มีปัญหา,ไฟล์สำคัญโดนลบ)
    • การ Clone เครื่อง (ใช้งานได้ไม่ครบทุกเครื่อง)
    • ค่า Error ไม่สื่อความหมาย (Clone แล้วเครื่องไม่พร้อมใช้งาน)
    • ข้อมูลทั้งระบบมีขนาดที่โตขึ้น (การเก็บข้อมูลในเครื่องผู้ใช้งาน Drive C,D)
    • ทรัพยากรไม่เพียงพอเมื่อมีการสร้างเครื่องใช้งานเยอะเกินไป ต้องประเมิน Disk Storage ให้เพียงพอ
    • ปัญหาเกี่ยวกับ user account ที่จะใช้ VM ในตอนแรกจะให้ใช้ Microsoft AD ของมหาวิทยาลัย แต่เนื่องจาก AD ของมหาวิทยาลัยไม่ได้ออกแบบมาให้คอนฟิกได้ง่าย จึงเปลี่ยนเป็นสร้าง Local AD ผูกกับ zero client เป็นเครื่อง ๆ ไป เปิดเครื่อง กด Enter ก็เข้าถึงหน้าต่าง Windows ราว ๆ 30-40 วินาที

    ข้อดีของการนำระบบ VDI มาใช้งาน

    • การบริหารจัดการเครื่องมีประสิทธิภาพขึ้น เมื่อเทียบระหว่าง Zero Client กับ PC
    • ประหยัดพลังงาน เมื่อเทียบระหว่าง Zero Client กับ PC
    • ลดอุณหภูมิภายในห้อง LAB Computer เมื่อเทียบระหว่าง Zero Client กับ PC
    • มีความยืดหยุ่นในการใช้งานทรัพยากร เมื่อเทียบระหว่าง Zero Client กับ PC
    • ประหยัดพื้นที่บนโต๊ะภายในห้อง LAB Computer เมื่อเทียบระหว่าง Zero Client กับ PC
    • การ Backup ข้อมูลทั้งระบบทำได้ง่าย เมื่อเทียบระหว่าง Zero Client กับ PC

    ถาม-ตอบ ที่พอจะประมวลได้จากการพูดคุย

    ถาม: วิทยาเขตตรัง มีนโยบายการให้บริการห้องคอมพิวเตอร์สำหรับการเรียนการสอน กี่แบบ
    ตอบ: มีแบบเดียว คือ มีเครื่องให้ใช้ร่วมกัน เก็บบันทึกไฟล์ไว้เอง เนื่องจากระบบ VDI ที่จัดซื้อทรัพยากรไม่เพียงพอที่จะสร้าง VM แยกให้นักศึกษาหรือให้แต่ละวิชา

    ถาม: ระบบนี้มีค่าใช้จ่ายเท่าไร แยกเป็นค่าอะไรบ้าง ขอทราบ specification ที่ใช้งานอยู่
    ตอบ: ไม่สามารถระบุเฉพาะระบบ VDI ได้ เพราะเป็นการเช่ารวมกับ PC และ Notebook อีกจำนวนหนึ่ง (ประมาณหยาบ ๆ ได้เครื่องละ 20,000 บาท/3ปี หรือ คิดเป็นค่าใช้เครื่อง 18 บาท/วัน) ส่วนการกำหนด VDI specification ได้คำนวณจากปริมาณ (PC, RAM และ Disk) ที่ต้องการใช้งาน บวกส่วนเผื่อไว้อีก 25%

    ถาม: ระบบนี้น่าจะเหมาะกับคณะที่ให้บริการห้องคอมพิวเตอร์สำหรับการเรียนการสอนการติดตั้งโปรแกรมหรือไม่
    ตอบ: ทำได้เพราะเปิดสิทธิ Administrator เหมือนกับ PC

    ถาม: ระบบนี้น่าจะเหมาะกับหน่วยงานที่ให้บริการฝึกอบรมหรือไม่
    ตอบ: ขึ้นอยู่กับความพร้อมของ data center ให้บริการได้ต่อเนื่องหรือไม่ และโปรแกรมที่อบรมได้ทดสอบติดตั้งใช้งานแบบ VDI ได้

    ถาม: ระบบนี้ดีกว่าระบบเก่าอย่างไร
    ตอบ: มีความยืดหยุ่นในการเพิ่มทรัพยากรให้ zero client ที่ต้องการใช้มาก ๆ ปรับเปลี่ยนได้สะดวก การ cloning สามารถ remote เข้าทำได้ที่ server ไม่ต้องทำที่ห้องคอม

    ถาม: ตั้งแต่เริ่มใช้ระบบนี้มีการประเมินการใช้งานแล้ว คุ้มหรือไม่คุ้ม ดีหรือไม่ดี อย่างไร
    ตอบ: ยังไม่ได้ประเมิน

    ขอขอบคุณข้อมูลที่ได้รับจาก presentation ของคุณพงษ์พันธ์ ประพันธ์ หัวหน้าฝ่ายสารสนเทศและทรัพยากรการเรียนรู้ มหาวิทยาลัยสงขลานครินทร์ วิทยาเขตตรัง

  • Virtual data center with OpenNebula

    OpenNebula เป็นชื่อของ open source software สำหรับทำ virtual data center เวอร์ชั่นล่าสุดคือ 5.6.1 (https://opennebula.org)

    ผมได้ทดลองในห้องปฏิบัติการ และเขียนเป็นขั้นตอนการติดตั้งจนกระทั่งได้ VM ขึ้นมา แต่ยังไม่ลงรายละเอียดถึงขั้นใช้งาน storage network ได้ ซึ่งจะได้ทดลองกันต่อไป

    ในตอนนี้ จะเรียกว่า basic set up ก็ได้นะ ในการ set up ระบบจริงตามคำแนะนำ แต่ละเครื่องควรมี network card 2 cards เพื่อแยกระหว่าง network ที่ให้บริการ กับ Management network

    การ set up จะต้องมีเครื่องที่เป็น Front-end เพื่อทำหน้าที่เป็น database และเว็บเพจสำหรับทำ configuration และสั่งการ และจะต้องมีเครื่องที่เป็น Hypervisor อย่างน้อย 1 เครื่อง โดยเลือกได้ว่าจะใช้ KVM หรือ vcenter สเปคเครื่อง hypervisor นี้ต้องรองรับ Virtualization extensions (Intel VT-x or AMD-V)

    เตรียมการทดลองโดยใช้ เครื่องคอมพิวเตอร์ที่ผมนำมาใช้มี 3 เครื่อง อายุเครื่องก็พอสมควร (ตามกำลังทรัพย์ที่มีในห้องปฏิบัติการ) แต่ทั้ง 3 เครื่องนี้ มีเพียง 1 network card ครับ เครื่อง Front-end 1 เครื่อง สเปค Pentium(R) Dual-Core CPU E5200 @ 2.50GHz มี RAM 4 GB อันนี้เป็นเครื่องทั่วไปที่รัน apache2 web server และ mariadb database ได้ ใช้เครื่อง KVM จำนวน 2 เครื่อง เพื่อจะให้เห็นว่าสามารถสร้าง VM ไปที่ KVM node ที่ต้องการได้ เครื่อง KVM node01 เป็น AMD Phenom(tm) II X4 945 Processor มี RAM 8 GB และ KVM node02 เป็น Intel(R) Core(TM) i5 CPU M 520 @ 2.40GHz มี RAM 4 GB

    นอกจากเครื่องคอมฯ แล้ว ผมก็มี network switch (L2-managed) เพื่อกำหนด port ให้รองรับ 802.1Q VLAN ผมออกแบบให้มี 2 VLAN คือ VLAN ID 6 (untagged) และ VLAN ID 7 (tagged) ซึ่ง VLAN 6 ก็คือ ครึ่งแรกของ network class C 192.168.6.0 เขียนแบบ CIDR 192.168.6.0/25 มี gateway คือ 192.168.6.1 และ VLAN 7 ก็คือ ครึ่งหลังของ network 192.168.6.128/25 มี gateway คือ 192.168.6.129

    ผมเขียนขั้นตอนไว้ในเว็บไซต์ opensource.psu.ac.th จะสะดวกกว่านำมาใส่ไว้ในบล็อกนี้ทั้งหมด เข้าไปที่ https://opensource.cc.psu.ac.th/Ubuntu1804 ก็จะเห็น link ต่อไปนี้

    แล้วจะมานำเสนอเรืองราวถัดไปครับ

  • รวมร่าง Windows กับ Linux ใช้งานในเครื่องเดียวกันแบบเนียนๆ

    จุดประสงค์

    สามารถใช้งาน Windows กับ Linux ได้ในเครื่องเดียวกันและในเวลาเดียวกันเหมือนเป็นทองแผ่นเดียวกัน แก้ปํญหา Dev / SysAdmin ส่วนใหญ่ที่ต้องใช้ Linux เป็นหลักในการทำงานแต่ต้องเผื่อใจต้องทำงานบน Windows ด้วยในบางเวลา เช่น ทำเอกสาร MS Word ไม่ให้เพี้ยน หรือ Adobe PhotoShop หรือโปรแกรมที่ไม่สามารถทำการติดตั้งลงใน Linux ได้ และที่สำคัญคือการทำงานระหว่างสองระบบต้องไหลลื่นและรวดเร็ว ประหยัด กินทรัพยากรน้อย

    หากยังนึกภาพไม่ออก สามารถดูวิดีโอนี้ครับ  Windows 10 + Linux Lite (Seamless) 

    สเปกเครื่อง

    สามารถใช้บน windows 7, 8, 10 แต่ขอให้มี RAM อย่างน้อย 4 GB จะดีมากถ้า RAM 8 GB แต่ในที่นี้จะเป็นการติดตั้งและใช้งาน Linux บน Windows 10 64 bit  

    (more…)
  • Choose Network Type In VirtualBox

    เมื่อต้องไปจัดอบรม และต้องใช้ Oracle VM VirtualBox สำหรับสร้าง Virtual Machine (VM) จำนวนหนึ่ง (มากกว่า 1 ตัว ฮ่า ๆ) เราจำเป็นจะต้องรู้ว่า สภาพแวดล้อมของห้องบริการคอมพิวเตอร์ที่เราไปขอใช้งานนั้น จัด IP ให้กับเครื่อง Windows แบบใด เช่น ในกรณีที่มีการปล่อย DHCP IP แบบเหลือเฟือ การเลือกชนิด network ของ VM แต่ละตัว ก็ง่าย เราก็เลือกตั้งค่าเป็น Bridges ซึ่งแบบนี้ VM แต่ละตัวก็จะได้ IP อยู่ในชุดเดียวกันกับ Windows แต่หากจัด IP แบบตายตัวให้กับ MAC Address ของ PC นั้นเลย และไม่ปล่อย DHCP IP เพิ่มให้ อย่างนี้ เราก็ต้องออกแบบว่าจะให้ VM (Guest) เหล่านั้นใช้ IP อะไร จะทำงานร่วมกันได้อย่างไร และจะให้ VM เหล่านั้น ติดต่อกับ Windows (Host) ด้วยหรือไม่

    แบบแรก NAT Network

    แบบนี้ VirtualBox จะสร้าง network จำลองขึ้นมาในโปรแกรมมันเองเท่านั้น ผลลัพธ์คือ VM (Guest) ทุกตัวจะทำงานร่วมกันได้ แต่จะติดต่อกับ Windows (Host) ไม่ได้ แบบนี้ VM (Guest) ทุกตัวจะได้รับ IP อยู่ในชุดที่ใช้สำหรับ NAT นั่นคือ 10.0.2.0/24 และ VM แต่ละตัวเมื่อได้ IP จะได้ค่า IP ของ DNS server ที่เครื่อง Windows ใช้งานมาให้ด้วย ทำให้ VM สามารถติดต่อไปใช้งาน Internet ได้

    ตัวอย่างเช่น VM 2 ตัว ตั้งค่า network ชนิด NAT Network

    VM ตัวที่ 1 จะได้ IP 10.0.2.6 และได้ค่า IP DNS Server ชุดที่ใช้ใน Windows (Host) ใช้งาน Internet ได้เลย

    VM ตัวที่ 2 ได้ IP 10.0.2.15 และใช้คำสั่ง ping ไปยัง VM ตัวที่ 1 ได้

    แต่ Windows (Host) จะใช้คำสั่ง ping VM ทั้ง 2 ตัว ไม่ได้

    สำหรับวิธีการตั้งค่า NAT Network ก็เข้าไปที่ File > Preferences > Network  และเราสามารถแก้ หรือ เพิ่มใหม่ ได้

    แบบที่สอง Host-Only Adapter

    แบบนี้ VirtualBox จะสร้าง Virtual network adapter เพิ่มลงใน Windows OS ให้ด้วย ผลลัพธ์คือ VM (Guest) ทุกตัวจะทำงานร่วมกันได้ และติดต่อกับ Windows (Host) ได้ แต่แบบนี้ VM (Guest) ทุกตัวจะได้รับ IP ในชุด 192.168.56.0/24 (ค่า default ซึ่งเราจะเปลี่ยนได้) แต่ VM แต่ละตัวจะได้มาเพียง IP จะไม่ได้ค่า IP ของ DNS server ที่เครื่อง Windows ใช้งาน ส่งผลให้ VM ไม่สามารถติดต่อไปใช้งาน Internet ได้ แต่ก็แก้ปัญหานี้ได้โดยการเพิ่ม Network Adapter อันที่สอง และตั้งค่า network เป็นชนิด NAT แล้วไป config ให้มีการ start network interface อันที่สองนี้ใน VM (Guest)

    ตัวอย่าง VM 2 ตัว ตั้งค่า network ชนิด Host-only Adapter

     

    Windows (Host) ได้ IP เพิ่มขึ้นมาคือ 10.0.0.1 (ผมแก้ค่า default มาเป็นอันใหม่ เดิม 192.168.56.1)

    VM 1 ได้ IP 10.0.0.101

    VM 2 ได้ IP 10.0.0.102

    Windows ใช้คำสั่ง ping ไปยัง VM 1 ได้

    VM 1 ใช้คำสั่ง ping ไปยัง VM 2 ได้

    VM 1 ไม่ได้ค่า IP DNS server ในไฟล์ /etc/resolv.conf ทำให้ติดต่อใช้งาน Internet ไม่ได้

    ต้องปิด VM แล้ว เราต้องเพิ่ม Adapter อันที่ 2 ให้เป็น NAT

    เปิด VM จากนั้นเข้าไปใน VM ในตัวอย่างคือ Ubuntu 16.04.4 server ให้เพิ่ม Add NAT interface แล้ว reboot

    ข้อความที่เพิ่มคือ (ชื่อ interface enp0s8 จะเปลี่ยนไป อาจไม่ใช่ชื่อนี้ เช็คด้วย ifconfig -a)

    auto enp0s8

    iface enp0s8 inet dhcp

    จะเห็นว่า มี network interface 2 อัน อันที่เพิ่มมาเป็น NAT มี IP เป็น 10.0.3.15

    ตอนนี้จะได้ค่า IP DNS Server อยู่ใน /etc/resolv.conf ทำให้ใช้งาน Internet ได้

    สำหรับวิธีการเปลี่ยนค่า ชุด IP ของ Host-Only Adapter ทำดังนี้ ผมทำการเปลี่ยนตัวเลขชุด 192.168.56 ทุกแห่งที่แท็บ Adapter และแท็บ DHCP Server

    ต้องไป disable และ enable VirtualBox Host-only Network ที่ Windows ด้วย แล้วปิดเปิดโปรแกรม VirtualBox

    แบบที่สาม Internal Network

    แบบนี้ VirtualBox ไม่ได้สร้าง network จำลอง และไม่ได้สร้าง Virtual network adapter เพิ่มลงใน Windows OS แต่ได้เตรียมชื่อไว้ให้ว่า Intnet (ค่า default) ผลลัพธ์คือ แบบนี้ VM (Guest) ทุกตัว จะต้องตั้งค่า IP เองก่อนจึงทำงานร่วมกันได้ และไม่สามารถติดต่อกับ Windows (Host) ได้ และ ไม่สามารถติดต่อไปใช้งาน Internet ได้ แต่ก็แก้ปัญหานี้ได้โดยการสร้าง VM (Guest) 1 ตัว ให้ทำหน้าที่เป็น Router นั่นคือ มี Network Adapter อันที่ 1 เป็นชนิด NAT และมี Network Adapter อันที่ 2 เป็นชนิด Internal Network (ชื่อ Intnet) เมื่อสร้าง Router นี้ขึ้นมา ก็จะทำให้ VM (Guest) ทุกตัวติดต่อกับ Internet ได้ แต่ตัว Router ต้องทำหน้าที่เป็นทั้ง DHCP Server และ DNS Server เพื่อแจก IP ให้กับ VM และ แจกค่า IP ของ DNS Server ให้ด้วยตามลำดับ การตั้งค่าแบบที่สามนี้ ดู ๆ ไปก็น่าจะยุ่งยากมากในการเตรียม แต่ก็มีความสามารถที่เพิ่มมาคือ เราสามารถจำลองระบบเครือข่ายได้ เช่น สามารถสร้างโดเมนเนมให้กับ VM ที่ทำหน้าที่เป็น Web Server ได้ด้วย เช่น เราอาจจะตั้งชื่อ zone ว่า example.com แล้วเราให้ VM Web Server นี้มีชื่อโดเมนเนมว่า wordpress1.example.com อย่างนี้ เราทำได้

    ตัวอย่างเช่น VM 2 ตัวที่ตั้งค่า network แบบ Internal Network

    ผมมี myrouter.ova ให้ download ไปใช้ โดยการ import เข้าก็ใช้ได้เลย หากจะเล่าว่าต้องติดตั้งอะไรบ้างคงจะยาวมาก ๆ เอาเป็นว่า ใน myrouter.ova นี้ ผมได้ติดตั้ง DHCP Server ใช้ค่า 10.0.100.0/24, DNS Server ใช้ชื่อโดเมนคือ example.com, Apache2 Web Server และผมมี LDAP Database ou=lulu,ou=example,ou=com ไว้ให้ทดสอบ ด้วยครับ

    VM ตัวพิเศษ ทำหน้าที่เป็น Router จะมี Network Adapter 2 อัน อันแรกเป็น NAT อันที่สองเป็น Internal Network ชื่อ Intnet (ชื่อนี้เป็นค่า default เราเปลี่ยนได้)

    VM ตัวที่ 1 ตั้งค่า network ชนิด Internal Network

    VM ตัวที่ 2 ตั้งค่า network ชนิด Internal Network

    หวังว่าคงจะได้นำไปประยุกต์ใช้งานกันนะครับ

  • วิธีขยาย Disk ใน VM/Virtualbox แล้วให้ Ubuntu

    ในกรณีใช้ VMWare/VirtualBox  บางครั้งเราต้องการขยาย Disk ให้ Ubuntu มีพื้นที่มากขึ้น

    1. เดิมมี Disk 100 GB
    2. แก้ไขให้เป็น 300 GB
    3. Login เข้าไป ดูข้อมูล ด้วยคำสั่ง df -h จะเห็น 100 GB อยู่

      แล้ว sudo reboot
    4. ลอง Login ใหม่ แล้วใช้คำสั่ง
      sudo su
      fdisk -l

      ก็จะ ขนาดเพิ่มเป็น 300 GB
      จากนั้นใช้คำสั่ง

      growpart /dev/sda 1
      resize2fs /dev/sda1

      แล้วลอง

      df -h


      ก็จะพบว่า ได้ขนาดมาเป็น 300 GB แล้ว

  • GCP #01 วิธีการสร้าง Virtual Machine บน Google Cloud Platform

    ขั้นตอน

    1. มี Google Account
    2. ไปที่ https://console.cloud.google.com/start
    3. สำหรับคนที่ใช้ครั้งแรก ควรจะใช้สิทธิ์ Free Trial 300 USD / 12 Month

    4. ในการใช้งาน จะต้องมี Billing Account โดยต้องกรอกข้อมูล บัตร Credit/Debit ซึ่งต้องเป็น VISA/MasterCard เท่านั้น และต้องไม่ใช่ Prepaid ด้วย
      https://cloud.google.com/billing/docs/how-to/payment-methods#add_a_payment_method
    5. เมื่อเสร็จแล้วจะได้ Credit อย่างนี้
    6. ต่อไป สร้าง Virtual Machine กัน
      ไปที่ เมนู > Cloud Launcher

      จะเห็นได้ว่า ตอนนี้ระบบจะสร้าง “My First Project” ไว้ให้ ซึ่งเราสามารถ สร้าง Project ใหม่ก็ได้ แต่ตอนนี้ใช้อย่างนี้ไปก่อน
    7. ต่อไป จะลองสร้าง Ubuntu Server ขึ้นมาใช้งาน ในที่นี้จะสร้าง Ubuntu 14.04
      พิมพ์ Ubuntu ในช่องค้นหา แล้ว เลือก Ubuntu 14.04
    8. จากนั้น คลิก Launch on Compute Engine
    9. ตั้งชื่อตามต้องการ (ถ้าต้องการ)
    10. สามารถเลือก Zone และ Machine Type ได้ตามความเหมาะสม ซึ่งจะมีราคาแตกต่างกัน
    11. ค่าเริ่มต้น Machine Type: n1-standard-1 จะให้ 1 vCPU, 3.75 GB RAM และ 10 GB standard persistent disk หากต้องการ Disk เพิ่ม สามารถคลิก Change เพื่อเพิ่มได้​ (standard persistent disk จะราคาถูกกว่า ssd มาก)
    12. ต่อไป กำหนดเรื่องเของ Firewall ถ้าให้บริการ HTTP/HTTPS ก็คลิกเลือกได้เลย
      ในกรณีที่ต้องการกำหนดค่าอื่นๆ เช่น Disk, Network, SSH Key ให้คลิก “Management, disks, networking, SSH keys”
      เสร็จแล้วกดปุ่ม Create
    13. รอสักครู่ ก็จะได้ VM มาใช้งานแล้ว
    14. ในที่นี้ จะได้ External IP ซึ่งใช้ในการติดต่อจาก Internet มา แต่หากมีการ Restart/Stop IP address นี้ก็จะเปลี่ยนไป (การ Fix มีค่าใช้จ่ายนิดหน่อย) และ การติดต่อไปยัง VM ก็สามารถทำได้ โดยการคลิก SSH ซึ่งสามารถเข้าถึงได้จาก Console นี้ หากต้องการใช้งานจาก Client อื่นก็ทำได้ แต่ต้องกำหนด SSH Key กันนิดหน่อย ซึ่งจะกล่าวในภายหลัง
    15. เพิ่มเติม ในกรณีต้องการเปิด Port เพิ่มที่ไม่ใช่ HTTP/HTTPS ให้คลิกที่ Menu > Network Services > Firewall Rules

      แล้วกำหนดค่าตามต้องการ โดยการ Create Firewall Rule

    หวังว่าจะเป็นประโยชน์ครับ

  • เตาะแตะไปกับ Docker ตอนที่ 13 Docker Machine

    Docker Machine คือ tool ที่ใช้สำหรับจัดเตรียม (Provision) docker เป็น virtual hosts บน Mac หรือ Windows รวมถึง ติดตั้งเพิ่ม docker บน Native Linux Host ที่มีอยู่แล้วในเครือข่ายของคุณ ยิ่งไปกว่านั้นยังสามารถจัดเตรียม docker ไปบน cloud providers เช่น Azure, AWS, or Digital Ocean เป็นต้น

    Docker Machine จัดการ remote docker host เหล่านี้ด้วยการใช้คำสั่ง docker-machine

    การติดตั้ง Docker Machine ขึ้นอยู่กับว่าจะใช้บนระบบปฏิบัติการอะไร ถ้าเป็น Windows ก็ให้ติดตั้ง Docker for Windows ซึ่งจะได้ Docker Engine และ Docker Machine มาด้วยเลย แต่ถ้าระบบปฏิบัติการ Windows นั้นไม่ผ่าน requirements ที่จะรัน Docker for Windows ได้ คุณก็เปลี่ยนไปติดตั้ง Docker Toolbox แทนได้ ซึ่งต้องใช้ร่วมกับ Oracle VM VirtualBox แทน Hyper-V

    การใช้งาน Docker Machine จาก Windows ที่ติดตั้ง Docker Toolbox
    Docker Machine จะสร้าง VM พร้อมติดตั้ง Docker Engine ให้ด้วย
    ตัวอย่างการใช้งาน ทำนองนี้

    docker-machine create --driver virtualbox vm1

    เมื่อจะเข้าไปใช้เครื่อง vm1 ทำดังนี้

    eval "$(docker-machine env vm1)"

    และทำคำสั่งอีก 1 คำสั่งตามที่มีข้อความแสดงขึ้นมา

    ตอนนี้เราก็สามารถใช้งาน docker ที่เครื่อง vm1 ได้แล้ว เช่น ทดสอบว่า docker ทำงานได้แล้ว

    docker run hello-world

    ออกโดยใช้คำสั่ง

    exit

    หรือหากต้องการรันคำสั่งครั้งเดียวที่เครื่อง vm1 โดยไม่ต้องเข้าไป ก็ใช้คำสั่งทำนองนี้

    docker-machine ssh vm1 "docker ps"

     

    การติดตั้ง Docker Machine บนระบบปฏิบัติการ Linux

    สำหรับการติดตั้ง Docker Machine บนระบบปฏิบัติการ Linux (ทดสอบกับ Ubuntu 16.04 server) จะต้องใช้คำสั่งดังนี้

    curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && \
    chmod +x /tmp/docker-machine && \
    sudo cp /tmp/docker-machine /usr/local/bin/docker-machine

     

    การใช้งาน Docker Machine จาก Linux เพื่อติดตั้ง docker engine ไปบน ubuntu ที่ยังไม่ได้ติดตั้ง docker ไว้ (To provision Docker hosts on remote systems)

    จะมีขั้นตอนหลายขั้นดังนี้

    1. ที่เครื่องใช้งานที่เราติดตั้ง docker-machine ไว้ ให้เราสร้าง public, private key pair ด้วยคำสั่ง “ssh-keygen -t rsa” และไม่ต้อง protect private key ด้วย password ด้วยนะ เพราะว่า docker-machine ทำงานไม่ได้

    2. ส่ง public key ด้วยคำสั่ง “ssh-copy-id” ไปยัง Linux host ที่เราจะจัดการ

    3. ที่ Linux host ที่เราจะจัดการ ต้องอนุญาตให้ใช้คำสั่ง sudo แบบ passwordless เพื่อให้ docker-machine สามารถ access เข้าไปได้ ทำด้วยคำสั่ง “sudo visudo” และเพิ่มบรรทัดนี้ต่อท้ายไฟล์
    %sudo ALL=(ALL) NOPASSWD:ALL

     

    เพิ่มเติม

    หากต้องการใช้ docker-machine จาก Windows ไป provision linux host ก็ให้ก็อปปี้ private key ไปใส่ใน Windows host ก่อนที่จะรัน docker-machine โดยตรวจสอบให้แน่ใจว่า ssh ใช้ key นี้ได้ด้วยคำสั่ง “ssh -i <private key> <userid>@<host>” ซึ่งเป็นการทดสอบว่าเรา ssh เข้าไปยัง Linux host นั้นได้โดยไม่ต้องใส่ password

     

    สำหรับการใช้ Docker Machine เพื่อติดตั้ง docker engine ไปบน cloud providers นั้นก็สามารถใช้ได้ แต่ในเอกสารของ docker แนะนำให้ใช้ Docker Cloud จะดีกว่า เนื้อหาส่วนนี้ผมจะไม่ลงรายละเอียด ให้อ่านเพิ่มเติมจากอ้างอิงด้านล่าง

     

    การใช้งานคำสั่ง docker-machine เพื่อสั่งทำงาน Swarm Cluster

    ต่อไปเป็นตัวอย่างที่ประกอบด้วยเครื่องจำนวน 2 เครื่อง เครื่องแรกเป็น swarm manager และเครื่องที่สองเป็น swarm worker ซึ่งเรื่องนี้ เราได้ทดสอบการทำงานแบบ manual ไปแล้วใน “เตาะแตะไปกับ Docker ตอนที่ 3 Swarm” ซึ่งผู้อ่านจะพบว่าในบทความตอนที่ 3 นั้น เราจะต้องแก้ไขชื่อ hostname ให้กับ ubuntu server ที่จะเป็น swarm manager และ ที่จะเป็น swarm worker แต่ตอนนี้ docker-machine จะช่วยเราตั้งชื่อ hostname ในไฟล์ /etc/hosts และ /etc/hostname ให้อัตโนมัติ และติดตั้ง Docker Engine ให้ด้วย

    ตัวอย่าง ผมทดสอบด้วย VM จำนวน 3 เครื่อง ใช้ username ชื่อ mama ดังนี้
    เครื่อง A
    – Ubuntu server
    – IP 10.0.2.9
    เครื่อง B
    – Ubuntu server
    – IP 10.0.2.10
    เครื่อง C
    – Ubuntu server ที่ได้ติดตั้ง docker-machine เพิ่มแล้ว
    – IP 10.0.2.11

     

    คำสั่งที่ทำที่เครื่อง A และ B

    sudo visudo

    เพิ่มบรรทัดนี้ต่อท้าย (ผมใช้ username ชื่อ mama ที่อยู่ใน group sudo ในการรัน docker)

    %sudo ALL=(ALL) NOPASSWD:ALL

     

    คำสั่งที่ทำที่เครื่อง C

    ssh-keygen -t rsa
    ssh-copy-id -i ~/.ssh/id_rsa.pub mama@10.0.2.9
    ssh-copy-id -i ~/.ssh/id_rsa.pub mama@10.0.2.10
    docker-machine create -d generic --generic-ip-address 10.0.2.9 --generic-ssh-user mama --generic-ssh-key ~/.ssh/id_rsa docker-vm1
    docker-machine create -d generic --generic-ip-address 10.0.2.10 --generic-ssh-user mama --generic-ssh-key ~/.ssh/id_rsa docker-vm2

    ตรวจสอบว่า เรามี machine อะไรบ้าง ด้วยคำสั่ง

    docker-machine ls

    ผลลัพธ์

    NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
    docker-vm1 - generic Running tcp://10.0.2.9:2376 v17.06.0-ce 
    docker-vm2 - generic Running tcp://10.0.2.10:2376 v17.06.0-ce

     

    เรามาดูกันว่ามันง่ายมาก ๆ เลยครับในการใช้คำสั่ง docker-machine จากเครื่อง C ไปสั่งให้เครื่อง A และ เครื่อง B ทำการรัน application ชื่อ testlab

    ที่เครื่อง C เราสั่งคำสั่งนี้ เพื่อให้เครื่อง A เป็น swarm manager

    docker-machine ssh docker-vm1 "docker swarm init --advertise-addr 10.0.2.9"

    ที่เครื่อง C เราสั่งคำสั่งนี้ เพื่อให้เครื่อง B เป็น swarm worker

    docker-machine ssh docker-vm2 "docker swarm join --token SWMTKN-1-61mjquxxkwwkc0tphusc3j98bmhnw5yeh1ykhkp6lp8l8z9em4-46ngusa5zoanprd7042avulpz 10.0.2.9:2377"

    ที่เครื่อง C เราสั่งคำสั่งนี้ เพื่อรัน application ชื่อ testlab

    docker-machine ssh docker-vm1 "cd ~/myservice ; docker stack deploy -c docker-compose.yml testlab"

    ตอนนี้เราก็ได้เปิดบริการ testlab เรียบร้อย

    เราจะตรวจสอบดูว่ามี container ถูกรันไว้ในเครื่อง A และ เครื่อง B ดังนี้

    docker-machine ssh docker-vm1 "docker ps"
    docker-machine ssh docker-vm2 "docker ps"

    และเมื่อเราต้องการจะ stop application เราก็สั่งดังนี้

    docker-machine ssh docker-vm1 "docker stack rm testlab"
    docker-machine ssh docker-vm1 "docker swarm leave --force"
    docker-machine ssh docker-vm2 "docker swarm leave --force"

    สะดวกมากจริง ๆ ครับ ลองทดสอบใช้งานดูนะครับ

     

    Output ของคำสั่งที่ใช้

    mama@ubuntu:~$ curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && chmod +x /tmp/docker-machine && sudo cp /tmp/docker-machine /usr/local/bin/docker-machine
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 617 0 617 0 0 354 0 --:--:-- 0:00:01 --:--:-- 354
    100 25.3M 100 25.3M 0 0 99879 0 0:04:26 0:04:26 --:--:-- 221k
    [sudo] password for mama:

    mama@ubuntu:~$ docker-machine create -d generic --generic-ip-address 10.0.2.9 --generic-ssh-user mama --generic-ssh-key ~/.ssh/id_rsa docker-vm1
    Creating CA: /home/mama/.docker/machine/certs/ca.pem
    Creating client certificate: /home/mama/.docker/machine/certs/cert.pem
    Running pre-create checks...
    Creating machine...
    (docker-vm1) Importing SSH key...
    Waiting for machine to be running, this may take a few minutes...
    Detecting operating system of created instance...
    Waiting for SSH to be available...
    Detecting the provisioner...
    Provisioning with ubuntu(systemd)...
    Installing Docker...
    Copying certs to the local machine directory...
    Copying certs to the remote machine...
    Setting Docker configuration on the remote daemon...
    Checking connection to Docker...
    Docker is up and running!
    To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env docker-vm1
    mama@ubuntu:~$

    mama@ubuntu:~$ docker-machine ls
    NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
    docker-vm1 - generic Running tcp://10.0.2.9:2376 v17.06.0-ce
    docker-vm2 - generic Running tcp://10.0.2.10:2376 v17.06.0-ce

    mama@ubuntu:~$ docker-machine ssh docker-vm1 "docker swarm init --advertise-addr 10.0.2.9"
    Swarm initialized: current node (k8x7e19z0iedo3yfcokeu2jpt) is now a manager.

    To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-61mjquxxkwwkc0tphusc3j98bmhnw5yeh1ykhkp6lp8l8z9em4-46ngusa5zoanprd7042avulpz 10.0.2.9:2377

    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    This node joined a swarm as a worker.

    mama@ubuntu:~$ docker-machine env docker-vm1
    export DOCKER_TLS_VERIFY="1"
    export DOCKER_HOST="tcp://10.0.2.9:2376"
    export DOCKER_CERT_PATH="/home/mama/.docker/machine/machines/docker-vm1"
    export DOCKER_MACHINE_NAME="docker-vm1"
    # Run this command to configure your shell:
    # eval $(docker-machine env docker-vm1)

    mama@ubuntu:~$ docker-machine ssh docker-vm2 "docker swarm join --token SWMTKN-1-61mjquxxkwwkc0tphusc3j98bmhnw5yeh1ykhkp6lp8l8z9em4-46ngusa5zoanprd7042avulpz 10.0.2.9:2377"
    This node joined a swarm as a worker.

    mama@ubuntu:~$ docker-machine ssh docker-vm1 "cd ~/myservice ; docker stack deploy -c docker-compose.yml testlab"
    Creating network testlab_webnet
    Creating service testlab_redis
    Creating service testlab_web
    Creating service testlab_visualizer

    mama@ubuntu:~$ docker-machine ssh docker-vm1 "docker ps"
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    e50ac8163d9a redis:latest "docker-entrypoint..." About a minute ago Up About a minute 6379/tcp testlab_redis.1.iu0rtua66lrfrzgsdn6vu2kf9
    368530178c51 woonpsu/docsdocker:part1 "python app.py" 2 minutes ago Up 2 minutes 80/tcp testlab_web.4.njqokwoqie76knjurptkm35qu
    63c811bc1772 woonpsu/docsdocker:part1 "python app.py" 2 minutes ago Up 2 minutes 80/tcp testlab_web.6.urlvghe3yx6p6ljsg5l4x9ix8
    130e4967165a woonpsu/docsdocker:part1 "python app.py" 2 minutes ago Up 2 minutes 80/tcp testlab_web.2.020dbtitrcx0b876ryz5xf83r

    mama@ubuntu:~$ docker-machine ssh docker-vm1 "docker stack rm testlab"
    Removing service testlab_web
    Removing service testlab_redis
    Removing service testlab_visualizer
    Removing network testlab_webnet

    mama@ubuntu:~$ docker-machine ssh docker-vm1 "docker swarm leave --force"
    Node left the swarm.

    mama@ubuntu:~$ docker-machine ssh docker-vm2 "docker swarm leave --force"
    Node left the swarm.

     

    References:

  • เตาะแตะไปกับ Docker ตอนที่ 12 Clone Docker Files From GitHub

    จากบล็อกเรื่อง “เตาะแตะไปกับ Docker” ในตอนที่แล้ว เราได้เรียนรู้ขั้นตอนในการสร้างและรัน LDAP services อย่างละเอียด ก่อนที่ผมจะเขียนบทความในตอนนี้ผมได้นำไฟล์ทุกไฟล์นั้นขึ้นไปไว้บน GitHub เพื่อให้พวกเราไม่ต้องสร้างไฟล์เหล่านั้นเอง แต่จะทำด้วยคำสั่ง git clone ครับ

    เรายังคงทดสอบด้วย VM โดยตั้งค่า network เป็น NAT network เพราะว่า เราใช้ domain สมมติ คือ ldap.example.com และทดสอบในสภาพแวดล้อมที่เป็นเครือข่ายภายใน

    ขั้นตอนดังนี้

    1. ติดตั้ง Ubuntu 16.04 64 bit แล้วติดตั้ง docker 17.06.2-ce แล้วต้องเปลี่ยนชื่อ hostname เป็น ldap.example.com จากนั้นรีบูตเครื่อง

    2. ติดตั้ง docker-compose 1.8.0-2 (ถ้ายังไม่ได้ทำ) ด้วยคำสั่งดังนี้

    sudo apt install docker-compose

    3. ทำการ Clone project จาก github ด้วยคำสั่ง

    git clone https://github.com/woonpsu/ex1-openldap.git

    4. ทำคำสั่งตามนี้

    cd ex1-openldap
    docker-compose up -d

    หมายเหตุ
    หากยังไม่มี image ชื่อ ubuntu:16.04 ก็จะใช้เวลานานสักหน่อยเมื่อรันคำสั่ง docker-compose เพราะว่าจะมีการสร้าง image ubuntu:16.04 ให้ใหม่

    5. ใช้คำสั่งเหล่านี้เพื่อตรวจสอบ

    docker images
    docker ps
    docker volume ls

    6. เพิ่ม users ตัวอย่าง

    sudo apt install ldap-utils
    ldapadd -H ldap://ldap.example.com -f ./openldap/src/create-users.ldif -x -D "cn=admin,dc=example,dc=com" -w 123456

    7. ทดสอบเข้าใช้งานเว็บจากเครื่องใน NAT network เดียวกัน หรือที่เครื่อง VM server ที่ผมได้ติดตั้ง Desktop Environment ไว้แล้ว ก็ต้องเปลี่ยนจาก text เป็น graphic ด้วยคำสั่ง

    $ startx

    เข้า browser ไปที่

    http://ldap.example.com:8080/phpldapadmin/

     

    สำหรับวิธีการทำ GitHub Repository ชื่อ ex1-openldap ของผมอย่างคร่าว ๆ คือ
    1. เข้า browser ไป sign up แบบ free ที่ github.com ด้วย username ชือ woonpsu

    2. สร้าง Repository ชื่อ ex1-openldap

    3. ไปที่เครื่อง server ใช้คำสั่ง

    git clone https://github.com/woonpsu/ex1-openldap.git

    4. เตรียมไฟล์

    cd ex1-openldap
    git init

    5. สร้างไฟล์ docker-compose.yml และไดเรกทอรี openldap กับ phpldapadmin ให้เสร็จ

    6. ทำการส่งขึ้นไปไว้บน github

    git add .
    git commit -m “This is a first commit”
    git push -u origin master

    ใส่ username และ password ของเราที่ sign up กับ github

     

    หมายเหตุ

    • หากต้องการใช้ VM ที่ผมเตรียมไว้ จะไม่ต้องติดตั้ง Ubuntu server ก็ download docker-vm file size 1.2G แล้ว import เข้า Oracle VM Virtualbox ทดสอบดูได้ (เข้าด้วย mama/123456)