ครั้งที่แล้วพาเล่น Docker Machine ทั่งบน Digital Ocean, Azure และ Rackspace ครั้งนี้จะมาแนะนำ Docker Swarm ตัว Docker Swarm ทำหน้าที่คล้ายกับ etcd ใน CoreOS เพื่อใช้ในการผูก Cluster โดยใช้ Service เป็นหลัก ซึ่ง Docker Hub จะให้บริการ service discovery ให้ ซึ่งผู้ใช้สามารถเรียกใช้ Swarm ได้ผ่าน Docker Image หรือใช้งานร่วมกับ Docker Machine ได้เช่นเดียวกัน 8ครั้งนี้เราจะใช้ Machine กับ Digital Ocean ติดตั้งเครื่องมือที่ต้องใช้กันก่อน

ติดตั้ง Docker Machine ดังนี้

wget https://github.com/docker/machine/releases/download/v0.1.0/docker-machine_linux-amd64 -O /usr/local/bin/docker-machine

จากนั้นขอ UUID ของ Cluster ดังนี้

docker run swarm create

เมื่อได้เลข UUID มาแล้วให้เก็บไว้ใน env จะได้ใช้งานสะดวกมากขึ้น อย่าลืมใส่ Token ของ Digital Ocean

export SWARM_TOTEN="c8dc7848af2cbeccd7bc7dfef48e7448"
export DO_TOKEN="YOUR-DIGITALOCEAN-TOKEN"

ใช้ Docker Machine สร้าง Swarm Master ขึ้นมาก่อน

docker-machine create \
-d digitalocean \
--digitalocean-access-token $DO_TOKEN \
--swarm \
--swarm-master \
--swarm-discovery token://$SWARM_TOTEN \
swarm-master

จากนั้นเพิ่ม Swarm Node ดังนี้

docker-machine create \
-d digitalocean \
--digitalocean-access-token $DO_TOKEN \
--swarm \
--swarm-discovery token://$SWARM_TOTEN \
swarm-node-01

ให้เพิ่มอีก 3 Node จะได้ Docker Machine ดังนี้

docker-machine ls

จากนั้นเราจะใช้ Docker เชื่อมต่อไปยัง Swarm Master ตั้งค่า env เพิ่มดังนี้

$(docker-machine env --swarm swarm-master)

ลองดู info จะพบว่าเรากำลังใช้งานผ่าน swarm อยู่

docker info

มาลอง deploy wordpress ดู

docker run -d -p 80:80 --name wordpess01 tutum/wordpress

เราจะพบว่า Docker Swarm สุ่ม Docker Host ให้เรา

จากภาพ wordress01 อยู่ที่ node02 และ wordpress02 อยู่ที่ node04 หากเราต้องการ deploy service โดยกำหนดเงื่อนไข เช่น กำหนด node, ขนาดของ memory หรือ container ไม่ควรซ้ำกันใน Docker Host ก็สามรถใช้งานได้ เช่น

Deploy ไปยัง node ชื่อ swarm-node0-9 เท่านั้น

docker run --rm -d -e constraint:node==/swarm-node[0-9]+/

Deploy ไปยัง node ที่ไม่มี Container ชื่อ redis ทำงานอยู่

docker run -d --name redis_1 -e ‘affinity:container!=redis_*’ redis

Comments are closed.