Docker를 사용하여 OS X에서 개발 환경을 설정하는 올바른 방법은 무엇입니까?


94

소개

Docker와 Boot2Docker를 사용하여 OS X에서 개발 환경을 설정하는 좋은 방법을 찾을 수 없습니다. 내가 치는 문제는 다음과 같이 소스 코드를 관리하는 방법입니다.

  1. 이미 설치 한 도구 (텍스트 편집기, IDE, git 등)를 사용하여 OS X에서 코드를 수정할 수 있습니다.
  2. 이러한 수정 사항은 Docker 컨테이너에 반영되므로 테스트를 다시 실행하거나 웹 페이지를 새로 고치면 변경 사항을 즉시 볼 수 있습니다.

이론적으로는 소스 코드를 볼륨으로 마운트하면 쉽게 할 수 있습니다.

docker run -it -v /path/to/my/source/code:/src some-docker-image

불행히도 이것은 OS X에서 완전히 사용할 수 없게 만드는 두 가지 주요 문제가 있습니다.

문제 # 1 : VirtualBox (vboxsf 사용)에 마운트 된 볼륨이 매우 느립니다.

예를 들어 소스 코드가 Docker 이미지의 일부인 경우 Jekyll이 내 홈페이지 를 컴파일하는 데 걸리는 시간 은 다음과 같습니다.

> docker run -it brikis98/yevgeniy-brikman-homepage:v1 bash

root@7aaea30d98a1:/src# time bundle exec jekyll build

[...]

real    0m7.879s
user    0m7.360s
sys     0m0.600s

이번에는 OS X에서 소스 코드를 마운트한다는 점을 제외하면 정확히 동일한 Docker 이미지가 있습니다.

> docker run -it -v $(pwd):/src brikis98/yevgeniy-brikman-homepage:v1 bash

root@1521b0b4ce6a:/src# time bundle exec jekyll build

[...]

real    1m14.701s
user    0m9.450s
sys     0m3.410s

문제 # 2 : 파일 감시가 손상됨

SBT, Jekyll 및 grunt의 기본 감시 메커니즘은 Docker 컨테이너에서 실행 중이고 OS X에서 마운트 된 폴더로 변경된 경우 작동하지 않는 inotify와 같은 기술을 사용합니다.

내가 시도한 해결 방법

솔루션 (SO의 모든 솔루션 포함)을 검색하고 몇 가지를 시도했지만 성공적인 솔루션을 찾지 못했습니다.

  1. 나는 NFS를 사용하는 Boot2Docker 전환 하지만, 그것은 단지 느린로했다.
  2. 나는 Vagrant + NFS를 시도했고 그것도 마찬가지로 느 렸습니다.
  3. Samba 마운트를 시도했지만 Docker 컨테이너에서 폴더가 항상 비어있는 것으로 나타났습니다.
  4. 잠시 파일을 동기화하는 Unison 파일 시스템 을 사용하려고했지만 연결 오류가 계속 표시되었습니다 .
  5. Jekyll 에서 폴링을 활성화 했지만 변경 사항이 적용될 때까지 지연이 크게 늘어났습니다.
  6. "Vagrant를 사용하는 OS X에서 더 빠르고 친숙한 Docker"인 Dinghy를 사용해 보았고 약간의 개선이있었습니다. Jekyll 컴파일이 10-15 배 느린 대신 2-3 배 느 렸습니다. 더 좋지만 여전히 유용하지는 않습니다.

실제로 작동하고 Docker 및 OS X로 코드를 생산적으로 개발할 수있는 솔루션을 찾은 사람이 있습니까?

업데이트 : 마침내 해결책!

마침내 Boot2Docker + rsync를 사용하여 생산적으로 보이는 솔루션을 찾았습니다. 나는 이것을 설정하는 방법에 대한 세부 사항을 내 대답docker-osx-dev 라는 오픈 소스 프로젝트 에서 캡처했습니다 .


