Grean App Do it Right!!! - Web Application Development Framework, AngularJS, NodeJS, MongoDB,Sass new Web Development Framework
  • GreanApp
  • Docker
  • AngularJS
  • NodeJS
  • .NET Core
  • Network Equipment
  • Server
  • Other
Grean App Do it Right!!! - Web Application Development Framework, AngularJS, NodeJS, MongoDB,Sass new Web Development Framework
GreanApp
Docker
AngularJS
NodeJS
.NET Core
Network Equipment
Server
Other
  • GreanApp
  • Docker
  • AngularJS
  • NodeJS
  • .NET Core
  • Network Equipment
  • Server
  • Other
Docker

สร้าง Redis Production/Development grade ด้วย Docker แบบขำๆ

    พอดีวันก่อนได้มีเวลาไปทำ Redis ใช้งานบน Production เอามาเสียบแทน ASP.NET State Server เลยเอามาแปะให้ไปใช้กัน จริงๆ แล้ว Redis ถ้าใช้แบบ Development มันก็คงไม่ต้องไปทำอะไรมันมากนะ docker containner run จบ วันก่อนไปงาน Docker คุณประทาน เขาบอกว่าใครยังใช้ docker run เฉยๆนี่ Out ไอ้กระผมก็ยังใช้อยู่ด้วยซิเหอะๆ

    ย้อนกลับไปสมัยก่อนมี Docker นี่ทรมานมากนะเรียกว่าถึกเลยล่ะยิ่ง Dev บน Windows นี้ไม่ต้องพูดถึง เปิด หน้าต่าง Command Line เต็มไปหมดเพราะต้องรัน Service ที่เกี่ยวข้องพอมี Docker มันก็สะดวกดี เอาล่ะวันนี้ไม่ใช่ประเด็นการใช้งาน  Docker ตรงๆ ดังนั้นไปที่เรื่อง Redis ปกติ Redis มันใช้งานบน Docker ได้อยู่แล้วนะ ง่ายด้วย แต่มันไม่ใช่สำหรับพวก Perfectionist people  อย่างเรา 555 จริงๆ ก็ไม่ขนาดนั้นนะ แต่เป็นโรคจิตอย่างนึง ไม่ชอบ Warning Message  “ไม่อยากจะขัดใจตัวเอง ที่มันชอบเธอ ไม่ให้ชอบเธอ ก็คงเป็นไปไม่ได้” ไปเรื่อย…..  ดังนั้นถ้าจะขจัด Warning ไปให้หมดทำได้ยังไง ก็ไปอ่านบทความเก่าผมนะ.

ตั้งค่า Redis สำหรับ Production Server

ส่วนบทความนี้มาต่อตรงนี้ นะ เริ่มเลย Git Clone ซิ เตรียม Repo ให้แล้ว link อยู่นี่ ไม่อยากบอกเลยว่าแทบไม่ต้องทำอะไร เพราะเตรียมให้ใน Bash ล่ะ ส่วน Dockerfile ก็ตามนี้ ต้นแบบผมเอามาจาก Redis 4 นะซึงคือล่าสุดในตอนนี้ จุดที่สังเกตุคือ CMD iTopplusRedis.sh ซึ่งผมจะอธิบายอีกที จากนั้นก็สั่ง ./build.sh ได้เลย ใครสาย Windows ใช้ git bash ทำนะครับผมไม่ได้ทำ Batch ไฟล์ไว้

มาดูพระเอกของเราบ้าง ไฟล์ itopplusRedis.sh จริงๆ ไม่มีอะไรจุดสำคัญมันคือการปรับแต่งค่าต่างๆ  เช่น socket max connection ไปอ่านบล็อคแรกที่ผมโพสก่อนก็ได้นะครับถ้าไม่เข้าใจ  แล้วค่อยสั่ง redis ทำงาน โดยผมจะโยน config ไว้ที่ etc นะซึ่งต่อไปเราจะ map volume มาให้ตรงตอนรัน

ขั้นต่อไปไม่มีอะไรมากครับก็คือ ./run.sh โดยส่วนที่ต้องเพิ่มมาคือ –privileged เพื่อให้เราสามารถปรับค่าบางอย่างบน kernel หรือพวก device และ configuration หลักบนเครื่อง ถ้าเราไม่เปิดไว้ตัว container นี้ มันจะไม่สามารถตั้งค่าเรานั้นได้ครับ ส่วน Vollume เราก็ได้ mapping เข้ากับ configuration ไว้ อันนี้ผมยัง mapping ไว้นะ จะแก้ใช้ใน container ก็ได้เพราะมันมีไฟล์อยู่ path /etc/redis.conf อยู่แล้ว

docker logs myredis ดูมันจะหน้าตาหล่อๆแบบนี้เลย ไม่มี “Warning Message” ใดๆ แต่นั่นก็อย่าสบายใจไปล่ะหมั่นมาดูหน้าตามมันบ้างว่ามันรับได้ตามที่ตั้งไว้บ้างหรือเปล่า อีกอย่างท่านี้ผมทดสอบแถว 1000-2000 req/s นะครับขำๆ สบายๆ เครื่องเดียวไม่มี CPU Peak/ Memory Leak ใดๆ ทั้งสิ้น

