วิธีเชื่อมต่อ Docker Containers
ใน "คอนเทนเนอร์คืออะไร" dockerเอกสารแสดงต่อไปนี้ดีภาพ:
สำหรับสถานการณ์ของฉันฉันมีเพียง App A และ App B มากำหนดให้พวกเขาเป็น Alice และ Bob Alice และ Bob สื่อสารกันอย่างไรโดยทั่วไปและโดยเฉพาะ โดยใช้หลักการ KISS ฉันใช้MySQLและBaseXจาก docker hub อย่างเป็นรูปธรรม
แนวคิดสำหรับxqueryไฟล์ที่อยู่บนโฮสต์ซึ่งจะถูกส่งไปยังBaseXคอนเทนเนอร์เพื่อดำเนินการ แบบสอบถามเฉพาะนี้เป็นจริงSQLดังนั้นMySQLคอนเทนเนอร์จะต้องถูกสอบถามเพื่อให้ได้ผลลัพธ์
สิ่งนี้จำเป็นต้องใช้การส่งต่อพอร์ตหรือวิธีการสร้างเครือข่ายอื่น ๆหรือไม่? เล่ม? สิ่งนี้ต้องการไฟล์เขียนเพิ่มเติมที่ประกอบด้วยในทางกลับกันMySQLและBaseX?
ไม่ต้องสงสัยเลยว่ามีหลายแนวทางที่เป็นไปได้ อะไรที่เป็นประโยชน์ที่สุดจากมุมมองการเรียนรู้? มีแนวคิดที่เบาและมีเส้นโค้งการเรียนรู้ที่ค่อยเป็นค่อยไป
แนวทางหนึ่งดูเหมือนจะใช้เครือข่ายสะพาน:
ใช้ประโยชน์จากความจริงที่ว่าตู้คอนเทนเนอร์สามารถมองเห็นกันและกันได้
ดูเหมือนว่าฉันจะไม่เกี่ยวข้องกับRESTบริการบนเว็บทั้งหมด
เมื่อดูคำถามที่เกี่ยวข้องสิ่งนี้อาจกระทบกับ reverse proxy
คำตอบ
ฉันยังค่อนข้างใหม่กับเกม Docker เหมือนกัน แต่ฉันมีโปรเจ็กต์เล็ก ๆ น้อย ๆ ที่ฉันทำตามที่คุณต้องการ จากประสบการณ์ของฉันเองกับการลองผิดลองถูก (ส่วนใหญ่เป็นข้อผิดพลาด ... ) ฉันขอแนะนำให้ใช้ docker-compose.yml กับเครือข่ายของคุณที่ตั้งค่าเป็น IP ภายในแบบคงที่ดังนั้นแต่ละคอนเทนเนอร์จะมีผลลัพธ์ที่คาดเดาได้และทำซ้ำได้และ IPs ที่คุณสามารถกำหนดค่าคอนเทนเนอร์ของคุณได้ เพื่อสื่อสารข้าม
ฉันไม่คุ้นเคยBaseXแต่ฉันมีสถานการณ์ตัวอย่างที่ใช้นักเทียบท่าversion: "3.7"ที่นี่ซึ่งสามารถเรียกใช้หลายแอพได้อย่างง่ายดายและ / หรือถูกเพิ่มหรือนำมาใช้ใหม่เพื่อให้เหมาะกับสมมุติฐานของคุณ
ตัวอย่างนักเทียบท่านี้มีดังต่อไปนี้:
คอนเทนเนอร์แยกต่างหากสำหรับการเติม
app-volumeไดรฟ์ข้อมูลของฉันด้วยเนื้อหาของที่เก็บ GitHub สาธารณะคอนเทนเนอร์ Apache Web Server ที่เปิดใช้งาน PHP-FPM สำหรับ "แบ็กเอนด์แบบเลือก" ที่สร้างจาก Dockerfile ในไดเร็กทอรี ~ / dockerbuild
คอนเทนเนอร์เว็บเซิร์ฟเวอร์ nginx ที่ใช้เป็นพร็อกซีย้อนกลับสำหรับทุกสิ่งที่ PHP จะถูกส่งไปยัง Apache (แต่ทำหน้าที่ & แคชทุกอย่างอื่น ๆ )
คอนเทนเนอร์ MariaDB ในชุดผสมสำหรับ DB ของแอปที่ฉันเติมด้วยไฟล์ mysqldump หลังจากสร้างแอปแล้ว
นี่คือ docker-compose.yml เวอร์ชันที่บางลงดังนั้นโปรดทราบว่าคุณสามารถเพิ่มสิ่งต่างๆเช่นhealthcheck:และcommand:ให้เหมาะกับความต้องการของคุณได้
คุณดำเนินการด้วยdocker-compose up -d --buildเพื่อสร้างและเริ่มแอปของคุณในคำสั่งเดียว (แต่คุณอาจต้องการสร้างไฟล์ ba (.sh) ของคุณเองที่คุณดำเนินการในภายหลังเช่นกันสำหรับขั้นตอนสุดท้ายที่สำคัญเหล่านั้น)
static-networkจะแจ้งให้ทราบ และในขณะที่ฉันใช้ไดรฟ์ข้อมูลที่ตั้งชื่อในตัวอย่างนั่นเป็นเพียงความชอบของฉัน
version: "3.7"
services:
github_repo_clone:
image: debian:latest
container_name: github_repo_clone
networks:
static-network:
ipv4_address: 172.20.0.254
command: bash -c "
apt-get update &&
apt-get install git -y &&
rm -rf examplerepo &&
git clone https://github.com/exampleuser/examplerepo.git &&
rm -rf /var/www/vhosts/exampleuser/examplerepo &&
mkdir -p /var/www/vhosts/exampleuser/examplerepo &&
cp -rapv examplerepo/* /var/www/vhosts/exampleuser/examplerepo &&
rm -rf examplerepo &&
tail -f /dev/null
"
volumes:
- app-volume:/var/www/vhosts
apache_php-fpm_backend:
container_name: debian-build-demo0
build: ~/dockerbuild
ports:
- "8080:8080"
networks:
static-network:
ipv4_address: 172.20.0.2
volumes:
- app-volume:/var/www/vhosts
nginx_rp:
image: nginx:latest
container_name: nginx-build-demo0
ports:
- "80:80"
- "443:443"
networks:
static-network:
ipv4_address: 172.20.0.3
volumes:
- app-volume:/var/www/vhosts
mariadb:
restart: always
image: mariadb:latest
container_name: mariadb-build-demo0
ports:
- "3306:3306"
networks:
static-network:
ipv4_address: 172.20.0.10
environment:
- MYSQL_ROOT_PASSWORD=4007p@$$w04d - MYSQL_USER=dbusernamegoeshere - MYSQL_PASSWORD=@p@$$w04d
- MYSQL_DATABASE=dbnamegoeshere
volumes:
- app-volume:/var/www/vhosts
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
timeout: 10s
retries: 5
volumes:
app-volume:
# external: true
networks:
static-network:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.20.0.0/16
คำสั่งล้างข้อมูลของฉันเมื่อฉันลบแอปนั้นน่าเกลียด แต่ก็ไม่ยากที่จะอ่านและดำเนินการดังนี้: docker-compose down -v ; docker rmi -f dockerbuild_apache_php-fpm_backend:latest mariadb:latest nginx:latest debian:latest ; docker rmi -f $(docker images -q --filter "dangling=true") ; docker rmi -f $(docker images -q --filter label=stage=intermediate) ; docker volume prune -f;
ฉันคิดว่า "แอปอิสระ" แต่ละแอปสามารถ (และน่าจะ) มี Docker-compose และ / หรือ Dockerfiles เป็นของตัวเอง แต่คุณอาจพบการทำงานร่วมกันกับ Dockerfiles บางอย่างที่คุณสามารถสร้างcommand:คำแนะนำที่กำหนดเองสำหรับ (เช่นตัวอย่าง git_repo_clone) เพื่อใช้ & แชร์ใน "แอป" หลายรายการ