NFS와 함께 OS X 용 공식 Docker 설치 프로그램을 사용해 보셨습니까? AFAIK 이것은 OS X의 Docker에만 국한된 문제가 아니라 더 큰 코드베이스를 사용하는 OS X에서의 Vagrant 기반 개발에도 적용됩니다 ( 유사한 문제가 있지만 Vagrant 사용 ). NFS가 유일하게 실행 가능하고 수용 가능한 솔루션이라는 것을 알았습니다.
James Mills

@JamesMills : 공식 지침에 따라 Docker와 Boot2Docker를 설치했습니다. NFS 설정에 대한 공식 지침이 있습니까? GitHub 요점에서만 찾았고 사용 후 더 빠르지 않았습니다. NFS를 어떻게 설정 했습니까?
Yevgeniy Brikman


6
Docker를 사용하는 올바른 방법은 OS X 대신 기본적으로 Linux를 실행하거나 Linux VM 내에서 모든 개발 작업을 수행하는 것입니다. "boot2docker"통합은 혼란과 실망을 불러 일으키는 큰 추악한 해킹입니다.
larsks

7
@larsks : 도움이되지 않습니다.
Yevgeniy Brikman

답변:


46

지금까지 찾은 최고의 솔루션으로 내 답변을 추가하기로 결정했습니다. 더 나은 옵션을 찾으면 업데이트하겠습니다.

지금까지 최고의 솔루션

OS X에서 Docker를 사용하여 생산적인 개발 환경을 설정하기 위해 찾은 최상의 솔루션은 Boot2Docker + Rsync 입니다. rsync를 사용하면 Docker 컨테이너의 빌드 시간이 OSX에서 직접 빌드를 실행하는 것과 동등합니다! 또한 파일 감시자 코드는 폴링이 필요 하지 않으므로 ( inotifyrsync는 일반 폴더를 사용하므로 작동 함) 핫 리로드가 거의 빠릅니다.

설정 방법에는 자동 설치와 수동 설치의 두 가지가 있습니다.

자동 설치

Rsync로 Boot2Docker를 설정하는 모든 단계를 docker-osx-dev 라는 오픈 소스 프로젝트에 패키지화했습니다 . 코드는 약간 거칠지 만 3 개의 서로 다른 기술 스택이있는 3 개의 프로젝트간에 쉽게 전환하기 위해 몇 주 동안 성공적으로 사용했습니다. 사용해보고, 버그를보고하고, PR을 제출하십시오! 또한 자세한 내용은 내 블로그 게시물 인 OS X 에서 Docker를 사용한 생산적인 개발 환경 을 참조하십시오.

수동 설정

  1. Boot2Docker 설치 : brew install boot2docker.
  2. Boot2Docker를 실행하지만 VirtualBox 공유 폴더는 비활성화되어 boot2docker init && boot2docker start --vbox-share=disable있습니다..
  3. boot2docker shellinit인쇄 된 환경 변수를 실행 하고 파일에 복사 ~/.bash_profile합니다.
  4. Boot2Docker VM에 rsync를 설치합니다 boot2docker ssh "tce-load -wi rsync"..
  5. Boot2Docker VM에 필요한 기본 폴더를 만들고 해당 폴더에 대한 권한을 올바르게 설정합니다. 예를 들어 /foo/barOS X 에서 폴더를 동기화하는 /foo/bar경우 Boot2Docker VM 에서 생성해야합니다 .boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar" ..
  6. rsync를 실행하여 파일을 Boot2Docker VM : rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo. 사용하지 않으려는 다양한 설정에 대한 rsync 문서를 확인하십시오 --exclude .git..git동기화 할 때 폴더 .
  7. 파일 감시자를 사용하여 파일을 동기화 상태로 유지합니다. 예를 들어 fswatch (brew install fswatch rsync에 파이프 된 )를 .
  8. 이 시점에서를 사용 docker run하여 Docker 컨테이너를 시작하고 -v플래그를 사용하여 동기화중인 폴더를 마운트 할 수 있습니다.docker run -v /foo/bar:/src some-docker-image .
  9. 평소대로 OS X에서 코드를 업데이트하십시오. 변경 사항은 rsync를 사용하여 매우 빠르게 전파되어야하며 일반 파일 감시자 코드는 평소와 같이 변경 사항을 선택해야합니다 (예 :inotify ) 모든 파일이 컨테이너에 "로컬"되어 있기 때문에 빌드가 빠르게 실행되어야합니다.
  10. 실행중인 웹 사이트를 테스트해야하는 경우 boot2docker ip명령을 실행하여 어떤 IP에 있는지 확인하십시오.

