เตาะแตะไปกับ Docker ตอนที่ 1 Containers (Build, Ship and Run)

ผมอ่าน Get Started จาก docs.docker.com แล้วคิดว่าพอเข้าใจว่า docker ใช้งานอย่างไรมากขึ้นในแง่ความหมายของ Docker – Build, Ship, and Run Any App, Anywhere ที่เป็นจุดเด่น หลังจากอ่านจบที่ผมเขียนในตอนที่ 1 นี้ ก็น่าจะเข้าใจคำว่า Container และในตอนถัดไปก็จะนั้นจะเล่าถึงความหมายของคำว่า Service และ Stack ตามลำดับ ในการทดสอบเพื่อเขียนบทความ ผมได้ติดตั้ง docker บน ubuntu server 64 bit Xenial 16.04 (LTS) และรุ่นของ Docker ที่ใช้คือ Docker version 17.06.0-ce, build 02c1d87 ซึ่ง Docker Software มี 2 ชนิด คือ Community Edition (CE) และ Enterprise Edition (EE) ให้เลือกใช้ [Installation] วิธีติดตั้ง Docker บน ubuntu นั้นจะมีคำแนะนำสำหรับรุ่น docker-ce คือเริ่มต้นจากการ SET UP THE REPOSITORY เสร็จแล้วจึง INSTALL DOCKER CE อย่างคร่าว ๆ ก็ใช้คำสั่งดังนี้ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add – sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable” sudo apt-get update sudo apt-get install -y docker-ce วิธีทำให้ไม่ต้องใส่คำว่า sudo หน้าคำสั่ง Docker ทุกครั้ง ดังนี้ sudo usermod -aG docker ${USER} su – ${USER} id exit logout แล้ว login กลับเข้ามาใหม่ พิมพ์คำสั่ง id จะเห็นว่าอยู่ใน group docker ด้วยแล้ว ต่อไป Verify ว่า Docker CE ถูกติดตั้งสำเร็จโดยการรัน hello-world image docker run hello-world ตรวจสอบเวอร์ชั่น docker –version [Containers] ตอนนี้ก็ได้เวลาเตาะแตะแบบ docker เราจะเริ่มกันที่ส่วนล่างสุดของ hierarchy ของการสร้าง app 3 ส่วน นั่นคือ container Stack Services Container (เรากำลังอยู่ที่นี่) การสร้าง app เราจะทำ container ขึ้นมาจากสิ่งที่เรียกว่า Dockerfile คือไฟล์ที่เขียนข้อกำหนดว่า container จะมีสภาพแวดล้อมเป็นอะไรบ้าง โดยต้องเริ่มต้นจากสร้าง directory ว่าง ๆ บน host (จะเรียก ubuntu server ที่ติดตั้ง docker ไว้ว่า host) แล้วสร้างไฟล์ชื่อ Dockerfile ด้วยเอดิเตอร์ที่ถนัด เช่น vi หรือ nano เป็นต้น และถ้าภายในไฟล์นี้อ้างถึงไฟล์อื่น ๆ ก็สร้างไว้ให้ครบด้วยนะ ผมจะใช้ตัวอย่างจาก docs.docker.com ครับ mkdir myhello cd myhello

Read More »

เปลี่ยน ubuntu sources.list ก่อนสร้าง image ด้วย dockerfile

