เตาะแตะไปกับ Docker ตอนที่ 10 Dockerfile (phpLDAPadmin)

ในตอนที่แล้วเราใช้งาน openldap ด้วยคำสั่ง เช่น ldapsearch หรือ ldapadd ได้แล้ว วันนี้เราจะเรียนรู้การใช้ dockerfile สร้าง image ชื่อ phpldapadmin เพื่อใช้เป็น web interface ในการเข้าไปจัดการ LDAP database ของ container ชื่อ openldap โดยที่ phpLDAPadmin นี้คือการรัน php บน apache2 แล้วเราจะติดต่อระหว่าง container กันได้อย่างไร มาดูกันครับ เช่นเดียวกับครั้งที่แล้ว ผมจะแยกเป็น 3 ขั้นตอน คือ 1.ขั้นตอนเตรียมไฟล์ที่เกี่ยวข้อง 2.ขั้นตอนสร้างไฟล์ dockerfile และ 3.ขั้นตอนการรัน container   1.ขั้นตอนเตรียมไฟล์ที่เกี่ยวข้อง ให้แน่ใจว่าอยู่ที่ home directory ให้ใช้คำสั่งนี้ $ cd สร้างไดเรกทอรีของ image ที่เราจะสร้าง $ mkdir phpldapadmin $ cd phpldapadmin $ mkdir src เราจะเตรียมไฟล์ชื่อ apache2-foreground ให้เปิดไฟล์จากที่นี่ https://github.com/docker-library/php/blob/master/5.6/jessie/apache/apache2-foreground แล้วคัดลอกทุกบรรทัด นำมาสร้างไฟล์ ด้วยเอติเตอร์ที่ถนัด เช่น vi หรือ nano ก็ได้ $ vi ./src/apache2-foreground   2.ขั้นตอนสร้างไฟล์ dockerfile ตอนนี้ก็มาถึงขั้นตอนการเขียน dockerfile ด้วยเอดิเตอร์ที่ถนัดเช่น vi หรือ nano ก็ได้ $ vi dockerfile # Composer: Wiboon Warasittichai FROM ubuntu:16.04 # Change apt source RUN sed -i ‘s/\/us.archive/\/th.archive/g’ /etc/apt/sources.list && \ sed -i ‘s/\/archive/\/th.archive/g’ /etc/apt/sources.list # Update ubuntu, then install packages RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt install -y php-ldap phpldapadmin ldap-utils # Timezone Asia/Bangkok RUN apt-get install -y tzdata && \ ln -sf /usr/share/zoneinfo/Asia/Bangkok /etc/localtime && \ dpkg-reconfigure -f noninteractive tzdata # Cleaning RUN apt-get autoremove -y && apt-get clean -y EXPOSE 80 CMD RUN ulimit -n 1024 ENV HNAME ${HNAME} ADD ./src/startup.sh /startup.sh COPY ./src/apache2-foreground /usr/local/bin/ RUN chmod +x /usr/local/bin/apache2-foreground ENTRYPOINT [“/bin/bash”,”/startup.sh”]   ภายในไฟล์ dockerfile เราได้อ้างถึงการนำไฟล์ชื่อ startup.sh ก็ให้สร้างไฟล์นี้ด้วย $ vi ./src/startup.sh #!/bin/bash sed -i “s/127.0.0.1/$HNAME/g” /etc/phpldapadmin/config.php /usr/local/bin/apache2-foreground จุดน่าสนใจในไฟล์ dockerfile

Read More »

เตาะแตะไปกับ Docker ตอนที่ 9 Dockerfile (OpenLDAP)