공유해 주셔서 감사합니다! rsync가 "단방향 전용"이라고 말하면 OS X 파일 시스템을 사용하여 두 컨테이너간에 파일을 공유 할 수 없다는 의미입니까? 예 : 컨테이너 1은 소스 파일을 감시하고 바이너리를 컴파일하고 컨테이너 2는 컴파일 된 바이너리를 실행하는 데 사용됩니다 (이 예에서는 Haskell 사용).
Nicolas Hery

1
@NicolasHery : 내 이해는 rsync가 OS X의 변경 사항을 Docker 컨테이너로 복사하지만 그 반대는 아닙니다. 따라서 Docker 컨테이너에 의해 생성 된 파일 (예 : 컴파일 된 바이너리)은 OS X에서 볼 수 없습니다. 그러나 이러한 파일이으로 표시된 폴더에 생성 VOLUME되면 다음을 사용하여 해당 볼륨에 대한 다른 컨테이너 액세스 권한을 부여 할 수 있습니다. --volumes-from깃발. 아직 시도하지 않았지만 효과가있을 것 같습니다.
Yevgeniy Brikman

1
좋은 대답입니다. 대부분의 상용구를 수행하는 docker-machine ( github.com/docker/machine ) 용 드라이버를 만들 수 있습니다 .
dom

1
@dom : 그 아이디어가 마음에 들지만 도커 머신 용 드라이버를 만드는 방법을 알고 있습니까? 리포지토리로의 풀 리퀘스트가 유일한 방법입니까, 아니면 외부에서 드라이버를 생성 할 수 있습니까?
Yevgeniy Brikman

1
이 튜토리얼은 Windows의 새로운 1.9.1 버전에도 유효합니까? 그것을 사용할 수 있습니까 아니면 Docker가 이미이 "문제"에 대한 새로운 솔루션을 가지고 있었습니까?

18

업데이트 : 이제 mac 용 docker 가 해킹이 아닌 기능을 갖춘 베타 버전이므로 에세이의 해킹 및 해결 방법없이 로컬 개발에 훨씬 더 합리적 일 수 있습니다.

하지 마십시오 . 나는 그것이 아마도 당신이 바라는 대답이 아니라는 것을 알고 있지만, OSX에서 로컬 개발을 수행하는 것보다 로컬 소스 코드 +도 커화 된 실행을 얻으려는 시도의 비용 / 이점에 대해 정직한 평가를 받으십시오.

언젠가는 모든 문제, 설정 노력 및 운영상의 어려움이 충분히 해결 될 수 있지만 지금은 순손실이라고 생각합니다.

문제 # 1 : Virtual Box (vboxfs 사용)에 마운트 된 볼륨이 매우 느립니다.

잠시 기다리면 거의 확실히 개선 될 것입니다.

문제 # 2 : 파일 감시가 손상됨

가까운 장래에이 문제를 해결할 수 있을지 모르겠습니다. 이러한 유형의 기능이 개발 워크 플로의 핵심이라면이 기능을 딜 브레이커라고 생각합니다. rbenv / bundler를 사용하여 jekyll / ruby ​​설치를 관리하고 사람들이 지난 10 년 동안 성공적으로 수행 한 것처럼 OSX에서 로컬로 실행하는 것과 비교할 때 큰 R & D 노력은 가치가 없습니다.

"클라우드"가 내 로컬 개발 설정에 전혀 관여하지 않는 것처럼 현재 docker는 테스트 / 스테이징 / 배포와 데이터베이스 및 기타 타사 구성 요소 실행에있어 승리하지만 실제로 코딩하는 애플리케이션은 바로 실행됩니다. OSX에서.


