Docker ile OS X üzerinde bir geliştirme ortamı kurmanın doğru yolu nedir?


94

Giriş

Docker ve Boot2Docker kullanarak OS X üzerinde bir geliştirme ortamı kurmanın iyi bir yolunu bulamıyorum. Karşılaştığım sorun, kaynak kodunun nasıl yönetileceği, böylece:

  1. Zaten yüklediğim araçları (metin düzenleyici, IDE, git, vb.) Kullanarak OS X'teki kodu değiştirebilirim.
  2. Bu değişiklikler Docker konteynerine yansıtılır, böylece testleri yeniden çalıştırırsam veya bir web sayfasını yenilersem değişikliklerimi hemen görebilirim.

Teorik olarak, kaynak kodumu bir cilt olarak monte ederek bunu yapmak kolay olmalı:

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

Ne yazık ki, bunun OS X'te tamamen kullanılamaz hale getiren iki ana sorunu var:

Sorun 1: VirtualBox'ta (vboxsf kullanan) takılan birimler çok yavaş

Örneğin , kaynak kodu Docker görüntüsünün bir parçasıysa Jekyll'in ana sayfamı derlemesi ne kadar sürer :

> 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

İşte tam olarak aynı Docker görüntüsü, bu sefer hariç, kaynak kodunu OS X'ten monte ediyorum:

> 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

Sorun 2: Dosya izleme hatalı

SBT, Jekyll ve grunt'taki varsayılan izleme mekanizmaları, bir Docker konteynerinde çalışıyorlarsa çalışmayan inotify gibi teknolojileri kullanır ve OS X'de takılı bir klasöre değişiklikler yapılır.

Denediğim geçici çözümler