จบจ้า จริงๆ ไม่ได้เขียน Blog นานมากเพราะเนื้อหาหลังๆ มันเหมือนโน๊ตส่วนตัวมากกว่าบทความ เลยไม่ได้ Publish เรียกว่าแอบเขียนแล้วกัน ส่วนวันนี้พอดีต้องรอ Email จาก MS พี่แก Support ข้ามชั่วโมงเลย ดังนั้นมาเขียน Blog รอจนเขียนจบแล้วแต่ยังม่ได้รับเมล์เลย 555  Redis ยังทำอะไรได้อีกเยอะนะพักหลังนี่ ผมกำลังคิดยกไปทำงานแทน Database เลย.

 

Git Hub : https://github.com/tonmanna/Redis_Production

January 19, 2018by adminwp
Docker

ทำไม่ต้อง Docker Compose คือ?

Compose
ก่อนอื่นต้องแนะนำก่อนว่า Docker นั้น สามารถใช้คำสั่ง docker run กับ docker build ได้ดีอยู่แล้ว ทำไมเราต้องใช้ Docker Compose คำตอบคงสั้นๆ เพราะมันสามารถรันหลาย Container ให้ทำงานพร้อมกันด้วยคำสั่งเดียว และง่ายกว่ามานั่งเขียน Bash(Batch) Script(File) นั่นเอง

ทำไมต้องมี Docker Compose มันเกิดจากความต้องการ ในการนำคำสั่งต่างๆ ของ Docker มาทำงาน พร้อมๆกันโดยมาเขียนในรูปแบบ yaml(yml) หรือที่อาจจะเรียกว่า Configuration File ที่อ่านง่ายกว่าที่จะเขียน bash script ยาวๆ และดูแลได้ยากกว่า

ข้อดีของ Docker Compose นั่นก็คือ เราสามารถ Start / Stop / Restart / Log / Build Docker Container ได้โดยใช้คำสั่งบรรทัดเดียว และทำได้หลาย Container พร้อมๆกัน อาจถูกรวมมองเป็น Service ได้เลยแต่ไม่ใช่ Docker Service ใน Swarm นะครับ เดี้ยวจะจำสับสน คือถ้าคุณจะใช้ Docker ในการพัฒนา Software แบบ DevOps แล้วมันเป็นเครื่องมือที่สำคัญมากๆ เพราะคุณเอาข้อดีของ Docker มาทำให้มันสามารถทำงานได้เพียงเขียนคำสั่งไม่กี่คำสั่ง สมมุติว่าบน Production คุณมีหลาย Service เช่นมี Nginx, Redis , Mysql , MongoDB , ElasticSearch ในคราวเดียวกัน ถ้าคุณใช้เพียง Docker คุณก็คงนึก ถึงคำสั่ง docker run -d -v xxx:xxx -p xxx:xxx –name xxxx xxxx หลายบรรทัดแน่ๆ โดยเวลาจะ Restart เวลาจะ Build ใหม่ เราต้องทำอะไรอีกเยอะเยะ แค่คิดก็เมื่ยมือแล้วใช่ไหมครับ แต่บางคนอาจบอกว่าใช้ Bash Script ก็แก้ปัญหาได้แล้ว แต่จริงๆแล้วเอาเข้าจริง Bash นี้ ดีจริงครับแต่ว่าเวลาแก้นี่ก็หลายที่อยู่เหมือนกัน

ดังนั้นจึงเป็นที่มาของ Docker Compose และ Logo ที่เป็นรูป Octopus ที่มีหลายมือ หรือ หนวดกันแน่ เอาเป็นว่ามันช่วยสั่ง Container ให้ทำงานพร้อมๆกัน ตามรูปเจ้าปลาหมึกยักนั่นแหละครับที่หยิบ Container ขึ้นมา

หน้าตาของ Docker Compose file (docker-compose.yml คือ Default File ที่ Docker Compose จะเรียกใช้ตอนเรียกคำสั่ง docker-compose . ถูกเรียกใช้งาน ปัจุบันมันอยู่ที่ Version 2 นะครับคำสั่งของ Docker-compose ไม่ใช่รุ่นของ Docker Compose นะครับ)

Default
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: '2'
services:
  web:
    build: .
    ports:
      - "5000:5000"
      - "6000:6000"
    volumes:
      - .:/code
      - $PWD:/code2
    links:
      - redis
    networks:
      - website-network
  redis:
    image: redis
    volumes:
      - redis-content:/data
    networks:
      - website-network
volumes:
  redis-data:
    driver: local
networks:
  website-network
    driver: bridge

เวลาจะรันก็อยู่ที่ terminal

Default
1
$ docker-compose . up --build

เพื่อสั่งให้เริ่มทำงาน โดยจะ –build ก็คือการบังคับ Build Image ทุกครั้งที่สั่ง run โดย up ความหมายไกล้เคียงกับ run ครับ แน่นอนถ้าเป็น down ก็เหมือน stop ครับโดยถ้าจะ stop ก็รันคำสั่งเดียวแบบนี้ครับ