การใช้งาน docker นั้นเราสามารถใช้ image จาก docker hub หรือเราจะสร้าง image ของเราเอง ซึ่งมีหลายวิธีในการสร้าง image แบบของเราเอง (custom) วิธีหนึ่งคือการใช้ dockerfile อย่างคร่าว ๆ คือ mkdir ~/mydocker cd ~/mydocker touch dockerfile docker built -t test_app:20170713 . docker images ในไฟล์ชื่อ dockerfile นี้จะมีไวยกรณ์ประมาณนี้ # Image tag: test_app:20170713 <– บรรทัดนี้คือ comment FROM ubuntu:16.04 <– บรรทัดนี้คือ ไปเอา image ชื่อ ubuntu:16.04 จาก docker hub RUN apt-get update <– บรรทัดนี้คือ คำสั่งบอกว่าจะติดตั้ง หลังคำว่า RUN นั่นเอง RUN apt-get dist-upgrade -y RUN apt-get install -y apache2 libapache2-mod-php7.0 php7.0 COPY … ADD … EXPOSE … CMD … และยังมี command อื่น ๆ อีก ทีนี้จากการที่ต้องลองผิดลองถูกบ่อย ๆ จึงพบว่า หากเราเพิ่มคำสั่ง 2 บรรทัดนี้เข้าไปก่อนบรรทัด RUN apt-get update ก็จะทำให้เราได้ใช้ ubuntu repository ที่ต้องการแทนค่า default ที่ archive.ubuntu.com เช่นต้องการให้มาใช้ th.archive.ubuntu.com ก็เขียนคำสั่งดังนี้ RUN sed -i ‘s/\/us.archive/\/th.archive/g’ /etc/apt/sources.list RUN sed -i ‘s/\/archive/\/th.archive/g’ /etc/apt/sources.list ผลลัพธ์คือ หลังจากทำคำสั่ง docker built -t test_app:20170713 . จะเห็นว่าในขั้นตอนการ build นั้นจะดาวน์โหลดไฟล์ได้รวดเร็วกว่าเดิมมาก จึงนำความรู้มาบอกกันครับ อ้อลืมบอกว่าบทความที่เขียนนี้ ผมทดสอบกับ docker version 17.06.0-ce ครับ อยากแนะนำความรู้เกี่ยวกับ docker ที่อ่านมา พบว่าน่าสนใจ ลองอ่านดูครับ อ่านง่าย   บทความในต่างประเทศ How To Install and Use Docker on Ubuntu 16.04 (https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04) How to Build an Image with the Dockerfile (https://www.sitepoint.com/how-to-build-an-image-with-the-dockerfile/) Dockerfile reference (https://docs.docker.com/engine/reference/builder/) Best practices for writing Dockerfiles (https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/) How to update Docker image to maintain your containers secure  (https://bobcares.com/blog/update-docker-image/2/) How to upgrade docker container after its image changed (https://stackoverflow.com/questions/26734402/how-to-upgrade-docker-container-after-its-image-changed) Manage data in containers (https://docs.docker.com/engine/tutorials/dockervolumes/)  

Read More »

ELK #04

คราวนี้มาติดตั้งบน Docker บ้าง ถ้าเครื่อง Server เป็น Ubuntu 16.04 ทำตามขั้นตอนนี้เพื่อให้สามารถใช้งาน Docker ได้ วิธีการติดตั้ง Docker บน Ubuntu 16.04 เนื่องจาก Elasticsearch 5.x ใช้ Virtual Memory มากขึ้น ลองใช้คำสั่งนี้ดูค่าปัจจุบัน sysctl vm.max_map_count ค่า Default น่าจะประมาณนี้ vm.max_map_count = 65530 ให้ทำการเพิ่มด้วยคำสั่งนี้ sudo -i sudo echo “vm.max_map_count=262144” >> /etc/sysctl.conf exit จากนั้นให้ทำการ Reboot ติดตั้ง docker image ของ sebp/elk ด้วยคำสั่ง sudo docker pull sebp/elk โดย Default จะได้ Lastest Version ใช้คำสี่งต่อไปนี้ เพื่อ Start ELK ขึ้นมา โดยเปิด port ให้ Kibana: 5601, Elasticsearch: 9200, Logstash: 5044 และทำงานเป็นแบบ Detach หรือ Background นั่นเอง sudo docker run -d -p 5601:5601 -p 9200:9200 -p 5044:5044 -it –name elk sebp/elk หรือถ้าจะใช้ Docker Compose ก็สามารถใช้งานด้วยวิธีการนี้ เริ่มจาก ติดตั้ง Docker Compose ด้วยคำสั่ง sudo -i curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose exit จากนั้น สร้างไฟล์ /path/to/your/config/elk.yml เนื้อหาดังนี้ elk: image: sebp/elk ports: – “5601:5601” – “9200:9200” – “5044:5044” จากนั้นก็ Start sudo /usr/local/bin/docker-compose -f /path/to/your/config/elk.yml up -d elk หากต้องการให้ container ทำการ start ทุกครั้งที่ Reboot ใช้คำสั่ง sudo crontab -e แล้วใส่บรรทัดนี้ต่อท้ายไฟล์ @reboot /usr/local/bin/docker-compose -f /home/mama/elk.yml up -d elk ทดสอบว่า Container ที่กำลังทำงานอยู่มีอะไรบ้าง sudo docker ps วิธีดูว่า มี Container อะไรบ้าง (ทั้งที่ทำงานและไม่ทำงาน) sudo docker ps -a วิธีดูว่าเกิดอะไรขึ้นกับ Container (ในที่นี้ ชื่อ elk) sudo docker logs elk ถึงจุดนี้ ก็สามารถใช้งาน Kibana ทาง web url: http://your.host:5601 ได้แล้ว   Reference: https://elk-docker.readthedocs.io/  

