การใช้ Dockerfile เพื่อเปิดเผยพอร์ต

Using Dockerfile Expose Ports



เป็นเรื่องง่ายมากที่จะสร้างอิมเมจ Docker แบบกำหนดเองจากอิมเมจ Docker ที่มีอยู่โดยใช้ Dockerfile . โดยปกติผู้คนจะใช้ภาพฐานขั้นต่ำเช่น อัลไพน์ หรือ อูบุนตู/เดเบียน เพื่อจุดประสงค์นั้น สมมติว่าคุณต้องการสร้างอิมเมจ Docker แบบกำหนดเองของเว็บแอปโปรดของคุณที่เขียนด้วย NodeJS แอปจะทำงานบนพอร์ต 8080 . โดยค่าเริ่มต้น คุณจะไม่สามารถเข้าถึงเว็บแอปบนพอร์ต 8080 จากเครื่องโฮสต์ของคุณ คุณจะต้องบอก Docker ว่าคุณต้องการเปิดหรือเปิดพอร์ต 8080 เพื่อให้สามารถเข้าถึงได้จากเครื่องโฮสต์ของคุณ

ในบทความนี้ ผมจะแสดงวิธีเปิดเผยพอร์ตโดยใช้ Dockerfile กับตัวอย่างในโลกแห่งความเป็นจริง มาเริ่มกันเลย.







ขั้นแรก เราต้องสร้างไดเร็กทอรีโครงการ ในไดเร็กทอรีนี้ คุณควรเก็บไฟล์โปรเจ็กต์ทั้งหมดและ a Dockerfile .



รันคำสั่งต่อไปนี้เพื่อสร้างไดเร็กทอรีโครงการ myapp/ ในไดเร็กทอรี HOME ของผู้ใช้ของคุณและไปที่:



$mkdir~/myapp&& ซีดี~/myapp

เตรียมเว็บแอปให้พร้อม:

ตอนนี้สร้างไดเร็กทอรี src/ ข้างใน ~/myapp/ ไดเร็กทอรีด้วยคำสั่งต่อไปนี้:

$mkdirsrc

ใน src/ ไดเร็กทอรี ซอร์สโค้ดทั้งหมดของแอปพลิเคชัน NodeJS ของฉันจะถูกเก็บไว้

ฉันจะสร้างความเรียบง่าย app.js ไฟล์ใน src/ ไดเร็กทอรีและเรียกใช้เว็บเซิร์ฟเวอร์อย่างง่ายบนพอร์ต 8080 เพียงเพื่อการสาธิต

NS src/app.js ไฟล์มีรหัสบรรทัดต่อไปนี้:

การเขียน Dockerfile และการเปิดเผยพอร์ต:

ตอนนี้สร้าง Dockerfile ใน ~/myapp ไดเร็กทอรีด้วยคำสั่งต่อไปนี้:

$สัมผัสDockerfile

ตอนนี้พิมพ์ในบรรทัดต่อไปนี้เพื่อ Dockerfile และบันทึกไว้ ฉันจะพูดถึงความหมายของบรรทัดเหล่านี้ในภายหลัง

ที่นี่, จากเทือกเขาแอลป์:3.8 หมายถึง ใช้ อัลไพน์:3.8 ภาพนักเทียบท่าเป็นฐานสำหรับภาพใหม่ที่เราจะสร้างขึ้นจากสิ่งนี้ Dockerfile .

อัปเดต RUN apk หมายถึง เรียกใช้ apk update คำสั่งในอิมเมจ Docker ฐาน อัลไพน์:3.8 .

เรียกใช้ apk เพิ่ม –no-cache nodejs หมายถึง เรียกใช้ apk เพิ่ม คำสั่งติดตั้งภาษาโปรแกรม NodeJS ในไฟล์ อัลไพน์:3.8 ภาพฐานนักเทียบท่า