Default
1
$ docker-compose . down

คุณยังสามารถ override ไฟล์ yml ได้อีกด้วยนะครับ เช่นคุณมีไฟล์ yml หลายไฟล์ ซึ่งอาจจะกำหนด configuration containner ซ้ำกัน หรือ ต่างกันก็ยังสามารถทำงานได้ดีครับ โดยถ้าคุณได้ลองศึกษาดูคุณจะพบว่ามันทำงานได้ดีมากและฉลาดมากอีกด้วย ตัวอย่างการใช้ Override ไฟล์อื่น สามารถทำได้สอง แบบ แบบแรกแยกไฟล์ไปเลย แบบที่ 2 เขียนลงไปใน docker-compose file ได้เลย ตัวอย่างแรก

Default
1
2
docker-compose -p pooltest -f docker-composeๅ.yml -f docker-compos/.yml down
docker-compose -p pooltest -f docker-composeๅ.yml -f docker-compos/.yml up --build

-p ใช้กำหนดชื่อ Project โดยถ้าคุณกำหนดชื่อ Project แล้วสามารถแยกให้ Container ที่ทำงานผ่าน Compose ให้มีเหมือนกันอีกหลายชุดได้ด้วยการแยก Project

Syntax ที่อยู่ใน Docker-compose File ถ้าคุณศึกษา Docker มาแล้วแถบไม่ต้องจำเลย

build: ก็ตรงตัวครับ Build Dockerfile นั่นหมายความว่า . ปัจจุบันที่คุณรันก็ต้องมี Dockerfile

image: ก็คือชื่อ image แหละครับ ตรงๆ เลย เหมือน docker run imagename

ports: -p ของ docker run -p เหมือนกันครับ แต่เขียนเรียงกันเป็น Array ใน docker-compose.yml มันดูง่ายกว่าอย่างเหลือเชื่อ

volumes: เช่นเดียวกับ -p โดย -v เป็นปัญหาหลักๆ ที่ทำให้คำสั่ง docker run ยาว มันมาแบบนี้ก็ง่ายซิ แต่จุดสังเกตุนะครับ ถ้าเราใช้ volume ใน service หมายความว่า เราจะเชื่อม volume นะครับ แต่ถ้าจะสร้าง volume มันต้องอยู่ระดับเดียวกับ service นะครับ ย้อนกลับไปดูไฟล์ด้านบนนะครับ โดย ชุดที่สร้าง volume ด้านล่างที่ชื่อ redis-data จะถูกนำไปใช้ใน redis container นะครับ

links : ใช้เชื่อมต่อ Container เข้าด้วยกัน เหมือน –links โดยมันจะสร้าง hostname ให้สามารถเรียกใช้ได้โดยตรงใน containner ที่ถูกเรียกใช้

networks: ใช้สร้าง network เหมือน –network เพื่อแยกการทำงานของ docker container ใช้คุ่กับ links โดยถ้าอยู่ภายใน service จะเป็นการเชื่อม network เข้าด้วยกันกับ container อื่นๆ แต่ถ้าอยู่ระดับเดียวกับ service จะเป็นการสร้าง networks นะครับ

containner_name: ใช้กำหนดชื่อ containner

environment: ใช้กำหนดค่า environment variable ส่งให้กับ containner

โดยบางค่าสามารถกำหนดเป็น Array ได้นะครับยกตัวอย่างเช่น volume,ports,links,networks,environment โดยจะใช้ dash คั่นแต่ละบรรทัด และบางอย่าง กำหนดได้ค่าเดียวเช่น images, command, entrypoint, containner_name ยังมีอีกหลายอย่างนะครับใน syntax ของ docker-compose เช่น loggin,dns,extends ลองไปหาอ่านกันได้ในเว็บของ docker_compose เลยครับ เยอะครับถ้าอยากรู้ทั้งหมด แต่ถ้ารู้ทั้งหมดที่บอกไปด้านบนนี่ก็น่าจะพอสร้าง production จาก compose ได้แล้วล่ะครับ

สรุปการใช้งาน docker-compose จำเป็นไหม ตอบเลยถ้า dependency คุณเยอะกว่า 2 component ใช้เถอะครับไม่ลำบากแถมเรายังใช้ docker เป็นแล้ว ใช้ compose เป็นเรียนรู้ไม่นานเลยสังเกตุง่ายๆ คำสั่งใน yml นั่นเหมือนกับตอนเรา docker run เลยซึ่งแทบจะไม่ต้องเรียนรู้อะไรใหม่เลย วันนี้คงพอแค่นี้ก่อนไว้วันหลังจะมาเล่าประสบการณ์ในการ deploy ลง production ให้ฟังอีกรอบนะครับ

อ้างอิง
https://docs.docker.com/compose

August 30, 2016by adminwp
Docker

มาทดสอบการทำงาน Docker swarm ด้วย NodeJS

SWARM

