Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> ฐานข้อมูล

การ Deploy แอปพลิเคชันจาก Local Development ไป Remote Servers ด้วย Docker Machine & Compose

เป้าหมาย

พัฒนาแอปพลิเคชันใน Environment ที่ใกล้เคียง Production มากที่สุด ใช้ Docker Machine และ Compose ย้ายแอปจาก Local Development ไป Remote Deployment

Docker Components (เวอร์ชันในบทความ)

  • Docker 1.7.0
  • Docker Machine 0.3.0
  • Docker Compose 1.3.0

สมมติรัน Docker ใน VirtualBox

แอปพลิเคชันตัวอย่าง: Guestbook

Simple Guestbook แสดง 3-Tier Architecture:

  • Web Server: Nginx
  • App Server: Python + Flask + Gunicorn (WSGI)
  • Database: MySQL

Code อยู่ที่ GitHub: git clone https://github.com/rackerlabs/guestbook.git -b dmc guestbook

Tip: ใช้ Alias ตรวจสอบ Docker Host ปัจจุบัน:

alias de='env | grep DOCKER_'
พิมพ์ de เพื่อดู Environment Variables

Local Development Environment

Dev Environment เรียกว่า -dev สำหรับแยกจาก Remote

Initialize Environment

docker-machine create --driver virtualbox guestbook-dev
docker-machine ip guestbook-dev  # จด IP Address
eval "$(docker-machine env guestbook-dev)"
docker-compose up

อ่าน docker-compose.yml เข้าใจโครงสร้าง (Extends docker-compose-common.yml)

Initialize Database

eval "$(docker-machine env guestbook-dev)"
docker-compose run --rm --no-deps app python app.py create_db

ใช้ One-off Container รัน Command สร้าง Table เนื่องจาก docker-compose Inject Environment Variables ให้อัตโนมัติ

เปิด Browser ไปที่ Guestbook Dev IP → Sign Guestbook

Make a Change (Hot Reload)

แก้ไข app/templates/index.html → Save → Reload Browser → เห็นการเปลี่ยนแปลงทันที (Volume Mount และ Command Config ใน docker-compose.yml ช่วยให้ทำได้)

Remote Deployment (Rackspace)

ซับซ้อนกว่า ต้อง Setup Credentials และ Security

Initialize Environment

export OS_USERNAME=your-rackspace-username
export OS_API_KEY=your-rackspace-api-key
export OS_REGION_NAME=IAD

docker-machine create --driver rackspace guestbook
docker-machine ip guestbook  # จด IP Address

Secure the Environment

docker-machine ssh guestbook "apt-get update"
docker-machine ssh guestbook "apt-get -y install fail2ban"
docker-machine ssh guestbook "ufw default deny"
docker-machine ssh guestbook "ufw allow ssh"
docker-machine ssh guestbook "ufw allow http"
docker-machine ssh guestbook "ufw allow 2376"  # Docker
docker-machine ssh guestbook "ufw --force enable"

Disclaimer: ไม่ใช่ Configuration ที่ปลอดภัยที่สุด แค่ดีกว่า Default

Continue Initialize (Set DB Environment Variables)

export MYSQL_USER=guestbook-admin
export MYSQL_PASSWORD=$(hexdump -v -e '1/1 "%.2x"' -n 32 /dev/random)
export MYSQL_ROOT_PASSWORD=$(hexdump -v -e '1/1 "%.2x"' -n 32 /dev/random)
echo "MYSQL_USER=$MYSQL_USER"
echo "MYSQL_PASSWORD=$MYSQL_PASSWORD"
echo "MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD"

ป้องกัน Commit Sensitive Data ไป GitHub

Build และ Run Containers

eval "$(docker-machine env guestbook)"
docker-compose --file docker-compose-prod.yml build
docker-compose --file docker-compose-prod.yml up -d

อ่าน docker-compose-prod.yml (Extends docker-compose-common.yml)

Initialize Database (Remote)

docker-compose --file docker-compose-prod.yml run --rm --no-deps app python app.py create_db

เปิด Browser ไปที่ Guestbook IP → Sign Guestbook

Deploy Changes ไป Remote

  1. แก้ไข Code ใน Local Dev → ทดสอบที่ Dev IP
  2. Deploy ไป Remote:
    docker-compose --file docker-compose-prod.yml build
    docker-compose --file docker-compose-prod.yml up -d
  3. Reload Remote IP → เห็นการเปลี่ยนแปลง ข้อมูลคงอยู่

What's Next?

Data สำคัญที่สุด ต้องมี Backup Plan:

  • Cron Job + Cloud Files
  • Cloud Backup (ง่ายกว่า)
  • Highly Available Cloud Database + เปลี่ยน docker-compose.yml ให้ใช้แทน

สรุป

เรียนรู้การพัฒนาใน Environment ใกล้เคียง Production ใช้ Docker Machine + Compose สำหรับ Seamless Transition จาก Local ไป Remote