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

ตั้งแต่การพัฒนาในพื้นที่ไปจนถึงการปรับใช้งานระยะไกลด้วย Docker Machine และ Compose

เป้าหมายของโพสต์นี้คือการพัฒนาแอปพลิเคชันในสภาพแวดล้อมที่ใกล้เคียงกับสภาพแวดล้อมการปรับใช้ระยะไกลของคุณมากที่สุด มาทำสิ่งนี้โดยใช้ Docker Machine และ Compose เพื่อย้ายแอปจากการพัฒนาในเครื่องไปเป็นการปรับใช้ระยะไกล

นักเทียบท่า นักเทียบท่า นักเทียบท่า

ตั้งแต่การพัฒนาในพื้นที่ไปจนถึงการปรับใช้งานระยะไกลด้วย Docker Machine และ Compose ขั้นแรกเราต้องติดตั้ง Docker โพสต์นี้ใช้ส่วนประกอบ Docker ล่าสุดและดีที่สุดทั้งหมดในขณะที่เขียน

  1. Docker 1.7.0
  2. เครื่องเทียบท่า 0.3.0
  3. 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 ใดบ้าง

ผลลัพธ์สุดท้ายของการย้ายแอปพลิเคชันของเราจากการพัฒนาในพื้นที่ไปเป็นการปรับใช้ระยะไกลจะมีลักษณะดังนี้

ตั้งแต่การพัฒนาในพื้นที่ไปจนถึงการปรับใช้งานระยะไกลด้วย Docker Machine และ Compose

การพัฒนาท้องถิ่น

สภาพแวดล้อมการพัฒนาในพื้นที่ของเรา (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 เพื่อใช้สิ่งนั้นแทนได้

บทสรุป

ฉันหวังว่าคุณจะได้เรียนรู้วิธีพัฒนาแอปพลิเคชันในสภาพแวดล้อมที่ใกล้เคียงกับสภาพแวดล้อมการปรับใช้ระยะไกลของคุณมากที่สุด หากคุณพบปัญหาใด ๆ โปรดแจ้งให้เราทราบในความคิดเห็นด้านล่าง