Çözümler aradım (SO'dakilerin tümü dahil) ve birkaçını denedim, ancak başarılı bir çözüm bulamadım:

  1. Ben NFS kullanmak Boot2Docker açık , ama sadece yavaş olarak oldu.
  2. Vagrant + NFS'yi denedim ve bu da aynı derecede yavaştı.
  3. Bir Samba bağlantısı denedim , ancak klasör Docker konteynerinde her zaman boş görünüyordu.
  4. Dosyaları senkronize etmek için kısa bir süre çalışan ancak daha sonra bağlantı hatalarını göstermeye devam eden Unison dosya sistemini kullanmaya çalıştım .
  5. Jekyll'de oylamayı etkinleştirdim , ancak bu, değişikliklerim alınana kadar gecikmeyi önemli ölçüde artırdı.
  6. Denedim Dingi , bir "Vagrant ile OS X hızlandırır; Docker" ve got bazı iyileştirme. Jekyll derlemesinin 10-15x daha yavaş olması yerine 2-3x daha yavaştı. Bu daha iyi, ancak yine de pek kullanışlı değil.

Docker ve OS X ile gerçekten çalışan ve verimli bir şekilde kod geliştirmenize izin veren bir çözüm bulan oldu mu?

Güncelleme: sonunda bir çözüm!

Sonunda Boot2Docker + rsync kullanarak verimli görünen bir çözüm buldum. Bunu nasıl kuracağımla ilgili ayrıntıları kendi cevabımda ve docker-osx-dev adında açık kaynaklı bir projede yakaladım .


OS X için resmi Docker yükleyicisini NFS ile birlikte denediniz mi? AFAIK bu, OS X üzerindeki Docker ile sınırlı bir sorun değil, aynı zamanda daha büyük kod tabanları ile OS X üzerinde Vagrant tabanlı geliştirme ( Vagrant ile de benzer bir sorunumuz var ) ile sınırlı bir sorun . NFS'yi geçerli ve kabul edilebilir tek çözüm olarak buldum.
James Mills

@JamesMills: Docker ve Boot2Docker'ı kurmak için resmi talimatları takip ettim. NFS'yi kurmak için resmi talimatlar var mı? Onları yalnızca bir GitHub özetinde buldum ve kullandıktan sonra daha hızlı görünmedi. NFS'yi nasıl kurdunuz?
Yevgeniy Brikman


6
Docker ile çalışmanın doğru yolu, Linux'u OS X yerine yerel olarak çalıştırmak veya tüm geliştirme çalışmalarınızı bir Linux VM içinde yapmaktır. "Boot2docker" entegrasyonu, kafa karışıklığı ve hayal kırıklığı ekmekten başka hiçbir şey yapmayan büyük, çirkin bir hack'tir.
larsks

7
@larsks: Bu yardımcı olmuyor.
Yevgeniy Brikman

Yanıtlar:


46

Şimdiye kadar bulduğum en iyi çözümle kendi cevabımı eklemeye karar verdim. Daha iyi seçenekler bulursam bunu güncelleyeceğim.

Şimdiye kadarki en iyi çözüm

OS X üzerinde Docker ile verimli bir geliştirme ortamı kurmak için bulduğum en iyi çözüm: Boot2Docker + Rsync . Rsync ile, bir Docker konteynerindeki derleme süreleri, derlemenin doğrudan OSX üzerinde çalıştırılmasıyla aynıdır! Üstelik, dosya watcher kodu mu değil yoklama (gerek inotifyçok sıcak yeniden olduğunu rsync kullanımları, normal klasörler beri çalışıyor) neredeyse kadar hızlı.

Kurmanın iki yolu vardır: otomatik kurulum ve manuel kurulum.

Otomatik yükleme

Rsync ile Boot2Docker'ı kurmak için tüm adımları docker-osx-dev adlı açık kaynaklı bir projede paketledim . Kod biraz kaba, ancak 3 farklı teknoloji yığınına sahip 3 proje arasında kolayca geçiş yapmak için birkaç haftadır başarıyla kullanıyorum. Deneyin, hataları bildirin ve birkaç PR gönderin! Ayrıca, daha fazla bilgi için OS X üzerinde Docker ile verimli bir geliştirme ortamı olan blog gönderime bakın .

Elle kurulum

  1. Yükleme Boot2Docker : brew install boot2docker.
  2. Ama VirtualBox ile çalıştırın Boot2Docker engelli klasörleri paylaştı: boot2docker init && boot2docker start --vbox-share=disable.
  3. Dosyanıza boot2docker shellinityazdırdığı ortam değişkenlerini çalıştırın ve kopyalayın ~/.bash_profile.
  4. Boot2Docker VY'de rsync yükleyin: boot2docker ssh "tce-load -wi rsync".
  5. Boot2Docker VM'de ihtiyacınız olan temel klasörleri oluşturun ve bunlar için izinleri doğru şekilde ayarlayın. Eğer senkronize olacak Örneğin, /foo/barOS X klasörü, oluşturmanız gereken /foo/barBoot2Docker VM: boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar".
  6. Dosyaları Boot2Docker VM: ile senkronize etmek için rsync çalıştırın rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo. Eşitleme --exclude .gitsırasında .gitklasörü dışlamak gibi etkinleştirmek isteyebileceğiniz çeşitli ayarlar için rsync belgelerine bakın .
  7. Dosyaları senkronize tutmak için bir dosya izleyici kullanın. Örneğin, rsync'e borulu fswatch ( brew install fswatch) kullanabilirsiniz .
  8. Bu noktada, kullanmak gerekir docker runsizin Docker konteyner ateşlemek ve kullanımı -vklasörü sen senkronizasyonu monte etmek bayrak: docker run -v /foo/bar:/src some-docker-image.
  9. OS X'teki kodu her zamanki gibi güncelleyin. Değişiklikler rsync kullanılarak çok hızlı yayılmalı, normal dosya izleme kodu değişiklikleri her zamanki gibi almalı (yani kullanarak inotify) ve derleme hızlı çalışmalıdır çünkü tüm dosyalar kap için "yerel" dir.
  10. Çalışan bir web sitesini test etmeniz gerekiyorsa, boot2docker iphangi IP'de olduğunu bulmak için komutu çalıştırın .

Paylaşım için teşekkürler! Rsync'in "yalnızca tek yönlü" olduğunu söylediklerinde, OS X dosya sistemini iki kapsayıcı arasında dosya paylaşmak için kullanamayacağım anlamına mı geliyor? Örnek: konteyner 1 kaynak dosyaları izler ve bir ikili dosya derler, konteyner 2 derlenmiş ikili dosyayı çalıştırmak için kullanılır (bu örnekte Haskell kullanılarak).
Nicolas Hery

1
@NicolasHery: Anladığım kadarıyla rsync, değişiklikleri OS X'ten Docker konteynerine kopyalayacak, ancak bunun tersi olmayacak. Bu nedenle, Docker kapsayıcısı tarafından oluşturulan herhangi bir dosya (örneğin, derlenmiş bir ikili dosya) OS X'te görünmez. Ancak, bu dosyalar bir olarak işaretlenmiş bir klasörde oluşturulursa VOLUME, o zaman, --volumes-frombayrak. Henüz denemedim ama işe yarayacağından şüpheleniyorum.
Yevgeniy Brikman

1
Mükemmel cevap. Standart şablonun çoğunu sizin için yapan docker-machine ( github.com/docker/machine ) için bir sürücü oluşturabilirsiniz .
dom

1
@dom: Bu fikri beğendim ama docker-machine için nasıl bir sürücü yaratılacağını biliyor musunuz? Depoya bir çekme talebi tek yol mu yoksa harici olarak bir sürücü oluşturmak mümkün mü?
Yevgeniy Brikman

1
Bu eğitim, Windows'taki yeni 1.9.1 sürümü için hala geçerli mi? Kullanabilir miyim yoksa Docker'ın bu "sorun" için zaten yeni bir çözümü olabilir mi?

18

Güncelleme : Mac için docker, hack olmayan işlevselliğe sahip beta sürümünde olduğuna göre, bu rotaya gitmek, bir denemeye değecek hackler ve geçici çözümler olmadan yerel geliştirme için çok daha makul olabilir.

Yapma . Muhtemelen umduğunuz yanıtın bu olmadığını biliyorum, ancak yerel kaynak kodu + dockerize yürütme elde etmeye çalışmanın maliyet / faydasını dürüst bir şekilde değerlendirerek OSX'te yerel geliştirme yapmanın önüne geçin.

Bir noktada tüm sorunlar, kurulum çabası ve operasyonel sıkıntı noktaları yeterince iyi çözülebilir, ancak şu an itibariyle bu konudaki düşüncem net bir kayıp.

Sorun 1: Sanal Kutudaki (vboxfs kullanan) takılı birimler son derece yavaş

Bir süre bekleyin ve bu neredeyse kesin olarak iyileşecektir.

Sorun 2: Dosya izleme hatalı

Yakın gelecekte bunun için bir düzeltme olacağından emin değilim. Bu tür bir işlevsellik geliştirme iş akışınızın anahtarı ise, bunu bir anlaşma kırıcı olarak değerlendiririm. Jekyll / ruby ​​kurulumlarınızı yönetmek için sadece rbenv / bundler'ı kullanmak ve bunları son on yıldır başarılı bir şekilde yapan insanlar gibi OSX'te yerel olarak çalıştırmakla karşılaştırıldığında büyük bir Ar-Ge çabasına değmez.

Tıpkı "bulut" un yerel geliştirme kurulumuma hiç müdahalesi olmadığı gibi, şu anda docker, test etme / hazırlama / dağıtım ve veritabanları ile diğer üçüncü taraf bileşenlerini çalıştırmak için bir kazançtır, ancak aslında kodladığım uygulamalar düzgün çalışır OSX'te.


1
Ben ikinci oldum. OSX üzerinde geliştiriyoruz ve uygulamaları doğrudan sistemin içinde çalıştırıyoruz (canlı yeniden yükleme vb. İle). Ardından, uygulama tamamlandığında test, hazırlık ve üretim için onu dockerize ediyoruz.
ItalyPaleAle

4
Hm, bu biraz hayal kırıklığına uğradı. Aşama / üretim ortamlarımda her zaman eşitlik vardı. OS X'te kod yazdığım için her zaman aykırı olan dev oldu. Docker belgeleri kesinlikle bunun çözülmüş bir sorun gibi görünmesini sağladı. Bir gün daha çaba göstereceğim ve bir şeyler işe yarayıp yaramayacağına bakacağım.
Yevgeniy Brikman

Hala bu cevabın bugün geçerli olduğunu düşünüyor musun, Peter? Sadece birkaç aydır, ancak @ Yevgeniy'nin projesi ve şu anda düzeltilmiş olan sadece 2 sorun göz önüne alındığında, belki de maliyet / fayda şimdiden değerlidir! Değil mi?
cregox

1
Kişisel bir tercih meselesi. Bir danışman olarak aralarına girdiğim çok sayıda proje yüzünden bunu yine de karıştırmazdım. Çoğunlukla aynı proje üzerinde haftalarca / aylarca çalışan tam zamanlı bir çalışsaydım, rsync / fswatch öğelerini ayarlamaya değer olabilirdi.
Peter Lyons

Docker Toolbox günümüzde bunu yapmanın doğru yoludur çünkü homebrew veya başka bir paket yöneticisi kullanırsanız docker tool sürümleri docker toolbox olarak sürüm oluşturmayı takip etmedikçe senkronize olmayacaktır.
taco

12

Mac ve Windows için Docker, OS X (ve Windows) üzerinde Docker ile geliştirmenin kesin yolu olacaktır. Bir Docker ürünü olan yazılım, "Mac veya Windows'tan uygulamalar oluşturmak, birleştirmek ve göndermek için entegre, dağıtımı kolay bir ortamdır." OP tarafından sunulan sorunları çözme iddiasındadır. Onun itibaren 24 Mart 2016 duyuru :

  • Daha hızlı ve daha güvenilir: Artık VirtualBox yok! Docker motoru, Mac OS X üzerinde bir xhyve Sanal Makinesi üzerinde veya Windows üzerinde bir Hyper-V sanal makinesi üzerinde bir Alpine Linux dağıtımında çalışıyor ve bu sanal makine Docker uygulaması tarafından yönetiliyor. Mac ve Windows için Docker'ı çalıştırmak için docker makinesine ihtiyacınız yok.
  • Araç entegrasyonu: Mac için Docker, bir Mac uygulamasıdır ve Windows için Docker, yerel bir kullanıcı arabirimi ve otomatik güncelleme özelliği içeren bir Windows uygulamasıdır. Docker araç seti bununla birlikte gelir: Docker komut satırı, Docker Compose ve Docker Notary komut satırı.
  • Kodunuz ve verileriniz için birim bağlama: dosya değişikliği bildirimleri de dahil olmak üzere birim veri erişimi doğru çalışır (Mac'te inotify artık birime bağlı dizinler için kapsayıcılar içinde sorunsuz bir şekilde çalışır). Bu, "kapsayıcıda" geliştirme için düzenleme / test döngülerini etkinleştirir.
  • Yerel ana bilgisayar ağında çalışan kapsayıcılara kolay erişim: Mac ve Windows için Docker, kapsayıcılar için bir DNS sunucusu içerir ve Mac OS X ve Windows ağ sistemi ile entegre edilmiştir. Mac'te Docker, çok kısıtlayıcı bir kurumsal VPN'e bağlanıldığında bile kullanılabilir.
  • Mac için Docker, OS X korumalı alan güvenlik modeline uyacak şekilde sıfırdan tasarlandı ve bunu başarmak için Apple ile yakın bir şekilde çalışıyoruz.

Bunu geçen gün gördüm ve şimdiye kadarki en umut verici çözüm gibi görünüyor. Beta sürümden çıktığında bir şans vereceğim için çok heyecanlıyım ve iyi çalışıyorsa resmi olarak kabul edilen cevap olarak değiştireceğim.
Yevgeniy Brikman

4
Maalesef şu anki Beta sürümü (1.11.0-beta7) diğer yöntemler kadar yavaş görünüyor, bu yüzden forumları
walterra

3

Sorumluluk reddi: docker-sync'in yazarı olduğum için önyargılı olabilirim.

Muhtemelen burada adı geçen tüm çözümleri denedim, bazıları da dahil olmak üzere ( https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync derlemesine bakın ), ancak temelde ya performans (çoğu) veya docker makinesinde (veya hiçbiri) kullanılmış / zorunlu.

http://docker-sync.io , tüm çözümleri birleştirmek ve en iyi stratejileri sağlamak için oluşturulmuştur (birkaçını uygulayarak seçebilirsiniz).

Kullanıcılar için izin düzeltmeleri dahil olmak üzere rsync (1 yollu senkronizasyon) ve birleştirme (2 yollu senkronizasyon) ile kullanılabilir. Sizi ne docker-machine veya belirli bir hipervizöre zorlar ne de Mac için docker'a sahip olmanızı gerektirir. Hepsiyle çalışıyor.

EugenMayer / docker-sync / wiki / 4.-Performans performansı etkilenmez, sanki hiç payınız yokmuş gibi.

docker-sync ve değişiklik gözlemleyicileri optimize edilmiştir ve 12k dosyalı projelerle sorunsuz çalışır.

Bir deneyin, isterseniz geri bildirim almak isterim!


2

Seni hissediyorum! Sanırım denediğiniz her şeyi denedim ve ne yazık ki hala yavaştı. Daha sonra Virtualbox yerine Vagrant ve Parallels kullanmayı öneren https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254 yorumuna rastladım . Bu, nfs kullanmamı sağladı ve projem için gerçekten büyük bir performans artışı gördüm (Drupal).

İşte Vagrant dosyası. Tek yapmanız gereken vagrant yüklemek, bunu Vagrantfile adlı bir dosyaya kopyalayıp bir klasöre koymak. Bu klasöre gidin ve vagrant upnormal boot2docker'ınız yerine bir up yapın.

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

Bunun paralel bir kurulum gerektirdiğini varsayıyorum?
Yevgeniy Brikman

2

Vagrant'ı paralellikler ve boot2docker ile de kullanıyorum ( https://github.com/Parallels/boot2docker-vagrant-box ). Geliştirme benim için hiç bu kadar kolay olmamıştı. docker-composeBüyük kurulumlarla gerçekten iyi çalışıyor . Gerçekten bir gecikme veya yoğun kaynak tüketimi hissetmiyorum.

Bu benim ne Vagrantfilegörünüyor gibi:

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

Birkaç haftadır OS X (2011 ortası Macbook Air) + Boot2Docker + Docker-compose ortamında geliştirme yapıyorum. Büyük performans sorunlarıyla karşılaşmadım, ancak geliştirme sırasında herhangi bir derleme yapmaktan kaçınıyorum (neden böyle bir şey kullanmıyorsunuz jekyll serve --skip-initial-build?). İşte kullandığım bir örnek docker-compose.ymldosya:

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

Bazen NFS kullanıyorum ( http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf/ ), ancak bunu yaparken büyük bir performans farkı fark etmedim .

Benim için, docker-compose up testortamımı çalıştırmanın basitliğinin rahatlığı, performans maliyetine değdi (rutin olarak farklı yığınlara sahip birden çok proje üzerinde çalışıyorum).

Not: nodemonvboxsf ile çalışan birkaç dosya izleyicilerinden biridir (bkz. Https://github.com/remy/nodemon/issues/419 ).


Jekyll ile ilk yapıyı atlasam bile, bir dosyayı her değiştirdiğimde, yeniden inşa etmek zorunda kalacak, bu da eğer kaynak kodu takılıysa 1-3 dakika kadar sürer. Bu, herhangi bir tür değiştir ve yeniden yükle tarzı geliştirmeyi imkansız kılar.
Yevgeniy Brikman

@YevgeniyBrikman Oh, bunun farkında değildim :( Sanırım son seçenek kodunuzun boot2docker sanal makinesinin içinde canlı olması ve sshfs kullanarak ana makinenize monte edilmesi olacaktır. Aksi takdirde, beklemeniz gerekecek. docker'ı bir geliştirme ortamı olarak kullanmak için daha iyi bağlanmış klasör performansı.
Olivier Lalonde


-1

Docker'ın bir geliştirme aracı olarak çalışmasını sağlamak mümkündür. Ama acıtacak. Süreci burada belgeledim:

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


Gönderdiğiniz için teşekkürler, ancak bu takılan birimlerdeki performans sorunlarını nasıl çözer?
Yevgeniy Brikman

Ah, üzgünüm, artık herhangi bir şey monte etmek için vBox kullanmanıza gerek yok. Normal docker arabirimi aracılığıyla klasörleri bağlayabilirsiniz
harmingcola

-4

Bu yöntem en son (Eylül 2015) ve Mac'te Docker kurulumunu almanın en kolay yoludur: buraya bağlantı:

Docker Toolbox bağlantısını kullanarak buradaki talimatlara ulaşabilirsiniz:

Aşağıdaki Docker araçlarını içeren eksiksiz bir Docker kurulum paketidir :

Docker-machine ikili dosyasını çalıştırmak için Docker Machine

Docker ikili dosyasını çalıştırmak için Docker Engine

Docker-compose ikili dosyasını çalıştırmak için Docker Compose

Kitematic, Docker GUI, Docker komut satırı ortamı için önceden yapılandırılmış bir kabuk

Oracle VM VirtualBox

görüntü açıklamasını buraya girin

Araç kutusunda neler var:

  • Docker İstemcisi
  • Docker Makinesi
  • Docker Compose (yalnızca Mac)
  • Docker Kitematic
  • VirtualBox

3
Evet ama maalesef ortaya çıkan sorunu çözmedi.
Nick
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.