วันนี้เราจะเรียนรู้การใช้ dockerfile สร้าง image ชื่อ openldap เพื่อใช้เป็น LDAP database ผมทดสอบด้วย Oracle VM VirtualBox เป็น VM ที่ตั้งค่า Network adapter เป็นแบบ NAT network ที่ติดตั้ง Ubuntu 16.04 และ docker เรียบร้อยแล้ว ในตัวอย่างนี้ผมตั้งชื่อ host ว่า ldap.example.com โดยแก้ไขที่ไฟล์ /etc/hosts และ /etc/hostname ให้เรียบร้อย แล้วรีบูตเครื่องด้วย ผมจะขอแยกขั้นตอนออกเป็น 3 ขั้นตอนหลัก คือ 1.ขั้นตอนเตรียมไฟล์ที่เกี่ยวข้องซึ่งรวมไฟล์ ldif ด้วย 2.ขั้นตอนสร้างไฟล์ dockerfile และ 3.ขั้นตอนการรัน container   1.ขั้นตอนเตรียมไฟล์ที่เกี่ยวข้อง สร้างไดเรกทอรีของ image ที่เราจะสร้าง $ mkdir openldap สร้างไดเรกทอรีที่เก็บไฟล์ ldif (โครงสร้าง และ ตัวอย่างข้อมูล) $ cd openldap $ mkdir src สร้างไฟล์ ./src/create-schema.ldif ด้วยเอติเตอร์ที่ถนัด เช่น vi หรือ nano ก็ได้ $ vi ./src/create-schema.ldif # Starter kit for create user in domain dc=example,dc=com # Create 1st tree OU=groups dn: ou=groups,dc=example,dc=com objectClass: organizationalUnit ou: groups # Create sub tree OU=execs,OU=groups dn: ou=execs,ou=groups,dc=example,dc=com objectClass: organizationalUnit ou: execs # Create sub tree OU=staffs,OU=groups dn: ou=staffs,ou=groups,dc=example,dc=com objectClass: organizationalUnit ou: staffs # Create sub tree OU=students,OU=groups dn: ou=students,ou=groups,dc=example,dc=com objectClass: organizationalUnit ou: students # Create 2nd tree OU=people dn: ou=people,dc=example,dc=com objectClass: organizationalUnit ou: people สร้างไฟล์ ssl.ldif $ vi src/ssl.ldif dn: cn=config changetype: modify add: olcTLSCipherSuite olcTLSCipherSuite: NORMAL – add: olcTLSCRLCheck olcTLSCRLCheck: none – add: olcTLSVerifyClient olcTLSVerifyClient: never – add: olcTLSCertificateFile olcTLSCertificateFile: /etc/ssl/certs/ldap-ca-cert.pem – add: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/ssl/private/ldap-ca-key.pem สร้างไฟล์ ./src/create-users.ldif $ vi ./src/create-users.ldif # Create 1 user in tree OU=execs,OU=groups dn: cn=nana,ou=execs,ou=groups,dc=example,dc=com objectClass: inetOrgPerson uid: nana sn: Na givenName: Na cn: nana

Read More »

เตาะแตะไปกับ Docker ตอนที่ 8 Cleanup Disk Space

การเรียนรู้ docker เราก็จะมีการทดสอบ pull image มา แล้ว run เป็น container รวมทั้งอาจมีการสร้างพื้นที่เก็บข้อมูลที่เรียกว่า volumes (ทั้งแบบ named volume และ anonymous volume) บ่อยครั้งเมื่อเราใช้คำสั่งตรวจสอบ เราจะพบว่ามีอะไรไม่รู้หลงเหลืออยู่กินเนื้อที่ไปเยอะ ตรวจสอบรายการ container $ docker ps -a ลบ containers ที่ไม่ใช้งานแล้ว $ docker ps –filter status=dead –filter status=exited –filter status=created -aq | xargs -r docker rm -v หมายเหตุ คำสั่งด้านบนนี้จะลบ data containers ด้วย ถ้ามีการสร้าง container ชนิดเก็บ data โปรดตรวจสอบให้ดีนะ ปัจจุบัน data container นั้น deprecated (ไม่แนะนำให้ใช้งาน) ตรวจสอบรายการ images $ docker images ลบ images ที่ไม่ใช้งานแล้ว $ docker images –no-trunc | grep ‘<none>’ | awk ‘{ print $3 }’ | xargs -r docker rmi ตรวจสอบรายการ volumes $ docker volumes ls ลบ volume ที่ไม่ถูกใช้งานโดย container ใด ๆ เลย $ docker volume ls -q -f dangling=true | xargs -r docker volume rm หรือจะใช้อีกแบบ แต่ต้องติดตั้ง jq เพิ่มด้วย $ sudo apt install jq $ docker ps -aq | xargs docker inspect | jq -r ‘.[] | .Mounts | .[] | .Name | select(.)’   References: http://codegist.net/code/docker-cleanup-disk-space/ https://stackoverflow.com/questions/41875846/docker-difference-between-data-volumes-and-data-containers

