การใช้สภาพแวดล้อมการพัฒนาของฉันในคอนเทนเนอร์ Docker มีประโยชน์อย่างไร


12

ฉันพัฒนาโดยใช้ Visual Studio เป็นหลักบน Windows ปัญหาคือหลังจากที่ในขณะ Windows ได้รับจมและฉันต้องเผชิญกับการติดตั้ง Windows การสลับไปใช้เครื่องใหม่ในทำนองเดียวกันก็เป็นปัญหา

การติดตั้ง Windows ใหม่อีกครั้งนั้นเจ็บปวดเพราะสภาพแวดล้อมการพัฒนาของฉันมีการพึ่งพาจำนวนมาก (เช่นไฟล์การกำหนดค่า MSBuild พิเศษ, นามสกุล VS, npm, Java เป็นต้น) ฉันไม่คิดว่าฉันคนเดียวที่มีระบบที่ซับซ้อนและการสำรองข้อมูลอาจใช้เวลาอย่างน้อยหนึ่งวัน

ฉันไม่ได้ใช้ Docker จริงๆ แต่ในทางทฤษฎีแล้วดูเหมือนว่าฉันสามารถตั้งค่าสภาพแวดล้อมการพัฒนาของฉันใน Windows Container แล้วเพียงแค่จัดส่งไปรอบ ๆ (เช่นคัดลอกไปยังแล็ปท็อปของฉันติดตั้ง Windows ใหม่) และควรเจ็บปวด .

เป็นสิ่งที่ฉันอธิบายได้หรือไม่ มีข้อเสียเช่นประสิทธิภาพความน่าเชื่อถือหรือไม่ gotchas อื่น ๆ


ฉันอยากรู้ว่าคุณสามารถทำอะไรกับสภาพแวดล้อมการพัฒนาที่ทำให้ Windows "จมลง" การติดตั้ง Node, VS และปลั๊กอินบางตัวไม่ควรทำให้เกิดปัญหาใด ๆ
neilsimp1 1

@ neilsimp1 คุณพูดถูก แต่ความจริงคือบางอย่างเช่น VS, บรรณาธิการ, เครื่องมือทาสี, Android Studio, Netbeans, Office, CrashPlan, Git, TortoiseSVN, Fiddler, เดสก์ท็อประยะไกล, การประชุม, Skype, wireshark, vmware และรุ่น 4 ซ้ำแล้วซ้ำอีก.
Jim W กล่าวว่าคืนสถานะโมนิก้า

ในฐานะที่เป็นหมายเหตุด้านข้างคุณควรตรวจสอบยูทิลิตีการโคลนดิสก์ คุณสามารถติดตั้ง OS + ซอฟต์แวร์ที่จำเป็นทั้งหมดและกำหนดค่าทุกอย่างได้อย่างถูกต้อง จากนั้นทำการโคลนดิสก์ของคุณและสำรองที่อื่น เมื่อคุณต้องการ "รีเซ็ต" ทุกอย่างเพียงกู้คืนจากโคลนนั้นและเสร็จสิ้น มีเครื่องมือมากมายที่สามารถทำได้และในสถานการณ์ของคุณมันสามารถช่วยให้คุณประหยัดได้หลายสิบชั่วโมง :)
Radu Murzea

คำตอบ:


13

นี่ไม่ใช่ปัญหาที่ผิดปกติ แต่นักเทียบท่าไม่ใช่เครื่องมือที่เหมาะสมในการแก้ไข ตู้คอนเทนเนอร์โดยทั่วไป (รวมถึง Docker) มีวัตถุประสงค์เพื่อจัดทำแอปพลิเคชันรันไทม์สำหรับกระบวนการเดียวเช่นเว็บเซิร์ฟเวอร์ไม่ใช่สำหรับสถานการณ์ที่มีหลายกระบวนการเช่นสภาพแวดล้อมการพัฒนา ในสามารถทำได้ แต่ไม่ได้แก้ปัญหาอย่างสวยงาม

วิธีที่ดีกว่า (และบ่อยกว่า) คือการสร้าง VMs ผ่านไฮเปอร์ไวเซอร์ดั้งเดิมเช่น VirtualBox หรือ Hyper-V (ตั้งแต่คุณใช้ Windows) เวิร์กโฟลว์ทั่วไปคือ:

  • ค้นหาหรือสร้างอิมเมจ VM พื้นฐานตามรสชาติ OS ที่คุณต้องการ สิ่งนี้สามารถทำได้โดยตรงกับ ISO ตัวติดตั้งหรือบางคนในที่ทำงานของคุณอาจมีอยู่แล้ว
  • เมื่อสร้างอิมเมจพื้นฐานแล้วให้เพิ่มเครื่องมือและการตั้งค่าทั้งหมดที่คุณต้องการ สแนปชอตหรือบันทึกเป็นรูปภาพแยกต่างหาก
  • ทีนี้คุณสามารถเรียกใช้อิมเมจนี้ RDP หรือรีโมตแล้วทำงานจนกว่าคุณจะไปถึงจุดที่คุณ "จมลง" จากนั้นก็บันทึกไฟล์ที่คุณต้องการ (กระทำการควบคุมแหล่งที่มา ฯลฯ ) จากนั้นจึงระเบิด เก็บรูปภาพไว้และเริ่มต้นอีกครั้งจากภาพรวม / ภาพสองภาพที่คุณสร้างขึ้น สามารถทำได้ภายในไม่กี่วินาทีเทียบกับวิธีแบบเก่า
  • เมื่อใดก็ตามที่อยู่ในบรรทัดให้สร้างสแนปชอตเพิ่มเติมเมื่อคุณพบสถานการณ์ที่คุณอาจต้องการย้อนกลับเพื่อสร้างปัญหา ฯลฯ