Read More »

ELK #03

วิธีการติดตั้ง Kibana บน Ubuntu 16.04 ก่อนอื่น Update sudo apt -y update ; sudo apt -y upgrade ติดตั้ง Java JDK sudo apt -y install default-jdk Download และติดตั้ง wget https://artifacts.elastic.co/downloads/kibana/kibana-5.4.2-amd64.deb sudo dpkg -i kibana-5.4.2-amd64.deb จากนั้นแก้ไขไฟล์ /etc/kibana/kibana.yml เพิ่มบรรทัดสุดท้าย server.host: “192.168.xxx.yyy” elasticsearch.url: “http://your.elastic.host:9200” จากนั้น Start Service sudo service kibana start เปิด Web Browser ไปที่ http://192.168.xxx.yyy:5601

Read More »

ELK #02

ขั้นตอนการติดตั้ง Logstash บน Ubuntu 16.04 ก่อนอื่น Update sudo apt -y update ; sudo apt -y upgrade ติดตั้ง Java JDK sudo apt -y install default-jdk Download และติดตั้ง wget https://artifacts.elastic.co/downloads/logstash/logstash-5.4.2.deb sudo dpkg -i logstash-5.4.2.deb Start Logstash Service sudo service logstash start ต่อไป สร้าง Configuration ไว้ใน /etc/logstash/conf.d/ เช่น จะสร้าง Pipeline ที่อ่านจาก File /tmp/test.log แล้ว ส่งไปที่ Elasticsearch โดยตรง ให้สร้างไฟล์ /etc/logstash/conf.d/file.conf ดังนี้ input { file { path => “/tmp/test.log” type=> “test” } } output { file { path => “/tmp/output.txt” } } เมื่อลองใช้คำสั่ง echo “$(date): New World” >> /tmp/test.log ก็จะปรากฏไฟล์ /tmp/output.txt ขึ้น ต่อไป ลองเปลี่ยน Output เป็น Elasticsearch โดยการสร้างไฟล์ /etc/logstash/conf.d/es.conf input { file { path => “/tmp/test.log” type=> “test” } } output { elasticsearch { hosts => [“http://your.elastic.host:9200”] } } เมื่อลองใช้คำสั่ง echo “$(date): New World” >> /tmp/test.log ก็จะปรากฏบรรทัดใหม่ใน /tmp/output.txt และ มีการเขียนไปบน Elasticsearch ด้วย ลองเปิด Web Browser แล้วใช้คำสั่งต่อไปนี้ http://your.elastic.host:9200/_cat/indices?v ก็จะได้ผลลัพธ์ประมาณนี้ จากนั้น วิธีที่จะแสดงผลที่เก็บไว้ใน Elasticsearch ให้เปิด URL นี้ http://your.elastic.host:9200/logstash-2017.06.24/_search?q=* ก็จะได้ผลลัพธ์ประมาณนี้ แล้วยังไง ??? รอดูตอนต่อไป

Read More »