Read More »

เตาะแตะไปกับ Docker ตอนที่ 7 Manage data

Docker ให้เราสามารถเลือกใช้วิธีการ mount data เข้าไปให้กับ container อยู่ 3 อย่างคือ 1. Volumes 2. Bind mounts 3. tmpfs mounts Volumes จะถูกเก็บอยู่ในส่วนของ Host filesystem ที่จัดการโดย Docker เอง (อยู่ที่ /var/lib/docker/volumes) และนี่เป็นวิธีที่ดีที่สุดในการจัดเก็บข้อมูลที่เป็น persistent data (ตามคำบอกในเว็บเพจ docs.docker.com) Bind mounts จะถูกเก็บอยู่ในที่ไหนก็ได้ของ Host filesystem เป็นวิธีการที่มีมาตั้งแต่ Docker รุ่นแรก ๆ จึงมีข้อจำกัดเมื่อเทียบกับ Volumes tmpfs mounts จะถูกเก็บอยู่ในหน่วยความจำของ Host เท่านั้น อ่านรายละเอียดเพิ่มเติมได้จากที่นี่ https://docs.docker.com/engine/admin/volumes/ และ https://docs.docker.com/engine/admin/volumes/#more-details-about-mount-types ผมขอเล่าถึงตัวอย่างการใช้งาน Volumes ใน docker-compose.yml (version 2) ที่ผมได้ทำเสร็จแล้ว $ cat docker-compose.yml version: ‘2’ services: openldap: image: openldap container_name: openldap volumes: – ldapdatavol:/var/lib/ldap – ldapconfigvol:/etc/ldap/slapd.d ports: – “389:389” – “636:636” volumes: ldapdatavol: external: false ldapconfigvol: external: false อธิบายได้ดังนี้ ในไฟล์ docker-compose.yml นี้ เราจะรัน services ชื่อ openldap จาก image ที่สร้างไว้แล้วชื่อว่า openldap โดยรันเป็น container ที่ผมตั้งชื่อว่า openldap โดยจะเก็บข้อมูลไว้ถาวรที่ volume ชื่อ ldapdatavol ซึ่งจะ mapped กับ /var/lib/ldap ใน container และอีกบรรทัดคือ ldapconfigvol จะ mapped กับ /etc/ldap/slapd.d ใน container ถัดมาด้านล่างของไฟล์ เราจะต้องประกาศ volumes ไว้ด้วยว่า ldapdatavol ไม่ได้เป็น volume ที่สร้างไว้อยู่แล้วก่อนการัน docker-compose ด้วยการประกาศค่าว่า external: false เช่นเดียวกับ volume ชื่อ ldapconfigvol แต่ถ้าใช้ external: true จะหมายถึง docker-compose จะไม่สร้าง volume ให้ นั่นคือ เราได้สร้างไว้ก่อนแล้วด้วยคำสั่ง $ docker volume create –name ldapdatavol $ docker volume create –name ldapconfigvol เราสามารถดูรายการ volume ด้วยคำสั่งนี้ $ docker volume ls และที่เก็บจริง ๆ จะอยู่ที่นี่ /var/lib/docker/volumes ใช้คำสั่งเปลี่ยนสิทธิเป็น root เข้าไปที่เก็บ volume แล้วเราจะสามารถสำรองข้อมูลนี้ได้โดยใช้คำสั่ง cp หรือ tar ได้เลย ดังนี้ $ sudo su – # cd /var/lib/docker/volumes การใช้งาน volume แบบที่แนะนำนี้เรียกว่า named volume คือ เราตั้งเป็นชื่อตามที่เราคิดเอง ส่วนอีกแบบจะเรียกว่า anonymous นั่นคือ docker ตั้งชื่อให้เอง อันนี้ผมไม่ลงรายละเอียดครับ จบตอนนี้เราก็จะพอเข้าใจได้แล้วว่า

