Docker Compose สำหรับการจัดเก็บแอปพลิเคชัน MEAN Stack



Docker Compose เป็นเครื่องมือสำหรับกำหนดและเรียกใช้คอนเทนเนอร์หลายตัวเพื่อเรียกใช้แอปพลิเคชันที่ซับซ้อนใน Docker ตัวอย่างเช่นการกำหนดแอปพลิเคชัน MEAN

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

หลังจากสำรวจความเป็นไปได้ที่มาพร้อมกับ Docker แล้วมันเป็นเรื่องน่าตื่นเต้นมากที่ได้เรียนรู้เพิ่มเติม ใช่หรือไม่ อย่างน้อยฉันก็เป็นเมื่อฉันพบกับความท้าทาย





ข้อมูลเบื้องต้นเกี่ยวกับ Docker Compose

การบรรจุแอปพลิเคชันบริการเดียวเป็นเรื่องง่ายสำหรับฉัน แต่เมื่อฉันต้องบรรจุบริการหลายอย่างไว้ในตู้คอนเทนเนอร์แยกกันฉันก็วิ่งเข้าไปในสิ่งกีดขวางบนถนน ความต้องการของฉันคือคอนเทนเนอร์และโฮสต์แอปพลิเคชัน MEAN stack

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



Docker Compose สามารถใช้เพื่อสร้างคอนเทนเนอร์แยกกัน (และโฮสต์ไว้) สำหรับแต่ละสแต็กในแอปพลิเคชัน MEAN stack MEAN เป็นคำย่อของ MongoDB Express Angular & NodeJs การสาธิตที่ฉันจะแสดงในบล็อกนี้ก็อยู่ในหัวข้อเดียวกัน

ด้วยการใช้ Docker Compose เราสามารถโฮสต์แต่ละเทคโนโลยีเหล่านี้ในคอนเทนเนอร์แยกกันบนโฮสต์เดียวกันและทำให้เทคโนโลยีเหล่านี้สื่อสารกันได้ แต่ละคอนเทนเนอร์จะเปิดเผยพอร์ตสำหรับสื่อสารกับคอนเทนเนอร์อื่น ๆ

การสื่อสารและเวลาที่ใช้งานของคอนเทนเนอร์เหล่านี้จะได้รับการดูแลโดย Docker Compose



คุณอาจถามว่าจะตั้งค่าโครงสร้างพื้นฐานทั้งหมดนี้ได้อย่างไร? ถ้าอย่างนั้นให้ฉันอธิบายรายละเอียดเพิ่มเติม

Dockerfile

คล้ายกับวิธีที่เราหมุนคอนเทนเนอร์แอปพลิเคชันเดียวโดยการเขียน Dockerfile เราจะต้องเขียน Dockerfile แยกต่างหากสำหรับการสร้างแอปพลิเคชันคอนเทนเนอร์เดี่ยวแต่ละรายการ นอกจากนี้เรายังต้องเขียน Docker Compose File ซึ่งจะทำงานจริง Docker Compose File จะเรียกใช้งาน Dockerfiles ที่แตกต่างกันเพื่อสร้างคอนเทนเนอร์ที่แตกต่างกันและปล่อยให้พวกเขาโต้ตอบกัน

ในกรณีของเราเรามีแอปพลิเคชันสแต็กเต็มรูปแบบซึ่งประกอบด้วย MongoDB, ExpressJS, Angular และ NodeJS MongoDB ดูแลฐานข้อมูลส่วนหลัง NodeJS และ ExpressJS สำหรับการแสดงผลฝั่งเซิร์ฟเวอร์และ Angular ใช้สำหรับส่วนหน้า

MEAN Stack App - Docker Compose - Edureka