1
두 번째입니다. 우리는 OSX에서 개발하고 시스템 내에서 직접 앱을 실행합니다 (라이브 리로드 등). 그런 다음 앱이 완료되면 테스트, 스테이징 및 프로덕션을 위해 Dockerize합니다.
ItalyPaleAle

4
음, 약간 실망했습니다. 나는 항상 스테이징 / 프로덕션 환경에서 패리티를 가지고 있습니다. 내가 OS X에서 코딩 할 때 항상 이상치였던 것은 dev입니다. Docker 문서는 확실히 이것이 해결 된 문제인 것처럼 들리도록 만들었습니다. 나는 그것을 하루 더 노력하고 내가 일할 수있는 것을 얻을 수 있는지 볼 것입니다.
Yevgeniy Brikman

오늘도이 대답이 타당하다고 생각하십니까, 피터? 몇 달이 지나지 않았지만 @Yevgeniy의 프로젝트와 현재 수정 된 단 2 개의 문제를 감안할 때 비용 / 편익이 이미 가치가있을 수 있습니다! 그렇지 않습니까?
cregox

1
그것은 개인적인 선호 사항입니다. 나는 컨설턴트로서의 프로젝트의 양이 너무 많기 때문에 여전히 이것을 망치지 않을 것입니다. 내가 몇 주 / 개월 동안 대부분 같은 프로젝트에서 일하는 정규직 이었다면 rsync / fswatch 항목을 설정할 가치가있을 것입니다.
Peter Lyons

Docker Toolbox는 homebrew 또는 다른 패키지 관리자를 사용하는 경우 Docker 도구 상자로 버전 관리를 따르지 않는 한 Docker 도구 버전이 동기화되지 않기 때문에 요즘에는 올바른 방법입니다.
taco

12

Mac 및 Windows 용 Docker는 OS X (및 Windows)에서 Docker를 사용하여 개발하는 확실한 방법입니다. Docker 제품인이 소프트웨어는 "Mac 또는 Windows에서 애플리케이션을 구축, 조립 및 배송하기위한 통합되고 배포하기 쉬운 환경"입니다. OP가 제시 한 문제를 해결할 수 있다고 주장합니다. 2016 년 3 월 24 일 발표 부터:

  • 더 빠르고 안정적 ​​: 더 이상 VirtualBox가 없습니다! Docker 엔진은 Mac OS X의 xhyve 가상 머신 또는 Windows의 Hyper-V VM 위에 Alpine Linux 배포판에서 실행되며 해당 VM은 Docker 애플리케이션에 의해 관리됩니다. Mac 및 Windows 용 Docker를 실행하기 위해 docker-machine이 필요하지 않습니다.
  • 도구 통합 : Mac 용 Docker는 Mac 애플리케이션이고 Windows 용 Docker는 기본 사용자 인터페이스 및 자동 업데이트 기능을 포함하는 Windows 애플리케이션입니다. Docker 도구 세트는 Docker 명령 줄, Docker Compose 및 Docker Notary 명령 줄과 함께 번들로 제공됩니다.
  • 코드 및 데이터에 대한 볼륨 탑재 : 파일 변경 알림을 포함하여 볼륨 데이터 액세스가 올바르게 작동합니다 (Mac에서는 inotify가 이제 볼륨 탑재 디렉터리의 컨테이너 내에서 원활하게 작동 함). 이를 통해 "컨테이너 내"개발을위한 편집 / 테스트주기가 가능합니다.
  • 로컬 호스트 네트워크에서 실행중인 컨테이너에 쉽게 액세스 : Mac 및 Windows 용 Docker에는 컨테이너 용 DNS 서버가 포함되어 있으며 Mac OS X 및 Windows 네트워킹 시스템과 통합됩니다. Mac에서 Docker는 매우 제한적인 회사 VPN에 연결된 경우에도 사용할 수 있습니다.
  • Mac 용 Docker는 OS X 샌드 박스 보안 모델에 맞출 수 있도록 처음부터 설계되었으며이를 위해 Apple과 긴밀히 협력하고 있습니다.