หลายคนคงเคยได้ยืนชือเจ้า Docker Swarm มากันบ้างแล้วแต่ วันนี้ผมจะมายกตัวอย่างการใช้งาน Docker Swarm กับ ExpressJS ของ NodeJS โดยที่การทำงานเราจะเน้นไปที่การทดสอบการทำ Loadbalance ของ Docker Swarm โดย Docker Swarm ถูก Build In มากับ Docker Version 1.12 โดยเราสามารถตรวจสอบ Docker Version ก่อนที่เราจะลงมือทำตามคำสั่งด้านล่างนี้ครับ

Screen Shot 2559-07-26 at 3.24.43 PM

ถ้า Version ต่ำกว่านี้ก็ให้ทำการ Update นะครับ สำหรับ Windows นั้นตอนนี้มี Docker Version 1.12 เหมือนกันเพียงแต่ทำงานบน HyperV ซึ่งต้องใช้ Windows 10 ขึ้นไปนะครับ

** ถ้าคุณต้องการทำ Lab นี้ แบบหลาย Node โดยถ้ามีหลายเครื่อง ที่จะมา Join Swarm Node ให้เปิด Port เครื่อง Master

Default
1
2
3
Swarm : Port Require 2377 4789 7946
โดยถ้าเป็น Ubuntu : ufw allow 2377/tcp
ส่วน Windows : ไปที่ Section Windows Firewall

ที่เครื่อง Master ง่ายๆ ก่อน เริ่มต้นด้วยการ สร้าง Swarm ด้วยคำสั่ง Address 10.0.0.1 คือ IP ขา Lan ของ Docker Machine Master นะครับ

Default
1
docker swarm init  --listen-addr 10.0.0.1:2377

แต่ถ้าคุณมีเครื่องเดียวไม่ต้อง Bind Address ง่ายๆ แค่ ตำสั่งด้านล่างครับ

Default
1
docker swarm init

Screen Shot 2559-07-26 at 3.35.39 PM

ถ้าคุณมี Docker หลายเครื่องในวง LAN เดียวกันเครื่องที่สองขึ้นไปสามารถ Join Node ได้ด้วยคำสั่ง
Optional :
docker swarm joint 10.0.0.4:2377

ที่เครื่อง Master ถ้าคุณมีหลายเครื่องให้ใช้คำสั่ง จะเห็น Node ที่มา Join แต่ถ้าไม่มีก็ตามรูปครับจะเห็นแค่ Node เดียว
docker node ls
Screen Shot 2559-07-26 at 3.37.49 PM

แน่นอนครับว่าเครื่อง Master สำคัญ ในทาง Machine จริงๆ ตรงนี้ผมก็ยังไม่แน่ใจนะครับว่าเราจะป้องกัน single point of failure
ผมจะใช้ Image Node บน Docker Hub ในการทำ Lab นี้นะครับ บน Swam เราจะใช้ docker service แทน docker run นะครับ แต่ docker ps ก็ยังตงใช้เหมือนเดิม
จากนั้นทำการสร้าง Docker File เพราะเราจำเป็นต้องนำ Sourcecode เข้ามา Build Image ด้วย เพราะตอนทำงานเราไม่สามรถจะ Map Volume ตรงๆได้บน Docker Service

Default
1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM node:6-wheezy
 
MAINTAINER Worawut Boontan <GreanApp>
EXPOSE 3000
 
RUN echo "Asia/Bangkok" > /etc/timezone
RUN echo "Asia/Bangkok" > /etc/localtime
RUN dpkg-reconfigure -f noninteractive tzdata
ENV INSTALL_PATH ./project
RUN mkdir -p $INSTALL_PATH
WORKDIR $INSTALL_PATH
ADD . .
RUN npm install
CMD ["npm","start"]

ก่อนจะไปตรงนี้ คุณก็ใช้ express generator สร้างไฟล์ ด้วยการรัน express จากนั้นก็แก้ไฟล์ index.jade ให้แสดง Hostname ไว้เดี้ยวกลับมาแป๊ะ Code ให้ หรือไม่ก็ไปดูที่ os.hostname() ในคู่มือก็ได้นะครับไม่น่ายากเกินไป

จากนั้น Build Image และทำการ Create Service

Default
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
docker build -t nodetest .
 
 
# ก่อนอื่นก็องสร้าง Network ก่อนนะครับเพื่อจะได้รวมกลุ่ม Service ของเราเข้าด้วยกัน โดยโหมด Overlay จะใช้ในการทำ Multiple host /
# Multiple Service ซึ้งจะต่างออกไปจาก Mode Bridge ซึ่งเป็น Default ถ้าเครื่องคุณรัน Service เดียวใช้ Bridge ก็ได้ครับแต่ถ้า Overlay
# มันจะแยกออกจากัน
docker network create -d overlay network_private
 
#จากนั้นสร้าง Service ด้วยคำสั่งนี้
docker service create --name nodeapp -p 3000:3000 --network network_private --replicas 5 nodetest
 
#ตรวจสอบการทำงานของ Service นี้
docker service inspect nodeapp --pretty
 
#จะเห็นการทำงานแต่ล่ะ Node ซึ่งเรากำหนดไว้ 5 Node Replicas บน Machine Node เดียวกันอยู่
docker service tasks nodeapp
 