เนื่องจากมีส่วนประกอบสามอย่างเราจึงต้องหมุนภาชนะสำหรับแต่ละส่วนประกอบ เราต้องหมุนภาชนะด้วยวิธีต่อไปนี้:

  1. คอนเทนเนอร์ 1 - เชิงมุม
  2. คอนเทนเนอร์ 2 - NodeJS และ ExpressJS
  3. คอนเทนเนอร์ 3 - MongoDB

การสร้าง Docker Containers

ในขั้นตอนแรกในการเทียบเคียงแอปพลิเคชันค่าเฉลี่ยเรามาเขียน Dockerfile สำหรับการสร้างส่วนประกอบแต่ละรายการโดยเริ่มจากคอนเทนเนอร์ของ Angular Dockerfile นี้จะต้องอยู่ในไดเร็กทอรีโปรเจ็กต์พร้อมกับไฟล์ 'package.json' 'package.json' มีรายละเอียดเกี่ยวกับเวอร์ชันของการอ้างอิงที่ต้องใช้โดย 'NPM' ในการสร้างแอปพลิเคชันเชิงมุม

1. Dockerfile สำหรับ Front End

จากโหนด: 6 RUN mkdir -p / usr / src / app WORKDIR / usr / src / app COPY package.json / usr / src / app RUN npm cache clean RUN npm install COPY / usr / src / แอป EXPOSE 4200 CMD ['npm', 'start']

เช่นเคยคำสั่งแรกของเราคือดึงอิมเมจพื้นฐานและเรากำลังดึงอิมเมจฐาน 'โหนด: 6'

คำสั่งสองคำสั่งถัดไปเกี่ยวกับการสร้างไดเร็กทอรีใหม่ '/ usr / src / app' ภายใน Docker Container เพื่อจัดเก็บโค้ด Angular และทำให้เป็นไดเร็กทอรีการทำงานภายในคอนเทนเนอร์

ข้อดีและข้อเสียของ python

จากนั้นเราจะคัดลอกไฟล์ 'package.json' จากไดเรกทอรีโครงการของเราไปยังภายในคอนเทนเนอร์

จากนั้นเราเรียกใช้คำสั่ง 'npm cache clean' ซึ่งจะล้างแคช npm

หลังจากนั้นเราจึงเรียกใช้คำสั่ง 'npm install' ซึ่งจะเริ่มดาวน์โหลดแผ่นหม้อไอน้ำที่จำเป็นสำหรับการโฮสต์แอป Angular จะเริ่มดาวน์โหลดแผ่นหม้อไอน้ำตามเวอร์ชันของการอ้างอิงที่ระบุใน 'package.json'

การรันคำสั่ง 'RUN' ครั้งต่อไปคือการคัดลอกโค้ดทั้งหมดโฟลเดอร์ที่นำเสนอจากไดเรกทอรีโครงการไปยังภายในคอนเทนเนอร์

คำสั่งดังกล่าวขอให้คอนเทนเนอร์แสดงหมายเลขพอร์ต 4200 สำหรับการสื่อสารกับเซิร์ฟเวอร์ส่วนหลังเพื่อส่งคำขอที่ผู้ใช้เข้าถึงไคลเอ็นต์ส่วนหน้าผ่าน Web UI

สุดท้ายคำสั่งสุดท้ายคือคำสั่ง 'RUN' เพื่อเริ่ม 'npm' สิ่งนี้เริ่มดำเนินการรหัสสำหรับการสร้างแอพ Angular ของเรา

ขณะนี้แอป Angular พร้อมแล้ว แต่จะไม่ได้รับการโฮสต์อย่างเหมาะสมเนื่องจากการพึ่งพาเซิร์ฟเวอร์ส่วนหลังและฐานข้อมูล ดังนั้นเรามาดูกันดีกว่าและเขียน Dockerfile สำหรับคอนเทนเนอร์เซิร์ฟเวอร์ส่วนหลัง

2. Dockerfile สำหรับ Back End

