Docker 컨테이너에서 개발 환경을 실행하면 이점이 있습니까? 사용하여 개발합니다. 문제는 잠시 후 Windows가 다운되어

주로 Windows에서 Visual Studio를 사용하여 개발합니다. 문제는 잠시 후 Windows가 다운되어 Windows를 다시 설치해야한다는 문제입니다. 마찬가지로 새 기계로 전환하는 것도 문제입니다.

개발 환경에 많은 종속성 (예 : 추가 MSBuild 구성 파일, VS 확장, npm, Java 등)이 있기 때문에 Windows를 다시 설치하기가 어렵습니다. 복잡한 시스템을 사용하는 데 혼자 있다고 생각하지 않으며 다시 설정하는 데 최소 하루가 걸릴 것입니다.

실제로 Docker를 사용하지는 않았지만 이론적으로 Windows 컨테이너에 내 개발 환경을 설정 한 다음 주변으로 배송 (예 : 랩톱에 복사하고 새 Windows 설치에 넣음)하면 고통스럽지 않습니다. .

내가 설명하는 것이 있습니까? 성능, 신뢰성과 같은 단점이 있습니까? 다른 문제가 있습니까?



답변

이것은 드문 문제는 아니지만 Docker가 실제로 해결하기에 적합한 도구는 아닙니다. 일반적으로 컨테이너 (Docker 포함)는 개발 환경과 같은 다중 프로세스 시나리오가 아닌 웹 서버와 같은 단일 프로세스에 대한 응용 프로그램 런타임을 제공하기위한 것 입니다. 에서가 수행하지만, 매우 우아한 해결책이 아니다 될 수있다.

더 나은 (보다 일반적인) 방법은 VirtualBox 또는 Hyper-V와 같은 기존 하이퍼 바이저 (Windows에 있기 때문에)를 통해 VM을 만드는 것입니다. 일반적인 작업 과정은 다음과 같습니다.

  • 원하는 OS 특징에 따라 기본 VM 이미지를 찾거나 생성하십시오. 설치 관리자 ISO를 사용하여 직접 수행하거나 직장의 누군가가 이미 가지고있을 수 있습니다.
  • 기본 이미지가 작성되면 필요한 모든 개발 도구 및 설정을 추가하십시오. 스냅 샷 또는 별도의 이미지로 저장하십시오.
  • 이제이 이미지, RDP 또는 원격으로이 이미지를 실행하고 “정체 된”지점에 도달 할 때까지 작업 한 다음 필요한 파일을 저장 (소스 제어 등에 커밋 등) 한 다음 이미지를 제거하고 생성 한 두 개의 스냅 샷 / 이미지 중 하나에서 다시 시작하십시오. 이 방법은 몇 초 만에 구식 방식으로 수행 할 수 있습니다.
  • 라인을 따라 언제든지 문제 등을 재현하기 위해 롤백하려는 상황이 발생하면 추가 스냅 샷을 만듭니다.

Vagrant 는 또한 더 많은 것을 구조화 된 방식으로 수행하는 환상적인 도구입니다.

이 모든 것의 장점은 이제 전체 팀과 공유 할 수있는 표준화 된 환경을 갖추어 모든 사람의 노력을 절약 할 수 있다는 것입니다. 이것은 특히 새로운 사람들을 빠르게 탑승 할 때 좋습니다.

독창적 인 질문으로 도커는 실제로 이것을위한 것이 아니지만 Linux 환경에서 PHP와 같은 작은 dev 환경이 있으면 컨테이너에서 수행 할 수 있으며 이점은 훨씬 작은 이미지입니다 (잠재적으로) 가상 디스크가있는 Windows VM의 경우 100MB 미만 및 많은 GB).


답변

하나의 도커 컨테이너가 아니라 n 도커 컨테이너에 있습니다.

이론적으로 전체 dev 환경을 하나의 컨테이너 안에 모을 수는 있지만 docker는이 작업을 수행하지 않았습니다.

대신 docker compose를 사용하여 각 서비스를 별도의 컨테이너에 배포하고 전체 인프라를 하나의 단일 파일로 관리해야합니다. 각 서비스에는 자체 로그 파일, 사용자 공간, 네트워킹 등이 있습니다.

예를 들어 보겠습니다. 이것은 초안입니다. 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 부두 컨테이너 및 마지막으로 매우 간단한 SMTP postfix 컨테이너가 있습니다.

모든 것은 일반적으로 :)-로 시작합니다. docker-compose up개발자 컴퓨터 나 프로덕션에서; 로그 파일은 읽기 쉬운 하나의 파일로 집계되며 랩톱에서 작동하는 경우 거의 모든 기능을 로컬로 복제 할 수 있습니다.


답변

나는 이런 종류의 것에 VirtualBox VM을 사용합니다.

컨테이너에 개발자 환경을 이식하는 것이 편리하지만 실제로는 업그레이드를 시도하기 전에 스냅 샷을 찍을 수 있으며 문제를 해결해도 문제가 발생하지 않습니다.

Qt와 같은 여러 버전의 작업을 자주 수행하기 때문에이 작업을 수행하는 것이 도움이되며 두 버전을 공존시키는 방법을 알아 내고 싶지 않습니다. 대신 다른 VM에 배치하고 내가 잘못 설치했기 때문에 상호 작용에 대해 걱정할 필요가 없습니다.


답변