#การแก้ไข จำนวน Node
docker service update --replicas 0 nodeapp
 
#แสดง Node ที่ Join เข้ามา
docker node ls

และหลังจากนี้คุณยังคงใช้คำสั่ง docker ps , docker rm เพื่อจัดการ การทำงานของแต่ล่ะ Process Node ได้อย่างเดิม เรามาดูผลลัพธ์กันดีกว่าครับ
โดยเปิด Browser เข้าตามรูปเลยนะครับ
Screen Shot 2559-07-26 at 5.42.22 PM

ลอง Refresh ดูซึ่งจะได้ผลลัพธ์ต่างกันออกมาตามรูป แสดงว่า Swarm สามารถทำการ Load Balance ได้แล้วครับ

Screen Shot 2559-07-26 at 5.44.48 PM

สรุป ถึง Docker Swarm จะมีการทำให้ Docker สามารถ Scale และ Loadbalance service ได้ง่ายๆ แต่เราก็ต้องดูต่อไปครับเมื่อรุ่น 1.12 เป็น Version Release แล้วจะเป็นยังไงตอนที่เขียนบทความนี้ยังคง RC อยู่ และก็ยังไม่แน่ใจเรื่อง Production กับการที่มี Master เดียว เพราะเอาจริงๆ ผมเพิ่งมารู้จัก Swarm ก็ตอนที่เขาเอามาเข้า BuildIn กับ Docker ไว้ผมศึกษาเพิ่มเติมจะมาเขียนบทความ Docker Swarm Master Node ใหม่อีกรอบแล้วกันครับ

July 26, 2016by adminwp
Docker

Docker for DevOps back to basic from someone images to own images จริงๆ น่าจะเขียนบทความนี้ก่อนเนอะ

docker
จริงๆ ผมก็อาจเขียนบทความอื่นเร็วเกินไปโดยลืมเกริ่น บทความเบื้องต้น น้องในทีมที่ผมดูแลหลายๆ คนยังคง สับสนกับพื้นฐานของ Docker โดยวันนี้ เราจะมาเรียนคำสั่งพื้นฐานกันก่อนเพราะพื้นฐานสำคัญเสมอครับ เรามาเริ่มกันเลยดีกว่าครับ

Default
1
2
3
4
5
6
*** ก่อนที่จะลงมือใช้ Docker ทักษะนึงที่คุณควรเข้าใจก่อนใช้งาน Docker แล้ว ผมแนะนำว่าควรจะใช้ git เป็น ก่อนที่จะใช้ Docker
นะครับ เพราะอะไรผมถึงบอกอย่างนั้นเพราะว่า หากคุณทำงานบนเครื่องคุณอยู่ คงไม่สะดวกแน่ถ้าคุณจะมัวมานั่งทำการ FTP / SCP
เข้าไปโยนไฟล์บน docker machine แล้วแก้ไขมันซึ่งมันก็คงจะลำบากไม่น้อย เพราะในบางครั้งเราก็อยากแก้ไฟล์บน docker machine
แล้วส่งไฟล์นั้นกลับมาที่เครื่อง developer เหมือนกัน เพราะถ้าคุณใช้ git เพื่อเก็บ files เหล่านี้ไม่ว่าจะเป็น Dockerfile/
Configuration File/ Source Code หรือ อื่นๆ เป็นส่วน ประกอบแล้ว สิ่งที่คุณต้องทำก็แค่ Git push/pull ซึ่งเป็นทางเลือกที่ดีมากๆ
ดังนั้นแนะนำว่าควรใช้ Git ให้เป็นก่อนจะมาลุย Docker ครับ แต่วันนี้ ยังไม่ต้องก็ได้นะครับ อ่านบทความจบ ทำตามได้ก็โอเคแล้วครับ

วันนี้ผมจะใช้ Squid ซุึ่งเป็น Proxy ยอดนิยมมาเป็นตัวอย่าง ของบทความนี้ โดย ผมขอใช้ image จาก dockerhub ที่ชื่อว่า sameersbn/squid โดยเริ่มที่ผมจะ pull image เขามาก่อน ตามด้านล่างนี้เลย

Default
1
docker pull sameersbn/squid

แล้วก็ Run image นี้ด้วยคำสั่ง

Default
1
2
3
4
5
docker run -d -p 3128:3128 --name squidlab sameersbn/squid
 
#-d เพื่อทำงานแบบ Deamon หรือ Service
#-p dockermachine_port:container_port เพื่อ Mapping Port กับตัว Docker machine ในตัวอย่างนี้ 3128
#--name containername ตั้งชื่อ Container

จากนั้นตรวจสอบการทำงานที่ docker machine ว่ามีการ mapping port เรียบร้อยแล้วหรือไม่

Default
1
2
3
4
5
6
netstat -an | grep 3128
 
tcp6       0      0 :::3128                 :::*                    LISTEN
 
#ถ้าได้ผลลัพธ์แบบนี้แสดงว่า น่าจะทำงานได้ อาจจะทดสอบ ลองใช้งานเลยก็ได้นะครับขั้นตอนนี้โดยไปชี้ proxy
#มาที่ ip ของ Docker machine แล้วระบุ Port เป็น 3128