แม้ dockerfile นี้จะปรากฏในไดเร็กทอรีโปรเจ็กต์ ไดเร็กทอรีนี้จะมีไฟล์ 'package.json' สำหรับกำหนดการอ้างอิงของเซิร์ฟเวอร์ Express และข้อกำหนดอื่น ๆ ของ NodeJS แต่ที่สำคัญที่สุดคือมีรหัสโครงการเพื่อรองรับเซิร์ฟเวอร์ส่วนหลัง

จากโหนด: 6 RUN mkdir -p / usr / src / app WORKDIR / usr / src / app COPY package.json / usr / src / app RUN npm cache clean RUN npm install COPY / usr / src / แอป EXPOSE 3000 CMD ['npm', 'start']

อย่างที่คุณเห็นมีความคล้ายคลึงกันมากมายระหว่าง Dockerfiles ทั้งสอง เราใช้ 'node: 6' เดียวกันกับเลเยอร์อิมเมจพื้นฐานสร้างไดเร็กทอรีใหม่ภายในคอนเทนเนอร์ทำให้เป็นไดเร็กทอรีการทำงานและเรียกใช้คำสั่ง 'npm install' ร่วมกับผู้อื่น แต่ความแตกต่างเพียงอย่างเดียวคือหมายเลขพอร์ตที่เปิดเผยสำหรับการสื่อสาร ในกรณีนี้จะมีการกำหนดพอร์ตหมายเลข 3000 นี่คือที่ที่เซิร์ฟเวอร์จะโฮสต์และจะค้นหาคำขอจากไคลเอนต์

3. ฐานข้อมูล

คุณอาจสงสัยว่าเหตุใดฉันจึงไม่กล่าวถึง 'dockerfile For Database' ในส่วนหัว เหตุผลก็คือจริงๆแล้วเราไม่จำเป็นต้องทำการปรับแต่งใด ๆ เราสามารถดึงอิมเมจฐาน 'MongoDB' เพื่อจัดเก็บข้อมูลของเราได้ทันทีและเพียงแค่เปิดเผยหมายเลขพอร์ตที่สามารถเข้าถึงได้

ตอนนี้คำถามในใจของคุณคือฉันจะทำอย่างไร เราสามารถทำได้ใน Docker Compose File

Docker เขียนไฟล์

Docker Compose File เป็นไฟล์ YAML ที่มีรายละเอียดเกี่ยวกับบริการเครือข่ายและไดรฟ์ข้อมูลสำหรับการตั้งค่าแอปพลิเคชัน Docker

เรียกใช้คำสั่งด้านล่างเพื่อค้นหาเวอร์ชันของ Docker Engine ของคุณ

c ++ fibonacci เรียกซ้ำ
นักเทียบท่า -v

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

เนื่องจากฉันใช้ Docker Engine เวอร์ชัน 17.05.0-ce ฉันจึงใช้ Docker Compose เวอร์ชัน 3

ติดตั้ง Docker Compose

ในการดาวน์โหลด Compose ให้เรียกใช้ชุดคำสั่งด้านล่าง

sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o / usr / local / bin / docker- เขียน sudo chmod + x / usr / local / bin / docker-compose

โปรดทราบว่าหมายเลขเวอร์ชันในคำสั่งจะเปลี่ยนไปตามเวอร์ชัน Docker Engine ที่คุณใช้งานอยู่

ด้านล่างนี้คือคำสั่งซึ่งเป็นส่วนหนึ่งของ Docker Compose File ของฉัน