Read More »

ELK #6 วิธีการติดตั้ง ELK และ Geoserver แบบ Docker ให้ทำงานร่วมกัน

จาก ELK #5 การประยุกต์ใช้ ELK ในงานด้าน GIS และ การสร้าง Web Map Service (WMS) บน Geoserver ก็จะเห็นถึงการนำไปใช้เบื้องต้น >> ขอบคุณ คุณนพัส กังวานตระกูล สถานวิจัยสารสนเทศภูมิศาสตร์ทรัพยากรธรรมชาติและสิ่งแวดล้อม ศูนย์ภูมิภาคเทคโนโลยีอวกาศและภูมิสารสนเทศ (ภาคใต้) สำหรับความรู้มากมายครับ <<   ต่อไปนี้ จะเป็นขั้นตอนการติดตั้ง ELK และ Geoserver แบบ Docker โดยผมได้สร้าง Github Repository เอาไว้ ซึ่งได้แก้ไขให้ระบบสามารถเก็บข้อมูลไว้ภายนอก Prerequisite ถ้าเป็น Windows ก็ต้องติดตั้ง Docker Toolbox หรือ Docker for Windows ให้เรียบร้อย ถ้าเป็น Linux ก็ติดตั้ง docker-ce ให้เรียบร้อย (เรียนรู้เกี่ยวกับ Docker ได้จาก ติดตั้ง docker 17.06.0 CE บน Ubuntu) ขั้นตอนการติดตั้ง สร้าง Folder ชื่อ Docker เอาไว้ในเครื่อง เช่นใน Documents หรือ จะเป็น D:\ หรืออะไรก็แล้วแต่ เปิด Terminal หรือ Docker Quickstart Terminal จากนั้นให้ cd เข้าไปมา Folder “Docker” ที่สร้างไว้ ดึง ELK ลงมา ด้วยคำสั่ง git clone https://github.com/deviantony/docker-elk.git ดึง Geoserver ลงมา ด้วยคำสั่ง (อันนี้ผมทำต่อยอดเค้าอีกทีหนึ่ง ต้นฉบับคือ https://hub.docker.com/r/fiware/gisdataprovider/) git clone https://github.com/nagarindkx/geoserver.git เนื่องจาก ไม่อยากจะไปแก้ไข Git ของต้นฉบับ เราจึงต้องปรับแต่งนิดหน่อยเอง ให้แก้ไขไฟล์ docker-elk/docker-compose.yml โดยจะเพิ่ม Volume  “data” เพื่อไป mount ส่วนของ data directory ของ Elasticsearch ออกมาจาก Containerแก้ไขจาก elasticsearch: build: elasticsearch/ volumes: – ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml เป็น elasticsearch: build: elasticsearch/ volumes: – ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml – ./elasticsearch/data:/usr/share/elasticsearch/data สร้าง docker-elk/elasticsearch/data mkdir docker-elk/elasticsearch/data แก้ไขไฟล์ docker-elk/logstash/pipeline/logstash.conf ตามต้องการ เช่น ใส่ filter filter { csv { separator => “,” columns => [ “cid”,”name”,”lname”,”pid”,”house”,”road”,”diagcode”,”latitude”,”longitude”,”village”,”tambon”,”ampur”,”changwat” ] } if [cid] == “CID” { drop { } } else { # continue processing data mutate { remove_field => [ “message” ] } mutate { convert => { “longitude” => “float” } convert => { “latitude” => “float” } } mutate { rename =>

Read More »