มีนักเขียนที่ประกอบไปด้วยเพื่อให้คุณต้องเขียนคำสั่งมากมายที่คุณต้องใช้กับ docker-cli
นักเทียบท่าเขียนยังทำให้ง่ายต่อการเริ่มต้นหลายคอนเทนเนอร์ในเวลาเดียวกันและเชื่อมต่อพวกเขาโดยอัตโนมัติพร้อมกับเครือข่ายบางรูปแบบ
วัตถุประสงค์ของนักแต่งเพลงคือเพื่อทำหน้าที่เป็นนักเทียบท่า cli แต่จะออกคำสั่งหลายคำสั่งให้เร็วขึ้น
ในการใช้ประโยชน์จากนักแต่งเพลงคุณต้องเข้ารหัสคำสั่งที่คุณใช้ก่อนหน้านี้ในdocker-compose.yml
ไฟล์
คุณไม่เพียง แต่จะคัดลอกวางลงในไฟล์ yaml มีไวยากรณ์พิเศษ
เมื่อสร้างแล้วคุณจะต้องป้อนไปที่ cli-docker close และมันจะขึ้นอยู่กับ cli เพื่อแยกวิเคราะห์ไฟล์และสร้างคอนเทนเนอร์ต่าง ๆ ทั้งหมดด้วยการกำหนดค่าที่ถูกต้องที่เราระบุ
ดังนั้นคุณจะมีคอนเทนเนอร์แยกต่างหากสมมติว่าตัวอย่างหนึ่งคือredis-server
และที่สองคือnode-app
และคุณต้องการที่สร้างขึ้นโดยใช้Dockerfile
ในไดเรกทอรีปัจจุบันของคุณ
นอกจากนี้หลังจากสร้างคอนเทนเนอร์คุณจะแมปพอร์ตจากคอนเทนเนอร์ไปยังเครื่องโลคัลเพื่อเข้าถึงทุกสิ่งที่ทำงานอยู่ภายใน
ดังนั้นสำหรับdocker-compose.yml
ไฟล์ของคุณคุณต้องการเริ่มบรรทัดแรกดังนี้:
version: '3'
นั่นบอกนักเทียบท่าถึงเวอร์ชันที่docker-compose
คุณต้องการใช้ หลังจากนั้นคุณต้องเพิ่ม:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
โปรดสังเกตการเยื้องสำคัญมาก นอกจากนี้แจ้งให้ทราบสำหรับบริการที่ฉันคว้าภาพ แต่สำหรับบริการอื่นฉันกำลังบอกdocker-compose
ให้ดูในไดเรกทอรีปัจจุบันเพื่อสร้างภาพที่จะใช้สำหรับภาชนะที่สอง
จากนั้นคุณต้องการระบุพอร์ตต่าง ๆ ทั้งหมดที่คุณต้องการเปิดบนคอนเทนเนอร์นี้
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
-
โปรดสังเกตว่าเส้นประเส้นประในไฟล์ yaml เป็นวิธีที่เราระบุอาร์เรย์ ในตัวอย่างนี้ฉันกำลังทำแผนที่8081
ในเครื่องท้องถิ่นของฉันไป8081
ยังภาชนะที่ชอบ:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "8081:8081"
ดังนั้นพอร์ตแรกคือเครื่องโลคัลของคุณและอีกพอร์ตคือพอร์ตบนคอนเทนเนอร์คุณสามารถแยกแยะความแตกต่างระหว่างสองอย่างเพื่อหลีกเลี่ยงความสับสนดังนี้
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "4001:8081"
โดยการพัฒนาdocker-compose.yml
ไฟล์ของคุณเช่นนี้มันจะสร้างคอนเทนเนอร์เหล่านี้บนเครือข่ายเดียวกันและพวกเขาจะสามารถเข้าถึงสื่อสารกับกันและกันได้อย่างอิสระตามที่พวกเขาต้องการและแลกเปลี่ยนข้อมูลได้มากเท่าที่พวกเขาต้องการ
เมื่อสร้างคอนเทนเนอร์สองรายการโดยใช้docker-compose
เราไม่ต้องการการประกาศพอร์ตใด ๆ
ในตัวอย่างของฉันเราต้องทำการกำหนดค่าโค้ดบางอย่างในแอป Nodejs ที่มีลักษณะดังนี้:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server'
});
ฉันใช้ตัวอย่างนี้ด้านบนเพื่อทำให้คุณทราบว่าอาจมีการกำหนดค่าบางอย่างที่คุณต้องทำเพิ่มเติมจากdocker-compose.yml
ไฟล์ที่อาจเฉพาะเจาะจงสำหรับโครงการของคุณ
ตอนนี้ถ้าคุณพบว่าตัวเองกำลังทำงานกับแอพ Nodejs และ redis คุณต้องการให้แน่ใจว่าคุณทราบถึงพอร์ตเริ่มต้นที่ Nodejs ใช้ดังนั้นฉันจะเพิ่มสิ่งนี้:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server',
port: 6379
});
ดังนั้นนักเทียบท่าจะเห็นว่าแอป Node กำลังค้นหาredis-server
และเปลี่ยนเส้นทางการเชื่อมต่อนั้นไปยังคอนเทนเนอร์ที่ใช้งานอยู่
ตลอดเวลาDockerfile
มีเพียงสิ่งนี้:
FROM node:alpine
WORKDIR '/app'
COPY /package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
ดังนั้นในขณะที่ก่อนที่คุณจะต้องเรียกใช้docker run myimage
เพื่อสร้างอินสแตนซ์ของคอนเทนเนอร์หรือบริการทั้งหมดภายในไฟล์คุณสามารถเรียกใช้แทนได้docker-compose up
และคุณไม่จำเป็นต้องระบุรูปภาพเนื่องจาก Docker จะมองหาไดเรกทอรีการทำงานปัจจุบันและมองหาdocker-compose.yml
ไฟล์ข้างในนั้น
ก่อนที่docker-compose.yml
เรามีการจัดการกับคำสั่งที่สองที่แยกต่างหากจากdocker build .
และdocker run myimage
แต่ในโลกถ้าคุณต้องการที่จะสร้างภาพของคุณที่คุณเขียนdocker-compose
docker-compose up --build
นั่นบอกให้ Docker เริ่มต้นคอนเทนเนอร์อีกครั้ง แต่สร้างใหม่เพื่อรับการเปลี่ยนแปลงล่าสุด
ดังนั้นdocker-compose
ทำให้การทำงานกับคอนเทนเนอร์หลาย ๆ ตัวง่ายขึ้น ครั้งต่อไปที่คุณจะต้องเริ่มต้นกลุ่มภาชนะนี้ในพื้นหลังที่คุณสามารถทำได้และจะหยุดพวกเขาที่คุณสามารถทำได้docker-compose up -d
docker-compose down