เวอร์ชัน: '3.0' # ระบุเวอร์ชันเขียนเทียบท่า # กำหนดบริการ / คอนเทนเนอร์ที่จะเรียกใช้บริการ: เชิงมุม: # ชื่อของการสร้างบริการแรก: แอปเชิงมุม # ระบุไดเร็กทอรีของพอร์ต Dockerfile: - '4200: 4200' # ระบุการแมปพอร์ตด่วน: # ชื่อของเซอร์วิสบิลด์ที่สอง: express-server # ระบุไดเร็กทอรีของพอร์ต Dockerfile: - '3000: 3000' #specify พอร์ตการแมปลิงก์: - ฐานข้อมูล # เชื่อมโยงบริการนี้กับฐานข้อมูลบริการฐานข้อมูล: # name ของเซอร์วิสอิมเมจที่สาม: mongo # ระบุอิมเมจที่จะสร้างคอนเทนเนอร์จากพอร์ต: - '27017: 27017' # ระบุการส่งต่อพอร์ต

ฉันค่อนข้างมั่นใจว่าคำสั่งในไฟล์ด้านบนไม่สมเหตุสมผลกับคุณ เรามาแก้ปัญหากันดีกว่า

ในบรรทัดแรกของโค้ดฉันได้กำหนดเวอร์ชันของ Docker Compose ที่ฉันใช้ นี่เป็นขั้นตอนที่สำคัญมากหากคุณต้องการให้ Compose ทำงานได้อย่างถูกต้องโดยไม่เกิดข้อผิดพลาดใด ๆ อย่าลืมดาวน์โหลดเวอร์ชัน Docker Compose ตามเวอร์ชันของ Docker Engine ของคุณ

หลังจากนั้นฉันกำหนดคอนเทนเนอร์สามตู้โดยใช้คำหลัก 'บริการ' บริการเหล่านี้อ้างถึงองค์ประกอบสามส่วนของสแต็กของฉันส่วนหน้าส่วนหลังและฐานข้อมูล ดังนั้นในกรณีนี้ชื่อคอนเทนเนอร์ของฉันจะเป็นชื่อบริการของฉันนั่นคือ 'เชิงมุม' 'ด่วน' และ 'ฐานข้อมูล'

คีย์เวิร์ด 'build' ใช้เพื่อระบุว่า dockerfile สำหรับการหมุนคอนเทนเนอร์นั้นมีอยู่ในไดเร็กทอรีนั้น เดี๋ยวก่อนคุณจะสับสนได้อย่างไร?

มันง่ายมาก ต้องระบุเส้นทางหลัง 'build:' ในกรณีของเรา 'angular-app' และ 'express-server' คือพา ธ ไปยังไดเร็กทอรีสองไดเร็กทอรีที่สามารถเข้าถึงได้จากไดเร็กทอรีที่มี Docker Compose File อยู่ สำหรับคอนเทนเนอร์ฐานข้อมูลของเราฉันพูดง่ายๆว่าใช้ 'image: mongo' ฐานแทนเส้นทางไปยัง dockerfile

สำหรับแต่ละบริการเหล่านี้ฉันได้ระบุหมายเลขพอร์ตที่สามารถใช้เพื่อรับ / ส่งคำขอจากคอนเทนเนอร์อื่น ๆ (บริการ) 4200 ในกรณีของเชิงมุม 3000 ในกรณีด่วนและ 27017 ในกรณีของ mongo

นอกจากนี้คอนเทนเนอร์แบบด่วนยังมี 'ลิงก์:' ไปยังคอนเทนเนอร์ฐานข้อมูลซึ่งระบุว่าข้อมูลใด ๆ ที่ได้รับที่ฝั่งเซิร์ฟเวอร์จะถูกส่งไปยังฐานข้อมูลที่จะจัดเก็บ

ในที่สุดเราก็มาถึงบทสรุปของการตั้งค่าการเขียน ในการเริ่มต้น Docker Compose และหมุนคอนเทนเนอร์ทั้งสามด้วยสามบริการเราจำเป็นต้องดำเนินการสองคำสั่งด้านล่างจากไดเร็กทอรีที่มี Docker Compose File (ไฟล์ YAML):

นักเทียบท่าเขียนสร้างนักเทียบท่าเขียนขึ้น