โดยจุดประสงค์ต่อไปคือเราต้องการ Configuration ของ Squid มาเก็บไว้กับเราเพื่อใช้ในการปรับแต่งค่าต่างๆ โดยจริงๆ เราอาจจะไปหาจาก Source Code ของ Squid เอง หรือ หาจาก Image ที่เราจะใช้นี่แหละ ถ้าเราต้องการจะหาจาก Image ที่เราทำเราต้อง copy ออกมาให้ได้ โดยเราจะต้องไปดูก่อนว่าไฟล์ Configuration เก็บไว้ที่ไหน ซึ่งถ้าสังเกตุจาก Dockerfile ของ image นี้ จะอยู่ที่
/etc/squid3/squid.conf
/sbin/entrypoint.sh

คำถามแน่นอนผมรู้ได้ไงก็ง่ายๆ ครับไป ดู squid default configuration path for ubuntu เลยก็ได้ว่าจริงๆ แล้วเก็บที่ไหน หรือ อาจจะดูจาก Dockerfile ของ Image ที่เราเอามาใช้งาน โดยให้สังเกตุจาก COPY xxxx xxxxx สองบรรทัด โดยอันแรก คือ squid.conf ส่วนอีกไฟล์คือ entrypoint ที่จะทำงานหลัง container ทำงาน

เรามาดู Dockerfile ของ Image นี้กัน ดูที่ https://hub.docker.com/r/sameersbn/squid/~/dockerfile/

Default
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
FROM sameersbn/ubuntu:14.04.20160608
MAINTAINER sameer@damagehead.com
 