COPY ./src /app หมายถึงคัดลอกไฟล์ทั้งหมดจาก ~/myapp/src ไดเรกทอรีไปยัง /แอป ไดเร็กทอรีของอิมเมจ Docker ใหม่ที่เราจะสร้างโดยใช้ Dockerfile .

CMD [/usr/bin/node, /app/app.js] หมายถึง เรียกใช้ /app/app.js ไฟล์จากคอนเทนเนอร์ใหม่โดยใช้ โหนด ไบนารีตั้งอยู่ใน /usr/bin/node .

ในที่สุด ถึง เปิดเผย 8080/tcp หมายถึง เปิดเผยหรือเปิดพอร์ต TCP 8080 ไปยังคอมพิวเตอร์โฮสต์

การสร้างอิมเมจ Docker แบบกำหนดเองโดยใช้ Dockerfile:

มาสร้างอิมเมจ Docker กัน อัลไพน์-โหนด:v1 ใช้ Dockerfile ที่เราเพิ่งสร้างขึ้น

ก่อนอื่นให้แน่ใจว่าคุณอยู่ใน ~/myapp/ ไดเร็กทอรีแล้วรันคำสั่งต่อไปนี้เพื่อสร้าง Docker image อัลไพน์-โหนด:v1 :

$นักเทียบท่า build-NSอัลไพน์-โหนด:v1

อย่างที่คุณเห็น อิมเมจ Docker แบบกำหนดเอง อัลไพน์-โหนด:v1 กำลังถูกสร้างขึ้น อิมเมจและแพ็คเกจ Docker พื้นฐานที่จำเป็นจะถูกดึงออกจากอินเทอร์เน็ต

อย่างที่คุณเห็น อิมเมจ Docker แบบกำหนดเอง อัลไพน์-โหนด:v1 ถูกสร้างขึ้นเรียบร้อยแล้ว

การทดสอบอิมเมจ Docker แบบกำหนดเอง:

ตอนนี้เราสามารถทดสอบอิมเมจ Docker แบบกำหนดเองได้แล้ว อัลไพน์-โหนด:v1 ง่ายมาก สิ่งที่เราต้องทำคือสร้างคอนเทนเนอร์จาก อัลไพน์-โหนด:v1 ภาพ.

รันคำสั่งต่อไปนี้เพื่อสร้าง Docker container www จาก อัลไพน์-โหนด:v1 ภาพนักเทียบท่า:

$นักเทียบท่าวิ่ง-NS -มัน --ชื่อwww อัลไพน์-โหนด:v1

คอนเทนเนอร์ www ถูกสร้างขึ้น

ตอนนี้เรามาดูที่อยู่ IP ของ .กันเถอะ www คอนเทนเนอร์ Docker ด้วยคำสั่งต่อไปนี้:

$นักเทียบท่าตรวจสอบ www| กริปที่อยู่

อย่างที่คุณเห็น ในกรณีของฉัน ที่อยู่ IP คือ 172.17.0.3 . ดังนั้นแอปพลิเคชัน NodeJS ที่ฉันเขียนควรสามารถเข้าถึงได้จากเว็บเบราว์เซอร์ที่พอร์ต 8080 ของที่อยู่ IP นี้

โว้ว! ฉันสามารถเข้าถึงพอร์ต 8080 ของฉัน www คอนเทนเนอร์นักเทียบท่า

นั่นเป็นวิธีที่คุณเปิดเผยพอร์ตบางอย่างในอิมเมจ Docker ที่กำหนดเองซึ่งคุณจะสร้างโดยใช้ Dockerfile .

การเปิดเผยพอร์ต TCP และ UDP โดยใช้ Dockerfile:

ในส่วนก่อนหน้าของบทความนี้ ฉันแสดงวิธีเปิดเผยพอร์ต TCP โดยใช้a Dockerfile .

คุณสามารถเปิดเผยพอร์ต TCP ได้อย่างง่ายดาย (สมมติว่าพอร์ต TCP 53 ) ในของคุณ Dockerfile ด้วยบรรทัดต่อไปนี้:

