วิธีเชื่อมต่อ Docker Containers

Sep 23 2020

ใน "คอนเทนเนอร์คืออะไร" dockerเอกสารแสดงต่อไปนี้ดีภาพ:

สำหรับสถานการณ์ของฉันฉันมีเพียง App A และ App B มากำหนดให้พวกเขาเป็น Alice และ Bob Alice และ Bob สื่อสารกันอย่างไรโดยทั่วไปและโดยเฉพาะ โดยใช้หลักการ KISS ฉันใช้MySQLและBaseXจาก docker hub อย่างเป็นรูปธรรม

แนวคิดสำหรับxqueryไฟล์ที่อยู่บนโฮสต์ซึ่งจะถูกส่งไปยังBaseXคอนเทนเนอร์เพื่อดำเนินการ แบบสอบถามเฉพาะนี้เป็นจริงSQLดังนั้นMySQLคอนเทนเนอร์จะต้องถูกสอบถามเพื่อให้ได้ผลลัพธ์

สิ่งนี้จำเป็นต้องใช้การส่งต่อพอร์ตหรือวิธีการสร้างเครือข่ายอื่น ๆหรือไม่? เล่ม? สิ่งนี้ต้องการไฟล์เขียนเพิ่มเติมที่ประกอบด้วยในทางกลับกันMySQLและBaseX?

ไม่ต้องสงสัยเลยว่ามีหลายแนวทางที่เป็นไปได้ อะไรที่เป็นประโยชน์ที่สุดจากมุมมองการเรียนรู้? มีแนวคิดที่เบาและมีเส้นโค้งการเรียนรู้ที่ค่อยเป็นค่อยไป

แนวทางหนึ่งดูเหมือนจะใช้เครือข่ายสะพาน:

ใช้ประโยชน์จากความจริงที่ว่าตู้คอนเทนเนอร์สามารถมองเห็นกันและกันได้

ดูเหมือนว่าฉันจะไม่เกี่ยวข้องกับRESTบริการบนเว็บทั้งหมด


เมื่อดูคำถามที่เกี่ยวข้องสิ่งนี้อาจกระทบกับ reverse proxy

คำตอบ

1 K8sN0v1c3 Sep 23 2020 at 10:01

ฉันยังค่อนข้างใหม่กับเกม 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) เพื่อใช้ & แชร์ใน "แอป" หลายรายการ