지난번에 이것을 보았고 지금까지 가장 유망한 솔루션처럼 보입니다. 베타 버전이 나오면 한 번 시도해 볼 수있어서 매우 기쁩니다. 잘 작동한다면 공식적으로 받아 들여지는 답변으로 변경하겠습니다.
Yevgeniy Brikman

4
불행히도 현재 베타 버전 (1.11.0-beta7)은 다른 방법만큼 느리기 때문에 forums.docker.com/t/…
walterra

3

면책 조항 : 나는 docker-sync의 저자이기 때문에 편견을 가질 수 있습니다.

나는 아마도 더 많은 것을 포함하여 여기에 명명 된 모든 솔루션을 시도했을 것입니다 ( https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync 참조 ) 기본적으로 측면에서 실패했습니다. 성능 (대부분) 또는 사용 / 강제 된 도커 머신 (또는 없음).

http://docker-sync.io 는 모든 솔루션을 병합하고 최상의 전략을 제공하도록 구축되었습니다 (여러 가지 구현, 선택할 수 있음).

사용자에 대한 권한 수정을 포함한 rsync (단방향 동기화) 및 unison (양방향 동기화)과 함께 사용할 수 있습니다. Docker-machine 또는 특정 하이퍼 바이저에 강제로 연결되지도 않으며 Mac 용 Docker도 필요하지 않습니다. 그것은 그들 모두와 함께 작동합니다.

성능 EugenMayer / docker-sync / wiki / 4.-Performance는 영향을받지 않으며, 공유가 전혀없는 것과 같습니다.

docker-sync 및 변경 감시자는 최적화되어 있으며 문제없이 12k 파일로 프로젝트 작업을 수행합니다.

한 번 시도해보세요. 원하는 경우 의견을 듣고 싶습니다!


2

나는 당신을 느낍니다! 나는 당신이 시도한 모든 것을 거의 시도했다고 생각하지만 불행히도 여전히 느립니다. 그런 다음 Virtualbox 대신 Vagrant 및 Parallels를 사용하도록 제안하는 https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254 댓글 을 보았습니다. 이를 통해 nfs를 사용할 수 있었고 실제로 내 프로젝트 (Drupal)의 성능이 크게 향상되었습니다.

여기 Vagrant 파일이 있습니다. 당신이해야 할 일은 vagrant를 설치하고 이것을 Vagrantfile이라는 파일에 복사하여 폴더에 넣는 것입니다. 해당 폴더로 이동 vagrant up하여 정상적인 boot2docker 대신 a 를 수행 하십시오.

Vagrant.configure(2) do |config|
  config.vm.box = "parallels/boot2docker"

  config.vm.network "forwarded_port", guest: 80, host: 80

  config.vm.synced_folder(
    "/Users/dicix/work/www", "/vagrant",
    type: 'nfs',
    nfs_udp: true,
    mount_options: %w[actimeo=2],
    bsd__nfs_options: %w[alldirs maproot=root:wheel]
  )
end

병렬 설치가 필요하다고 가정하고 있습니까?
Yevgeniy Brikman

2

