เป้าหมาย
พัฒนาแอปพลิเคชันใน 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
- แก้ไข Code ใน Local Dev → ทดสอบที่ Dev IP
- Deploy ไป Remote:
docker-compose --file docker-compose-prod.yml build docker-compose --file docker-compose-prod.yml up -d - 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