ENV SQUID_VERSION=3.3.8 \
    SQUID_CACHE_DIR=/var/spool/squid3 \
    SQUID_LOG_DIR=/var/log/squid3 \
    SQUID_USER=proxy
 
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 80F70E11F0F0D5F10CB20E62F5DA5F09C3173AA6 \
&& echo "deb http://ppa.launchpad.net/brightbox/squid-ssl/ubuntu trusty main" >> /etc/apt/sources.list \
&& apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y squid3-ssl=${SQUID_VERSION}* \
&& mv /etc/squid3/squid.conf /etc/squid3/squid.conf.dist \
&& rm -rf /var/lib/apt/lists/*
 
COPY squid.conf /etc/squid3/squid.conf
COPY entrypoint.sh /sbin/entrypoint.sh
RUN chmod 755 /sbin/entrypoint.sh
 
EXPOSE 3128/tcp
VOLUME ["${SQUID_CACHE_DIR}"]
ENTRYPOINT ["/sbin/entrypoint.sh"]

หลังจากนี้ เราจะเอา Configuration ของ เขามาเก็บไว้ที่เรา ง่ายสุด ก็ copy เลยครับ คำสั่งสำหรับ copy file มาจาก Containner ก็คือ docker cp จากนั้นทำการ copy file เหล่านี้ออกมา โดย

Default
1
2
3
docker cp squidlab:/etc/squid3/squid.conf .
docker cp squidlab:/sbin/entrypoint.sh .
#copy ไฟล์มาไว้ที่ current directory

ซึ่งหลังจากทำเสร็จเราจะได้ไฟล์ที่จำเป็นสำหรับ Image ของเราแล้ว ก็สร้าง Dockerfile ด้วย Notepad หรือ Editor ที่เราถนัดของเราเองโดยเอา Template จาก Dockerfile ด้านบนได้เลยครับ (ไว้วันหลังจะมาอธิบายทีละบรรทัดให้อ่านกันอีกที) โดยโครงสร้าง Folder ที่เราควรมีก็คือ หลังจากสร้างไฟล์ Dockerfile ครวจเป็นดังนี้ โดยสองไฟล์ด้านล่างมาจาก docker cp ที่ทำไปก่อนหน้านี้

Default
1
2
3
- Dockerfile # Dockerfile for build image
- squid.conf # squid configuration
- entrypoint.sh # entry point for start daemon service

ก่อนที่เราจะไปต่อ ถ้าเราจะทำ Image เอง ผมแนะนำให้ลบ Image ของ Squid และ Container ที่ run squid ที่เราได้ใช้งานเมื่อซักครู่ ออกไปก่อนครับแล้วค่อยมา run ใหม่ เมื่อเราสร้าง Image ของเราเองแล้วอีกรอบนึง โดยใช้คำสั่ง

Default
1
2
docker rmi -f sameersbn/squid
docker rm -f squidlab

หลังจากนี้ก็เริ่มขั้นตอนสร้าง Image ด้วยตนเองเลยครับ โดยก่อนจะสร้าง อาจจะปรับแต่ง Configuration ก่อนแล้วค่อย build หรือจะทำ Volume เอาก็ได้

Default
1
2
3
docker build -t my/squid .
#build image my/squid
docker run -d -p 3128:3128 --name squidcontainer my/squid

เพียงเท่านี้ คุณก็สามารถสร้าง Docker Image ได้ด้วนตนเองเรียบร้อยแล้ว
ทดสอบโดยใช้ Chrome ทำตามรูปเลยครับ ไปที่ chrome://settings/

0
กดปุ่ม Show Advance Setting

1
หา Networking Section แล้วกดปุ่มตั้งค่า Proxy

2
ใส่ IP ของ Docker Machine เราและ Port ให้ถูกต้องจากนั้นก็เปิด Browser ดูว่าทำงานได้ปกติหรือไม่ ถ้าเปิดได้ปกติ ก็เป็นอันเรียบร้อยครับ

Docker cheat sheet ถ้าใครจำคำสั่งเหล่านี้ได้หมด แล้วก็สบายใจได้เลยคุณเกือบจะใช้ Docker ได้แล้ว

Default
1
2
3
4
5
6
7
8
9
docker build -t xxxx . # build image from dockerfile
docker pull image_name # pull image from dockerhub
docker images # list all images
docker run -it –name xxxx containner_name -p access_port:container_port # run contaniner
docker exec -it container_name bash # access deamon console
docker logs -tf container_name # see current terminal console
 
docker rmi -f image_name # remove image
docker rm -f containner_name # remove container

สรุป วันนี้คงเป็นพื้นฐานที่คุณสามารถลองไปประยุกต์ใช้กับ Image อื่นๆ ได้ง่ายๆ ลองหา Image เพิ่มเติมที่เป็น Offcial ที่อยู่บน dockerhub.com มาลง Mod / Change อะไรตามใจเรา ให้เหมาะกับงานเรา เพื่อทำงานได้สะดวกรวดเร็วกันดีกว่า ยุคนี้แม้แต่ Microsoft Windows ก็ยังจะมี Container ให้เราได้ใช้เร็วๆ นี้แน่นอนในชื่อ Server Core กับ Nano Server ซึ่งอาจจะรันบน Native Application เลยบน Windows 10 รุ่นถัดไป จริงๆวันนี้อยากสอนเรื่อง Volume และ Compose ต่อ แต่กลัวสับสนไว้ตอนหน้าแล้วกันนะครับ พบกันใหม่ในบทความต่อไปครับ คาดว่าจะสลับไปเขียน .NET Core มาลงบ้าง เผื่อเบื่อ Docker

July 11, 2016by adminwp
Docker

Docker for DevOps Team. ใช้กับทีมพัฒนาได้ง่ายๆ ตอนที่ 2

docker

Docker for DevOps
หลังจาก ตอนแรก ที่เราใช้ Docker ไปกับ แบบ Command Line โดยรุ่นที่ผมใช้ตอนนี้คือ Docker version 1.11.0, build 4dc5990 ซึ่งเราจะทำให้มันเป็น Startup config ตอน Boot เครื่องจะได้ไม่ต้องมาพิมพ์ที่หน้าเครื่อง โดยถ้าได้อ่าน Docker document เขาจะบอกว่าถ้าต้องการตั้งค่า Docker Options ให้ไปแก้ไขที่ไฟล์ /etc/default/docker โดยการ

Default
1
  sudo nano /etc/default/docker

จากนั้นทำการแก้ไขบรรทัด DOCKER_OPTS อย่าลืมเอา # ออกด้วยนะครับ
ค่า DNS อยู่ที่ Server ของตัวเองนะครับ อันนี้ ผมใช้ของ Google กับ ตัวที่อยู่ขา LAN ของผมเอง

Default
1
DOCKER_OPTS="-D --tls=false --dns 8.8.8.8 --dns 8.8.4.4 --dns 192.158.1.86 -H tcp://0.0.0.0:2375  -H fd://"

-H คือ Host ส่วน fd: คือ System Socket ทำให้ทำงานบน local ได้ หรือถ้าต้องการแยก socket ก็สามารถใช้งาน
unix:///var/run/docker.sock ได้เช่นเดียวกัน
ปล. อย่าเพิ่ง restart service Docker นะครับเพราะว่า ในรุ่นนี้เหมือนไฟล์ CONFIG ไม่ถูกตั้งค่าให้ทำงาน DOCKER_OPTS ให้ไปแก้ไขไฟล์ที่

/lib/systemd/system/docker.service แก้ไข ตามด้านล่างเลยนะครับ

Default
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket
 
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
EnvironmentFile=/etc/default/docker
ExecStart=/usr/bin/docker daemon $DOCKER_OPTS
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
 
[Install]
WantedBy=multi-user.target

จากนั้นแนะนำว่า Reboot เครื่องเพื่อให้ docker reload config ใหม่ จริงๆ มีคำสั่งให้มันโหลดใหม่นะแต่ในเครื่องที่ผมทดลองไม่สามารถ อ่านค่ามาใหม่ได้ แต่ปรากฏว่า Reboot มาแล้วทำงานได้ปกติ

พอกลับมาลองทดสอบพิมพ์

Default
1
2
3
ps -aux |grep docker
# น่าจะได้ผลลัพธ์
root      1873  0.1  1.0 586188 42832 ?        Ssl  15:05   0:01 /usr/bin/docker daemon -D --tls=false --dns 8.8.8.8 --dns 8.8.4.4 --dns 192.158.1.86 -H tcp://0.0.0.0:2375 -H fd://

ก็ถ้าเห็น Process Docker daemon สามารถทำงานได้ตรงกับ Option ที่เราตั้งค่าไว้ก็แสดงว่าถูกต้องแล้ว สามารถใช้ docker command connect มาจากเครื่อง Developer เข้ามาเพื่อใช้งานได้ทันที พบกันใหม่ตอนที่ 3 เรื่อง Data Persistent นะครับ

April 28, 2016by adminwp
Docker

Docker for DevOps Team. ใช้กับทีมพัฒนาได้ง่ายๆ เส้นทางเดินนี้ โรยด้วย CommandLine LoL

docker

Docker for DevOps

บทความนี้ เน้นการใช้งานในทีม DevOps แบบแชร์ Deamon และทำงานบน Ubuntu ไม่ได้ผ่าน Boot2Docker นะครับ ผมขอข้ามขั้นตอนการติดตั้งไปนะครับ ถ้าใครเพิ่งหัด Docker ให้ข้ามไปนะครับ วิธีติดตั้งให้ไปอ่านที่นี้เลยนะครับ Docker Installation ก็คือเตรียม Ubuntu เป็น Container หลักให้เรียบร้อย
จากนั้น

1. Docker deamon เราเตรียมให้เรียบร้อยก่อนนะครับ

Killall process ของ docker ก่อนนะครับ

Default
1
   sudo killall docker

เกือบลืมไปถ้าคุณ enable Ubuntu firewall ไว้ก็เปิด Port 2375 ด้วย

Default
1
    sudo ufw allow 2375/tcp

จากนั้นที่หน้าเครื่อง Ubuntu รันเป็น Deamon

Default
1
   sudo ./usr/bin/docker daemon -D --tls=false -H tcp://0.0.0.0:2375

tls=false verify false คือไม่มีการตรวจสอบการเชื่อมต่อเข้ามายัง Docker Container ซึ่งจริงๆ อันตราย แต่ใช้ใน Local จะกลัวอะไรซินะ

2. กรณี เครื่อง Developer เป็น MAC / Windows ให้ลง Docker Toolbox
Docker Toolbox ลงเสร็จเปิด Docker Quickstart Terminal

1

3. ที่ Docker Terminal ก็ทดสอบเชื่อมต่อ เข้าไปยัง Docker container และใช้ image hello-world มาทดสอบได้
xxx.xxx.xxx.xxx คือ IP ขา LAN ของเครื่อง Ubuntu ที่เรา Run Ubuntu Deamon ไว้นะครับ

Default
1
2
docker -H tcp://xxx.xxx.xxx.xxx:2375 pull hello-world
docker -H tcp://xxx.xxx.xxx.xxx:2375 run hello-world

2

ถ้ารันได้ ก็ Enjoy ครับ ตอนหน้าจะมาต่อเรื่องการ Map port กับ Volume ทั้ง แบบ Persistent กับ Container และแบบยิง Path มาที่ Developer Machine
สวัสดีครับ

April 25, 2016by adminwp

Recent Posts

  • สร้าง Redis Production/Development grade ด้วย Docker แบบขำๆ
  • Minikube ติดตั้ง บน Windows 10
  • Restart Service VMWare 5.5
  • ขั้นตอนการสร้าง Create Certificate เพื่อใช้ใน MailEnable สำหรับใช้งาน SMTPS , IMAPS
  • GraphQL ดียังไง แล้วดีกว่า Rest ยังไง

Recent Comments

  • Surutn Muintabutr on ตั้งค่า Redis สำหรับ Production Server
  • Satit Seethaphon on AngularJS Introduction First Video
  • ภูนาม สุวรรณเคหะ on Asp.NET VNext เหล้าใหม่ในขวดใหม่ มาช้าไปมั้ย (OSX / LINUX)
  • วรวุฒิ บุญตัน on Web App ด้วย Yoman Workflow !
  • วรวุฒิ บุญตัน on Web App ด้วย Yoman Workflow !

Archives

  • January 2018
  • September 2017
  • June 2017
  • March 2017
  • December 2016
  • August 2016
  • July 2016
  • June 2016
  • April 2016
  • October 2015
  • September 2015
  • August 2015
  • July 2015
  • June 2015
  • May 2015
  • March 2015
  • November 2014
  • September 2014
  • August 2014
  • June 2014
  • April 2014
  • February 2014
  • November 2013

Categories

  • .NET Core
  • Android
  • AngularJS
  • Docker
  • Network Equipment
  • NodeJS
  • Other
  • Server
  • Uncategorized

“การส่งมอบงานตรงเวลาอย่างเดียวไม่พอ งานที่ส่งต้องตรงใจผู้ใช้มากที่สุด อย่ากลัว Change จงพร้อมที่จะ Change จงกล้าที่จะเปลี่ยนแม้กระทั่งงานที่เคยทำเสร็จ Refactor มันเป็นประจำด้วย งานที่เสร็จหรือไม่เสร็จก็ Retrospective ด้วยเพื่อเพิ่ม Productivity ในอนาคต”

© 2015 copyright GreanApp // All rights reserved // Privacy Policy
Greanapp is a Grean Time