또한 병렬 및 boot2docker ( https://github.com/Parallels/boot2docker-vagrant-box ) 와 함께 Vagrant를 사용하고 있습니다. 나에게는 개발이 결코 쉽지 않았습니다. docker-compose큰 설정에서 정말 잘 작동합니다 . 나는 실제로 지연이나 막대한 자원 소비를 느끼지 않습니다.

이것은 내 Vagrantfile모습입니다.

Vagrant.configure(2) do |config|

  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.box = "parallels/boot2docker"

  config.vm.synced_folder "/Users", "/Users", type: "nfs", mount_options: ["nolock", "vers=3", "udp"], id: "nfs-sync"

end

1

저는 OS X (2011 년 중반 Macbook Air) + Boot2Docker + Docker-compose 환경에서 몇 주 동안 개발했습니다. 주요 성능 문제가 발생하지는 않았지만 개발할 때 어떤 종류의 빌드도 실행하지 않습니다 (왜 jekyll serve --skip-initial-build? 와 같은 것을 사용하지 않습니까?). 여기에 예가 있습니다.docker-compose.yml 내가 사용 파일입니다.

docker-compose.yml :

test:
  build: .
  volumes:
    - ./client:/src/client
    - ./server:/src/server
    - ./test:/src/test
  command: nodemon --exec jasmine-node -- test/ --verbose --autotest --captureExceptions --color
  environment:
    - DEBUG=*

Dockerfile :

FROM node:0.12

RUN mkdir -p /src
WORKDIR /src

ENV PATH=/src/node_modules/.bin:$PATH

# We add package.json first so that we the
# image build can use the cache as long as the
# contents of package.json hasn't changed.

COPY package.json /src/
RUN npm install --unsafe-perm

COPY . /src

CMD [ "npm", "start" ]
EXPOSE 3000

나는 때때로 NFS ( http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf/ )를 사용하지만 그렇게 할 때 큰 성능 차이를 느끼지 못했습니다.

저에게는 docker-compose up test환경을 실행 하는 간단한 방법의 편리함이 성능 비용만큼 가치가있었습니다 (저는 일상적으로 서로 다른 스택으로 여러 프로젝트에서 작업합니다).

추신 : nodemonvboxsf와 함께 작동하는 몇 안되는 파일 감시자 중 하나입니다 ( https://github.com/remy/nodemon/issues/419 참조 ).


Jekyll로 초기 빌드를 건너 뛰더라도 파일을 변경할 때마다 다시 빌드해야합니다. 소스 코드가 마운트되면 1-3 분 정도 걸립니다. 이로 인해 어떤 종류의 변경 및 재로드 스타일 개발도 불가능합니다.
Yevgeniy Brikman

@YevgeniyBrikman 오, 그 사실을 몰랐습니다 :( 마지막 옵션은 코드를 boot2docker VM 내부에 저장하고 sshfs를 사용하여 호스트 컴퓨터에 마운트하는 것입니다. 그렇지 않으면 기다려야 할 것 같습니다. Docker를 개발 환경으로 사용하도록 마운트 된 폴더 성능 향상
Olivier Lalonde


-1

Docker를 개발 도구로 사용할 수 있습니다. 그러나 그것은 아플 것입니다. 여기에 프로세스를 문서화했습니다.

http://harmingcola.blogspot.com/2015/05/how-to-setup-docker-as-development-tool.html


게시 해 주셔서 감사합니다. 이렇게하면 마운트 된 볼륨의 성능 문제가 어떻게 해결됩니까?
Yevgeniy Brikman

아, 죄송합니다. 더 이상 vBox를 사용하여 아무것도 마운트 할 필요가 없습니다. 일반 도커 인터페이스를 통해 폴더를 마운트 할 수 있습니다
harmingcola

-4

이 방법은 최신 (2015 년 9 월)이며 Mac에서 Docker를 설정하는 가장 쉬운 방법입니다. 여기 링크 :

여기 지침에 대한 Docker Toolbox 링크를 사용하여 Docker를 설치 합니다.

다음 Docker 도구를 포함 하는 완전한 Docker 설정 패키지 입니다.

docker-machine 바이너리를 실행하기위한 Docker Machine

Docker 바이너리 실행을위한 Docker Engine

docker-compose 바이너리 실행을위한 Docker Compose

Kitematic, Docker 명령 줄 환경을 위해 사전 구성된 셸인 Docker GUI

Oracle VM VirtualBox

여기에 이미지 설명 입력

도구 상자의 내용 :

  • Docker 클라이언트
  • 도커 머신
  • Docker Compose (Mac 전용)
  • Docker Kitematic
  • VirtualBox

3
예,하지만 안타깝게도 원래 제시된 문제를 해결하지 못했습니다.
Nick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.