คำสั่ง 'docker-compose build' ใช้เพื่อสร้าง / สร้างบริการใหม่ในขณะที่คำสั่ง 'docker-compose up' ใช้เพื่อสร้าง / เริ่มต้นคอนเทนเนอร์ ลุย! ลองด้วยตัวคุณเอง

ด้านล่างนี้คือภาพหน้าจอของอิมเมจ Docker ที่สร้างขึ้นจากนั้นจึงถูกเรียกใช้งาน คุณสามารถสังเกตได้ว่ามีการสร้างภาพเชิงมุมจากนั้นติดแท็กด้วยชื่อเป็น 'angular: latest'

นอกจากนี้รูปภาพของ Express ยังสร้างขึ้นโดยมีชื่อและแท็กเป็น 'express: latest'

เมื่อสร้างอิมเมจแล้วมาลองเรียกใช้งานและหมุนคอนเทนเนอร์ในกระบวนการ ด้านล่างนี้คือภาพหน้าจอ

ด้านล่างนี้คือภาพหน้าจอที่ระบุว่า 'webpack: รวบรวมเรียบร้อยแล้ว' ซึ่งหมายความว่าบริการทั้งสามได้รับการบรรจุโดย Docker สำเร็จ

เมื่อโฮสต์คอนเทนเนอร์แล้วคุณจะเห็นบริการที่ใช้งานอยู่ในพอร์ตต่างๆ พิมพ์หมายเลขพอร์ตต่อไปนี้ในเว็บเบราว์เซอร์ของคุณเพื่อโต้ตอบกับ GUI ของแอป MEAN

localhost: 4200 - แอปเชิงมุม (ส่วนหน้า)
localhost: 3000 - Express Server & NodeJS (ด้านหลัง / ฝั่งเซิร์ฟเวอร์)
localhost: 27017 - MongoDB (ฐานข้อมูล)

ประทับใจยัง? รอเพราะ Docker ยังไม่เสร็จ! เราสามารถใช้คำสั่ง“ docker-compose scale = ’x'” เพื่อปรับขนาดขึ้น / ลงได้อย่างง่ายดาย กล่าวอีกนัยหนึ่งเราสามารถสร้างคอนเทนเนอร์จำนวนมากสำหรับบริการได้ ด้านล่างนี้คือคำสั่งที่สมบูรณ์ในการปรับขนาดบริการเฉพาะเป็นคอนเทนเนอร์ '5':

นักเทียบท่าเขียนมาตราส่วน = 5

การเพิ่มขนาดบริการที่ง่ายดายการบรรจุหีบห่อและการจัดเก็บในลักษณะที่คุ้มค่าเป็นสิ่งที่ทำให้ Docker เป็นหนึ่งในเครื่องมือปรับใช้ที่ดีที่สุดและเป็นที่ชื่นชอบส่วนตัวของฉัน

หากคุณยังมีข้อสงสัยเกี่ยวกับแนวคิดนี้คุณสามารถดูวิดีโอด้านล่างซึ่งฉันได้อธิบายแนวคิดเดียวกันพร้อมกับวิธีการตั้งค่า Docker Compose ที่ใช้ได้จริง

นักเทียบท่าเขียน | แอพพลิเคชั่น MEAN Stack | สอน DevOps

ตอนนี้คุณได้เรียนรู้เกี่ยวกับ Docker แล้วลองดูไฟล์ โดย Edureka บริษัท การเรียนรู้ออนไลน์ที่เชื่อถือได้ซึ่งมีเครือข่ายผู้เรียนที่พึงพอใจมากกว่า 250,000 คนกระจายอยู่ทั่วโลก หลักสูตรการฝึกอบรม Edureka Docker Certification จะช่วยให้ผู้เรียนมีความเชี่ยวชาญในการใช้ Docker และเชี่ยวชาญ

วิธีใช้ tostring ใน java

มีคำถามสำหรับเรา? โปรดระบุไว้ในส่วนความคิดเห็นแล้วเราจะติดต่อกลับไป