เปิดเผย53/tcp

คุณยังสามารถเปิดเผยพอร์ต UDP (สมมติว่าพอร์ต UDP 53 ) ด้วยบรรทัดต่อไปนี้ใน your Dockerfile :

เปิดเผย53/udp

คุณสามารถเปิดเผยพอร์ต TCP และ UDP พร้อมกันด้วยบรรทัดต่อไปนี้ใน your Dockerfile :

เปิดเผย53/tcp
เปิดเผย53/udp

หากคุณไม่ได้ระบุว่าจะใช้โปรโตคอลใด (TCP หรือ UDP) ระบบจะใช้ TCP เป็นค่าเริ่มต้น ตัวอย่างเช่น หากคุณเขียนบรรทัดต่อไปนี้ใน your Dockerfile :

เปิดเผย53

จากนั้นนักเทียบท่าจะถือว่าคุณต้องการใช้พอร์ต TCP 53

การเปิดเผยหลายพอร์ตโดยใช้ Dockerfile:

สมมติว่าคุณต้องการสร้างอิมเมจ MEAN stack Docker ที่กำหนดเอง ในกรณีนี้ คุณจะใช้งานเซิร์ฟเวอร์ HTTP ในบางพอร์ต (สมมติว่าพอร์ต TCP 80 หรือ 8080) เซิร์ฟเวอร์ FTP ที่ทำงานบนพอร์ต TCP 21 เซิร์ฟเวอร์ฐานข้อมูล SQL (สมมุติว่า MySQL) ซึ่งทำงานบนพอร์ต TCP 3306 หรือเซิร์ฟเวอร์ฐานข้อมูล NoSQL (สมมติว่า MongoDB) ซึ่งทำงานบนพอร์ต TCP 27017 หรือ 27018 ซึ่งเป็นเซิร์ฟเวอร์ SSH ที่ทำงานบนพอร์ต TCP 22 นั่นเป็นพอร์ตมากมาย!

ข่าวดีก็คือ; คุณสามารถเปิดเผยพอร์ตได้มากเท่าที่ต้องการบนอิมเมจ Docker ที่คุณกำหนดเองซึ่งสร้างขึ้นโดยใช้ Dockerfile .

พอร์ตในตัวอย่างด้านบนสามารถแสดงได้ด้วยบรรทัดต่อไปนี้ใน your Dockerfile :

เปิดเผย80/tcp
เปิดเผย8080/tcp
เปิดเผยยี่สิบเอ็ด/tcp
เปิดเผย22/tcp
เปิดเผย3306/tcp
เปิดเผย27017/tcp
เปิดเผย27018/tcp

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

เปิดเผย80
เปิดเผย8080
เปิดเผยยี่สิบเอ็ด
เปิดเผย22
เปิดเผย3306
เปิดเผย27017
เปิดเผย27018

หากต้องการ คุณสามารถผสมพอร์ต TCP และ UDP ในของคุณ Dockerfile . ตัวอย่างเช่น หากคุณเรียกใช้เซิร์ฟเวอร์ DNS (ซึ่งทำงานบนพอร์ต UDP 53) พร้อมกับตัวอย่างข้างต้น คุณจะต้องเพิ่มบรรทัดต่อไปนี้ใน Dockerfile .

เปิดเผย80
เปิดเผย8080
เปิดเผยยี่สิบเอ็ด
เปิดเผย22
เปิดเผย53/udp
เปิดเผย3306
เปิดเผย27017
เปิดเผย27018

นั่นคือวิธีที่คุณเปิดเผยพอร์ตโดยใช้ Dockerfile . หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับ Dockerfile และเปิดเผยพอร์ตโดยใช้ Dockerfile , อ่าน Dockerfile คู่มืออ้างอิงที่ https://docs.docker.com/engine/reference/builder/#expose

ขอบคุณที่อ่านบทความนี้