Vagrantยังเป็นเครื่องมือที่ยอดเยี่ยมสำหรับการทำสิ่งต่าง ๆ ข้างต้นในลักษณะที่มีแบบแผนมากขึ้น

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

กลับไปที่คำถามดั้งเดิมของคุณ Docker ไม่ได้มีไว้สำหรับสิ่งนี้ แต่ถ้าคุณมีสภาพแวดล้อม dev ที่เล็กพอ (พูด PHP บน Linux) คุณสามารถทำได้ในที่เก็บและประโยชน์จะเป็นภาพที่เล็กกว่ามาก ต่ำกว่า 100MB เทียบกับหลาย GB สำหรับ Windows VM พร้อมดิสก์เสมือน)


2

ไม่ได้อยู่ในที่เก็บนักเทียบท่า แต่ใช่ในที่เก็บนักเทียบท่า

ในขณะที่คุณทำได้ - ตามทฤษฎี - รวบรวมสภาพแวดล้อม dev ทั้งหมดของคุณไว้ในที่เดียว

แต่คุณควรปรับใช้แต่ละบริการลงในภาชนะที่แยกต่างหากโดยใช้นักเขียนประกอบจัดการโครงสร้างพื้นฐานทั้งหมดของคุณในไฟล์เดียวโดยที่แต่ละบริการจะมี logfile, userpace, ระบบเครือข่าย ฯลฯ

ขอยกตัวอย่างนี่เป็นร่างของฉัน docker-compose.yml

version: '2'
services:

  myproxy:
    build: myproxy
    container_name: ppproxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    networks:
      default:
        aliases:
          - www.domain1.it
          - www.domain2.it
          - www.domain4.it

  mydb1:
    build: mydb
    environment:
      DB_USER: sdffdssdf
      DB_PASSWORD:  fdsfsdsdf
      DB_NAME: dbanme1
      DB_ENCODING: UTF-8    
      VIRTUAL_HOST: myhost1.net.lan
      VIRTUAL_PORT: 5432

  mydb2:
    build: mydb
    environment:
      DB_USER: ssdfsdfs
      DB_PASSWORD:  sffdssd
      DB_NAME: dbanme2
      DB_ENCODING: UTF-8    
      VIRTUAL_HOST: myhost2.net.lan
      VIRTUAL_PORT: 5432

  www:
    image: myimages/oldservice:v1.1
    container_name: www
    command: /bin/bash /root/launch
    environment:
        VIRTUAL_HOST: www.domain1.it
        VIRTUAL_PORT: 80
    ports:
      - 80
    depends_on:
      - mydb1
      - mydb1
      - myws

  myws:
    build: myjettycontainer
    environment:
        HTTPS_METHOD: noredirect
        VIRTUAL_HOST: www.domain2.it
        VIRTUAL_PORT: 8080
    ports:
      - 8080
    depends_on:
      - mydb1
      - mydb2
      - myproxy
      - mypostfix

  mypostfix:
    image: catatnight/postfix
    container_name: mailer
    environment:
      maildomain: domain1.it
      smtp_user: mymail:sfsfdfds
    ports:
      - 25

มีพร็อกซี nginx (myproxy), สองฐานข้อมูล postgres ที่คล้ายกัน (mydb1 และ 2), เซิร์ฟเวอร์แอปพลิเคชันเว็บ Java เก่า (www), คอนเทนเนอร์ java jetty ที่ให้บริการเว็บพักผ่อนและสุดท้ายเป็นคอนเทนเนอร์ Postfix SMTP ที่ง่ายมาก

ทุกอย่างเริ่มต้นขึ้น - โดยปกติ :) - ด้วยdocker-compose upไม่ว่าจะเป็นบนเครื่อง dev หรือในการผลิต ล็อกไฟล์จะถูกรวมเป็นไฟล์เดียวที่อ่านง่ายและเป็นไปได้ที่จะทำซ้ำภายในเครื่องเกือบทุกฟังก์ชั่นด้วยการรับประกันว่าถ้ามันทำงานบนแล็ปท็อปของฉันมันจะทำงาน


2

ฉันใช้ VirtualBox VM สำหรับสิ่งนี้

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

ฉันยังพบว่ามีประโยชน์ในการทำเช่นนี้เพราะฉันทำงานกับหลายสิ่งหลายอย่างเช่น Qt บ่อยครั้งและฉันไม่รู้สึกอยากรู้วิธีที่จะทำให้ทั้งสองรุ่นมีอยู่ร่วมกัน - แทนฉันใส่ VM ต่าง ๆ และ ฉันไม่ต้องกังวลเกี่ยวกับการโต้ตอบเพราะฉันติดตั้งบางอย่างไม่ถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.