เป้าหมายของโพสต์นี้คือการพัฒนาแอปพลิเคชันในสภาพแวดล้อมที่ใกล้เคียงกับสภาพแวดล้อมการปรับใช้ระยะไกลของคุณมากที่สุด มาทำสิ่งนี้โดยใช้ Docker Machine และ Compose เพื่อย้ายแอปจากการพัฒนาในเครื่องไปเป็นการปรับใช้ระยะไกล
นักเทียบท่า นักเทียบท่า นักเทียบท่า
ขั้นแรกเราต้องติดตั้ง Docker โพสต์นี้ใช้ส่วนประกอบ Docker ล่าสุดและดีที่สุดทั้งหมดในขณะที่เขียน
- Docker 1.7.0
- เครื่องเทียบท่า 0.3.0
- Docker Compose 1.3.0
ฉันจะถือว่าคุณกำลังใช้งาน Docker ใน VirtualBox ตลอดช่วงเวลาที่เหลือของโพสต์
กรุณาลงนามในสมุดเยี่ยมชมของเรา
แอปพลิเคชันที่เราจะปรับใช้นั้นเป็นสมุดเยี่ยมทั่วไป การสาธิตแอปพื้นฐาน 3 ระดับก็เพียงพอแล้ว เราจะเริ่มต้นด้วยสภาพแวดล้อมการพัฒนาในพื้นที่ซึ่งเราจะพัฒนาเว็บแอปโดยใช้เทคโนโลยีต่อไปนี้:
- Nginx สำหรับเว็บเซิร์ฟเวอร์
- สำหรับเซิร์ฟเวอร์แอป:
- Python สำหรับภาษาโปรแกรม
- ขวดสำหรับเว็บเฟรมเวิร์ก
- Gunicorn สำหรับเซิร์ฟเวอร์ WSGI
- MySQL สำหรับฐานข้อมูล
เรากำลังดำเนินการซื้อคืนบน GitHub เริ่มต้นด้วยการโคลน repo นั้น
git clone https://github.com/rackerlabs/guestbook.git -b dmc guestbook
cd guestbook
นอกจากนี้ยังค่อนข้างง่ายที่จะติดตามว่าโฮสต์ Docker ใดที่คุณใช้อยู่ด้านล่าง ขอแนะนำให้ตั้งค่านามแฝงนี้เพื่อช่วยให้คุณค้นหาโฮสต์ที่คุณกำลังพูดด้วยได้อย่างง่ายดาย
alias de='env | grep DOCKER_'
ตอนนี้คุณสามารถพิมพ์ de
เพื่อดูว่ามีการตั้งค่าตัวแปรสภาพแวดล้อมของ Docker ใดบ้าง
ผลลัพธ์สุดท้ายของการย้ายแอปพลิเคชันของเราจากการพัฒนาในพื้นที่ไปเป็นการปรับใช้ระยะไกลจะมีลักษณะดังนี้
การพัฒนาท้องถิ่น
สภาพแวดล้อมการพัฒนาในพื้นที่ของเรา (dev env) ค่อนข้างง่ายเพราะเราไม่ต้องตั้งค่าข้อมูลรับรองหรือกังวลเกี่ยวกับความปลอดภัย เราจะต่อท้ายเนื้อหา dev env ทั้งหมดด้วย "-dev" เพื่อให้แตกต่างจากการปรับใช้ระยะไกลของเรา
เริ่มต้นสภาพแวดล้อม
เราจะใช้เครื่องเทียบท่าเพื่อสร้างโฮสต์ Docker สำหรับคอนเทนเนอร์ของเรา จากนั้นเรากำหนดค่า Docker เพื่อใช้โฮสต์นั้น สุดท้าย การเขียนเทียบท่าจะทำให้สภาพแวดล้อมการพัฒนาทั้งหมดของเราปรากฏขึ้น
docker-machine create --driver virtualbox guestbook-dev
docker-machine ip guestbook-dev # note the Guestbook Dev IP Address
eval "$(docker-machine env guestbook-dev)"
docker-compose up
ในขณะที่กำลังทำงานอยู่ ให้อ่านผ่าน docker-compose.yml เพื่อทำความเข้าใจกับสิ่งที่ทำเพื่อเรา แสดงความคิดเห็นได้ดีจึงควรอธิบายตนเอง โปรดทราบว่ามันขยาย docker-compose-common.yml เป็นพื้นฐานสำหรับส่วนประกอบทั่วไปอย่างไร คุณสามารถค้นหาคำอธิบายแบบเต็มของรูปแบบไฟล์ Docker Compose ได้ในการอ้างอิง docker-compose.yml
เมื่อทุกอย่างดาวน์โหลดและใช้งานได้แล้ว เราจำเป็นต้องเริ่มต้นฐานข้อมูล เราจะใช้คอนเทนเนอร์แบบครั้งเดียวที่รันแอปของเราเพื่อเรียกใช้คำสั่ง python ที่สร้างตารางในฐานข้อมูลของเรา
เปิดเทอร์มินัลใหม่และเปลี่ยนเป็น dir สมุดเยี่ยม
eval "$(docker-machine env guestbook-dev)"
docker-compose run --rm --no-deps app python app.py create_db
ทำไมต้องมีปัญหาในการใช้คอนเทนเนอร์แบบใช้ครั้งเดียวสำหรับสิ่งนี้? เนื่องจาก docker-compose จะแทรกตัวแปรสภาพแวดล้อมที่เราจำเป็นต้องเชื่อมต่อกับฐานข้อมูลโดยอัตโนมัติ ไม่มีการกำหนดค่าให้เราทำ
ตอนนี้เปิดเบราว์เซอร์ของคุณและไปที่ที่อยู่ IP ของ Guestbook Dev ที่คุณระบุไว้ข้างต้น กรุณาลงนามในสมุดเยี่ยมชมของเรา
เปลี่ยนแปลง
ตรวจสอบให้แน่ใจว่าเราสามารถพัฒนาโค้ดแอปพลิเคชันของเราอย่างรวดเร็วต่อไป มีตัวเลือกการกำหนดค่าหลักสองสามตัวใน docker-compose.yml ที่ช่วยให้เราทำได้ อ่านความคิดเห็นสำหรับโวลุ่มและคำสั่งอีกครั้งในบริการแอป
เปิด app/templates/index.html ในโปรแกรมแก้ไขข้อความที่คุณชื่นชอบ ทำการเปลี่ยนแปลงและบันทึก กลับไปที่เบราว์เซอร์ของคุณและโหลดซ้ำ ว้าว!
การปรับใช้ระยะไกล
ส่วนนี้ยากกว่าเพราะเราต้องตั้งค่าข้อมูลรับรองและกังวลเกี่ยวกับความปลอดภัย หากคุณไม่มีบัญชี Rackspace คุณสามารถรับเครดิตฟรีได้โดยลงชื่อสมัครใช้ Developer+ เมื่อบัญชีของคุณพร้อมแล้ว คุณต้องค้นหาคีย์ API ของคุณ ตั้งค่าตัวแปรสภาพแวดล้อมต่อไปนี้ในเทอร์มินัลของคุณ
export OS_USERNAME=your-rackspace-username
export OS_API_KEY=your-rackspace-api-key
export OS_REGION_NAME=IAD
เริ่มต้นสภาพแวดล้อม
เราจะใช้เครื่องเทียบท่าเพื่อสร้างโฮสต์ Docker สำหรับคอนเทนเนอร์ของเรา
docker-machine create --driver rackspace guestbook
docker-machine ip guestbook # note the Guestbook IP Address
รักษาสิ่งแวดล้อม
ข้อจำกัดความรับผิดชอบ:สิ่งนี้ไม่ได้ใกล้เคียงกับการกำหนดค่าที่ปลอดภัยที่สุด สคริปต์นี้มีไว้เพื่อความปลอดภัยมากกว่าการกำหนดค่าเริ่มต้นเท่านั้น ไม่มีสัญญาใด ๆ เกี่ยวกับสคริปต์นี้ที่จะป้องกันไม่ให้เซิร์ฟเวอร์ของคุณเป็นเจ้าของหรือจักรยานของคุณถูกขโมย คนเลวยังคงออกไปหาคุณ และการเรียกใช้สคริปต์นี้ไม่ได้ทำให้คุณไม่ต้องเขียนโค้ดแอปพลิเคชันที่ปลอดภัย!
ติดตั้ง fail2ban เพื่อป้องกันความพยายามในการเข้าสู่ระบบแบบเดรัจฉานบนเซิร์ฟเวอร์ของคุณและตั้งค่าไฟร์วอลล์ด้วย ufw เพื่ออนุญาตเฉพาะพอร์ตที่เราต้องการ โปรดทราบว่าจะไม่มีเอาต์พุตใดปรากฏจนกว่าคำสั่งจะเสร็จสิ้น ดังนั้นจำเป็นต้องมีความอดทนเล็กน้อย
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"
ดำเนินการต่อเพื่อเริ่มต้นสภาพแวดล้อม
ก่อนที่เราจะให้ Docker Compose สร้างการปรับใช้ระยะไกลของเรา เราจำเป็นต้องตั้งค่าตัวแปรสภาพแวดล้อมบางอย่างสำหรับฐานข้อมูลของเรา ตัวแปรสภาพแวดล้อมเหล่านี้ถูกใช้โดยไฟล์ docker-compose-prod.yml เราทำเช่นนี้เพื่อป้องกันไม่ให้เราส่งข้อมูลที่ละเอียดอ่อนไปยัง GitHub
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"
ตอนนี้เรากำหนดค่า Docker ให้ใช้โฮสต์นั้น สุดท้าย Docker-compose จะสร้างและเรียกใช้คอนเทนเนอร์ของเราในเบื้องหลัง ดังนั้นเราจะไม่เห็นข้อความบันทึกที่มีสีสันเหมือนที่เราทำในการพัฒนาในพื้นที่
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 เพื่อทำความเข้าใจกับสิ่งที่ทำเพื่อเรา สังเกตว่ามีการกำหนดชื่อไฟล์ docker-compose.yml เริ่มต้นอย่างไร ดังนั้นเราจึงไม่ต้องรวมชื่อไฟล์ในคำสั่ง docker-compose แสดงความคิดเห็นได้ดีจึงควรอธิบายตนเอง นอกจากนี้ยังขยาย docker-compose-common.yml เป็นพื้นฐานสำหรับส่วนประกอบทั่วไป
เมื่อทุกอย่างถูกสร้างขึ้นและทำงาน เราจำเป็นต้องเริ่มต้นฐานข้อมูล เราจะใช้คอนเทนเนอร์แบบครั้งเดียวที่รันแอปของเราเพื่อเรียกใช้คำสั่ง python ที่สร้างตารางในฐานข้อมูลของเรา
docker-compose --file docker-compose-prod.yml run --rm --no-deps app python app.py create_db
ตอนนี้เปิดเบราว์เซอร์ของคุณและไปที่ที่อยู่ IP ของสมุดเยี่ยมที่คุณระบุไว้ข้างต้น กรุณาลงนามในสมุดเยี่ยมชมของเรา
ทำการเปลี่ยนแปลง
เราไม่ต้องการที่จะพัฒนาโค้ดแอปพลิเคชันของเราในสภาพแวดล้อมระยะไกล แต่เราต้องการที่จะปรับใช้การเปลี่ยนแปลงที่นั่นอย่างง่ายดาย
เปิด app/templates/index.html ในโปรแกรมแก้ไขข้อความที่คุณชื่นชอบ ทำการเปลี่ยนแปลงและบันทึก กลับไปที่เบราว์เซอร์ของคุณไปที่สมุดเยี่ยม Dev ที่อยู่ IP และโหลดซ้ำ ตรวจสอบให้แน่ใจว่ามีการเปลี่ยนแปลงตามที่คาดไว้ในสภาพแวดล้อมการพัฒนาในพื้นที่ของคุณ
ตอนนี้เราปรับใช้การเปลี่ยนแปลงนั้นกับสภาพแวดล้อมระยะไกลโดยเรียกใช้คำสั่งที่คุ้นเคยสองสามคำสั่ง
docker-compose --file docker-compose-prod.yml build
docker-compose --file docker-compose-prod.yml up -d
กลับไปที่เบราว์เซอร์ของคุณไปยังที่อยู่ IP ของสมุดเยี่ยมและโหลดซ้ำ โว้ว! การเปลี่ยนแปลงของคุณปรากฏขึ้นและข้อมูลของคุณจะไม่เปลี่ยนแปลง
ถัดไปคืออะไร
คุณจะทำอย่างไรต่อไปเพื่อก้าวไปอีกขั้นหนึ่ง
ข้อมูลของคุณเป็นส่วนที่สำคัญที่สุดของแอปพลิเคชันของคุณ คุณต้องแน่ใจว่าปลอดภัย เริ่มต้นด้วยแผนสำรอง คุณสามารถม้วนโซลูชันของคุณและทิ้งฐานข้อมูลของที่เก็บงาน cron ใน Cloud Files หรือคุณอาจใช้เส้นทางง่ายๆ และใช้ Cloud Backup สุดท้าย คุณสามารถสร้างฐานข้อมูลบนคลาวด์ที่มีความพร้อมใช้งานสูงและเปลี่ยน docker-compose.yml เพื่อใช้สิ่งนั้นแทนได้
บทสรุป
ฉันหวังว่าคุณจะได้เรียนรู้วิธีพัฒนาแอปพลิเคชันในสภาพแวดล้อมที่ใกล้เคียงกับสภาพแวดล้อมการปรับใช้ระยะไกลของคุณมากที่สุด หากคุณพบปัญหาใด ๆ โปรดแจ้งให้เราทราบในความคิดเห็นด้านล่าง