Apa cara yang benar untuk mengatur lingkungan pengembangan di OS X dengan Docker?

94

Intro

Saya tidak dapat menemukan cara yang baik untuk mengatur lingkungan pengembangan di OS X menggunakan Docker dan Boot2Docker. Masalah yang saya hadapi adalah bagaimana mengelola kode sumber sehingga:

  1. Saya dapat memodifikasi kode di OS X menggunakan alat (editor teks, IDE, git, dll) yang sudah saya instal.
  2. Modifikasi tersebut tercermin dalam wadah Docker jadi jika saya menjalankan ulang tes atau menyegarkan halaman web, saya dapat segera melihat perubahan saya.

Secara teori, ini seharusnya mudah dilakukan dengan memasang kode sumber saya sebagai volume:

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

Sayangnya, ini memiliki dua masalah utama yang membuatnya benar-benar tidak dapat digunakan di OS X:

Masalah # 1: Volume yang dipasang di VirtualBox (yang menggunakan vboxsf) sangat lambat

Misalnya, berikut adalah berapa lama waktu yang dibutuhkan Jekyll untuk mengompilasi beranda saya jika kode sumbernya adalah bagian dari image Docker:

> 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

Berikut adalah gambar Docker yang sama persis, kecuali kali ini, saya memasang kode sumber dari OS X:

> 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

Masalah # 2: Menonton file rusak

Mekanisme jam tangan default di SBT, Jekyll, dan grunt menggunakan teknologi seperti inotify, yang tidak berfungsi jika dijalankan di container Docker dan perubahan dilakukan di OS X ke folder yang dipasang.

Solusi yang saya coba

Saya mencari solusi (termasuk semua yang ada di SO) dan mencoba beberapa di antaranya, tetapi belum menemukan yang berhasil:

  1. Saya mengganti Boot2Docker untuk menggunakan NFS , tetapi juga lambat.
  2. Saya mencoba Vagrant + NFS , dan itu juga lambat.
  3. Saya mencoba memasang Samba , tetapi folder selalu muncul kosong di kontainer Docker.
  4. Saya mencoba menggunakan sistem file Unison , yang berfungsi sebentar untuk menyinkronkan file, tetapi kemudian terus menunjukkan kesalahan koneksi .
  5. Saya mengaktifkan pemungutan suara di Jekyll , tetapi itu secara signifikan meningkatkan penundaan sampai perubahan saya diambil.
  6. Saya mencoba Dinghy , sebuah "Docker yang lebih cepat dan lebih ramah di OS X dengan Vagrant" dan mendapat beberapa peningkatan. Alih-alih kompilasi Jekyll menjadi 10-15x lebih lambat, itu 2-3x lebih lambat. Itu lebih baik, tapi masih belum bisa digunakan.

Adakah yang menemukan solusi yang benar-benar berfungsi dan memungkinkan Anda untuk mengembangkan kode secara produktif dengan Docker dan OS X?

Pembaruan: solusi akhirnya!

Saya akhirnya menemukan solusi yang tampaknya produktif menggunakan Boot2Docker + rsync. Saya telah menangkap detail tentang cara mengatur ini dalam jawaban saya sendiri serta proyek sumber terbuka yang disebut docker-osx-dev .

Yevgeniy Brikman
sumber
Anda sudah mencoba penginstal Docker resmi untuk OS X bersama dengan NFS? AFAIK ini bukan masalah yang terbatas pada Docker di OS X tetapi juga pengembangan berbasis Vagrant di OS X dengan basis kode yang lebih besar ( kami memiliki masalah serupa tetapi dengan Vagrant ). Saya telah menemukan NFS menjadi satu-satunya solusi yang layak dan dapat diterima.
James Mills
@JamesMills: Saya mengikuti instruksi resmi untuk menginstal Docker dan Boot2Docker. Apakah ada instruksi resmi untuk menyiapkan NFS? Saya hanya menemukannya di inti GitHub, dan setelah menggunakannya, tampaknya tidak lebih cepat. Bagaimana Anda mengatur NFS?
Yevgeniy Brikman
Pernahkah Anda melihat github.com/boot2docker/boot2docker/issues/64 ?
James Mills
6
Cara yang tepat untuk bekerja dengan Docker adalah dengan menjalankan Linux secara native, bukan OS X, atau melakukan semua pekerjaan pengembangan Anda di dalam VM Linux. Integrasi "boot2docker" adalah peretasan jelek besar yang tidak melakukan apa-apa selain menabur kebingungan dan kekecewaan.
Larsks
7
@larsks: Itu tidak membantu.
Yevgeniy Brikman

Jawaban:

46

Saya telah memutuskan untuk menambahkan jawaban saya sendiri dengan solusi terbaik yang saya temukan sejauh ini. Saya akan memperbarui ini jika saya menemukan opsi yang lebih baik.

Solusi terbaik sejauh ini

Solusi terbaik yang saya temukan untuk menyiapkan lingkungan pengembangan yang produktif dengan Docker di OS X adalah: Boot2Docker + Rsync . Dengan rsync, waktu build di container Docker setara dengan menjalankan build langsung di OSX! Selain itu, kode pengamat file tidak memerlukan polling ( inotifyberfungsi karena rsync menggunakan folder normal), jadi hot reload hampir sama cepatnya.

Ada dua cara untuk menyiapkannya: penginstalan otomatis dan penginstalan manual.

Instal otomatis

Saya telah mengemas semua langkah untuk menyiapkan Boot2Docker dengan Rsync ke dalam proyek sumber terbuka bernama docker-osx-dev . Kodenya agak kasar, tetapi saya telah berhasil menggunakannya selama beberapa minggu untuk dengan mudah beralih di antara 3 proyek dengan 3 tumpukan teknologi yang berbeda. Cobalah, laporkan bug, dan kirimkan beberapa PR! Juga, lihat posting blog saya, Lingkungan pengembangan yang produktif dengan Docker di OS X untuk info lebih lanjut.

Pengaturan manual

  1. Instal Boot2Docker : brew install boot2docker.
  2. Run Boot2Docker, tetapi dengan VirtualBox berbagi folder dinonaktifkan: boot2docker init && boot2docker start --vbox-share=disable.
  3. Jalankan boot2docker shellinitdan salin variabel lingkungan yang dicetaknya ke dalam ~/.bash_profilefile Anda .
  4. Install rsync pada Boot2Docker VM: boot2docker ssh "tce-load -wi rsync".
  5. Buat folder dasar yang Anda butuhkan pada VM Boot2Docker dan atur izin dengan benar untuk mereka. Misalnya, jika Anda akan sinkronisasi /foo/barfolder dari OS X, Anda perlu membuat /foo/barpada Boot2Docker VM: boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar".
  6. Menjalankan rsync untuk melakukan sinkronisasi file ke Boot2Docker VM: rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo. Periksa dokumen rsync untuk berbagai pengaturan yang mungkin ingin Anda aktifkan, seperti menggunakan --exclude .gituntuk mengecualikan .gitfolder saat menyinkronkan.
  7. Gunakan pengamat file untuk menjaga file tetap sinkron. Misalnya, Anda bisa menggunakan fswatch ( brew install fswatch) yang disalurkan ke rsync.
  8. Pada titik ini, Anda harus dapat menggunakan docker rununtuk menjalankan kontainer Docker Anda dan menggunakan -vbendera untuk me-mount folder Anda sinkronisasi sedang: docker run -v /foo/bar:/src some-docker-image.
  9. Perbarui kode di OS X seperti biasa. Perubahan harus menyebar dengan sangat cepat menggunakan rsync, kode pengawas file normal harus mengambil perubahan seperti biasa (yaitu, menggunakan inotify), dan build harus berjalan cepat karena semua file bersifat "lokal" ke penampung.
  10. Jika Anda perlu menguji situs web yang sedang berjalan, jalankan boot2docker ipperintah untuk mengetahui IP-nya.
Yevgeniy Brikman
sumber
Terima kasih telah berbagi! Ketika mereka mengatakan rsync adalah "hanya satu arah", apakah itu berarti saya tidak dapat menggunakan sistem file OS X untuk berbagi file antara dua wadah? Contoh: container 1 mengawasi file sumber & mengompilasi biner, container 2 digunakan untuk menjalankan biner yang dikompilasi (menggunakan Haskell dalam contoh ini).
Nicolas Hery
1
@NicolasHery: Pemahaman saya adalah bahwa rsync akan menyalin perubahan dari OS X ke container Docker, tetapi tidak sebaliknya. Oleh karena itu, file apa pun yang dibuat oleh kontainer Docker (misalnya biner terkompilasi) tidak akan terlihat di OS X. Namun, jika file tersebut dibuat ke dalam folder yang ditandai sebagai VOLUME, maka Anda dapat memberikan akses kontainer lain ke volume itu menggunakan --volumes-frombendera. Saya belum mencobanya, tetapi saya curiga itu akan berhasil.
Yevgeniy Brikman
1
Jawaban yang bagus. Anda bisa membuat driver untuk docker-machine ( github.com/docker/machine ) yang melakukan sebagian besar boilerplate untuk Anda.
dom
1
@dom: Saya suka ide itu, tetapi apakah Anda tahu cara membuat driver untuk mesin buruh pelabuhan? Apakah permintaan tarik ke dalam repo satu-satunya cara atau mungkinkah membuat driver secara eksternal?
Yevgeniy Brikman
1
Apakah tutorial ini masih berlaku untuk versi 1.9.1 baru di Windows? Dapatkah saya menggunakannya atau mungkin Docker sudah memiliki solusi baru untuk "masalah" ini?
18

Pembaruan : Sekarang pekerja galangan untuk mac dalam versi beta dengan fungsionalitas non-peretasan, mengikuti rute itu mungkin jauh lebih masuk akal untuk pengembangan lokal tanpa peretasan dan penyelesaian masalah.

Jangan . Saya tahu itu bukan jawaban yang mungkin Anda harapkan, tetapi lakukan evaluasi yang jujur ​​tentang biaya / manfaat mencoba mendapatkan kode sumber lokal + eksekusi dockerized vs hanya melakukan pengembangan lokal di OSX.

Pada titik tertentu semua masalah, upaya penyiapan, dan titik nyeri operasional DAPAT diselesaikan dengan cukup baik, tetapi pada saat ini pendapat saya adalah kerugian bersih.

Masalah # 1: Volume yang dipasang di Virtual Box (yang menggunakan vboxfs) sangat lambat

Tunggu beberapa saat dan ini hampir pasti akan membaik.

Masalah # 2: Menonton file rusak

Saya tidak yakin perbaikan untuk ini dalam waktu dekat. Jika jenis fungsi ini adalah kunci untuk alur kerja pengembangan Anda, saya akan menganggap ini sebagai pemecah kesepakatan. Tidak sepadan dengan upaya R&D besar jika dibandingkan dengan hanya menggunakan rbenv / bundler untuk mengelola pemasangan jekyll / ruby ​​Anda dan menjalankannya secara lokal di OSX seperti yang telah dilakukan orang-orang dengan sukses selama dekade terakhir +.

Sama seperti "cloud" tidak memiliki keterlibatan nol dalam penyiapan pengembangan lokal saya, saat ini, buruh pelabuhan adalah kemenangan untuk pengujian / pementasan / penerapan dan untuk menjalankan database dan komponen pihak ketiga lainnya, tetapi aplikasi yang sebenarnya saya kodekan dapat dijalankan dengan benar di OSX.

Peter Lyons
sumber
1
Saya setuju itu. Kami mengembangkan di OSX dan menjalankan aplikasi langsung di dalam sistem (dengan reload langsung dll). Kemudian, setelah aplikasi selesai, kami melakukan docker untuk pengujian, pementasan, dan produksi.
ItalyPaleAle
4
Hm, itu agak mengecewakan. Saya selalu memiliki keseimbangan dalam lingkungan pementasan / produksi saya. Itu dev yang selalu outlier, seperti yang saya kodekan di OS X. Dokumentasi Docker jelas membuatnya terdengar seperti ini adalah masalah yang sudah dipecahkan. Saya akan mencoba satu hari lagi dan melihat apakah saya bisa mendapatkan sesuatu untuk bekerja.
Yevgeniy Brikman
Apakah Anda masih merasa jawaban ini valid hari ini, Peter? Hanya beberapa bulan ke depan, tetapi mengingat proyek @ Yevgeniy dan hanya 2 masalah yang sekarang sudah diperbaiki, mungkin biaya / manfaatnya sekarang sudah sepadan! Bukan?
cregox
1
Itu adalah preferensi pribadi. Saya masih tidak akan mengacaukan ini karena banyaknya proyek yang saya lewati sebagai konsultan. Jika saya adalah seorang full-timer yang sebagian besar bekerja pada proyek yang sama selama berminggu-minggu / berbulan-bulan, mungkin ada baiknya menyiapkan barang rsync / fswatch.
Peter Lyons
Docker Toolbox adalah cara yang tepat untuk melakukannya saat ini karena jika Anda menggunakan homebrew atau pengelola paket lain, versi alat buruh pelabuhan akan keluar dari sinkronisasi, kecuali mereka mengikuti versi sebagai kotak alat buruh pelabuhan.
taco
12

Docker untuk Mac dan Windows akan menjadi cara pasti untuk berkembang dengan Docker di OS X (dan Windows). Produk Docker, perangkat lunaknya adalah "lingkungan terintegrasi yang mudah diterapkan untuk membangun, merakit, dan mengirim aplikasi dari Mac atau Windows". Ini dimaksudkan untuk dapat menyelesaikan masalah yang disajikan oleh OP. Dari pengumuman 24 Maret 2016 :

  • Lebih cepat dan lebih andal: tidak ada lagi VirtualBox! Mesin Docker berjalan dalam distribusi Linux Alpine di atas Mesin Virtual xhyve di Mac OS X atau di VM Hyper-V di Windows, dan VM tersebut dikelola oleh aplikasi Docker. Anda tidak memerlukan mesin galangan untuk menjalankan Docker untuk Mac dan Windows.
  • Integrasi alat: Docker untuk Mac adalah aplikasi Mac dan Docker untuk Windows adalah aplikasi Windows, termasuk antarmuka pengguna asli dan kemampuan pembaruan otomatis. Set alat Docker dilengkapi dengan itu: baris perintah Docker, Docker Compose, dan baris perintah Docker Notary.
  • Pemasangan volume untuk kode dan data Anda: akses data volume berfungsi dengan benar, termasuk pemberitahuan perubahan file (di Mac inotify sekarang bekerja dengan mulus di dalam kontainer untuk direktori yang dipasang pada volume). Hal ini memungkinkan siklus edit / uji untuk pengembangan "dalam penampung".
  • Akses mudah untuk menjalankan kontainer di jaringan host lokal: Docker untuk Mac dan Windows menyertakan server DNS untuk kontainer, dan terintegrasi dengan sistem jaringan Mac OS X dan Windows. Di Mac, Docker dapat digunakan bahkan saat terhubung ke VPN perusahaan yang sangat ketat.
  • Docker untuk Mac dirancang dari awal agar dapat disesuaikan dengan model keamanan sandbox OS X dan kami bekerja sama dengan Apple untuk mencapai hal ini.
Quinn Comendant
sumber
Saya baru saja melihatnya beberapa hari yang lalu, dan sejauh ini tampaknya solusi yang paling menjanjikan. Saya sangat bersemangat untuk mencobanya setelah keluar dari beta, dan jika berfungsi dengan baik, saya akan mengubahnya menjadi jawaban yang diterima secara resmi.
Yevgeniy Brikman
4
Sayangnya versi Beta saat ini (1.11.0-beta7) tampaknya sama lambatnya dengan metode lain sehingga mungkin perlu beberapa saat hingga ini layak untuk menggunakan forums.docker.com/t/…
walterra
3

Penafian: Saya mungkin bias, karena saya penulis docker-sync.

Saya mungkin mencoba semua solusi yang disebutkan di sini, termasuk beberapa lagi (lihat kompersi https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync ), tetapi pada dasarnya mereka gagal di sisi kinerja (kebanyakan dari mereka) atau pada mesin buruh pelabuhan (atau tidak ada) yang digunakan / diberlakukan.

http://docker-sync.io telah dibangun untuk menggabungkan semua solusi dan memberikan strategi terbaik (menerapkan beberapa, Anda dapat memilih).

Ini dapat digunakan dengan rsync (sinkronisasi 1 arah) termasuk perbaikan izin untuk pengguna, dan dengan serempak (sinkronisasi 2 arah). Itu tidak memaksa Anda untuk menggunakan buruh pelabuhan atau hypervisor tertentu, juga tidak mengharuskan Anda memiliki buruh pelabuhan untuk Mac. Ini bekerja dengan semuanya.

Kinerja EugenMayer / docker-sync / wiki / 4.-Performance tidak terpengaruh, sepertinya Anda tidak memiliki bagian sama sekali.

docker-sync dan pengamat perubahannya dioptimalkan dan bekerja dengan proyek dengan 12k file tanpa masalah.

Cobalah, jika Anda suka, saya ingin mendengar tanggapannya!

Eugen Mayer
sumber
2

Saya mengerti perasaanmu! Saya rasa saya sudah mencoba hampir semua yang Anda coba dan sayangnya itu masih lambat. Kemudian saya menemukan komentar ini https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254 yang menyarankan menggunakan Vagrant dan Parallels dan bukannya Virtualbox. Ini memungkinkan saya untuk menggunakan nfs dan saya memang melihat peningkatan kinerja yang besar untuk proyek saya (Drupal).

Ini file Vagrant. Yang perlu Anda lakukan hanyalah menginstal vagrant, salin ini ke dalam file bernama Vagrantfile dan letakkan di beberapa folder. Pergi ke folder itu dan lakukan saja vagrant upbukan boot2docker normal Anda.

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
Alex Dicianu
sumber
Saya berasumsi ini membutuhkan instalasi paralel?
Yevgeniy Brikman
2

Saya juga menggunakan Vagrant dengan paralel dan boot2docker ( https://github.com/Parallels/boot2docker-vagrant-box ). Pengembangan tidak pernah lebih mudah bagi saya. Bekerja dengan sangat baik dengan docker-composepengaturan besar. Saya tidak benar-benar merasakan penundaan atau konsumsi sumber daya yang besar.

Seperti inilah Vagrantfilepenampilanku:

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
David Heidrich
sumber
1

Saya telah mengembangkan di OS X (pertengahan 2011 Macbook Air) + Boot2Docker + lingkungan Docker-compose selama beberapa minggu sekarang. Belum mengalami masalah performa utama, tetapi saya menghindari menjalankan build apa pun saat mengembangkan (mengapa tidak menggunakan sesuatu seperti jekyll serve --skip-initial-build?). Berikut adalah contoh docker-compose.ymlfile yang saya gunakan:

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

Saya terkadang menggunakan NFS ( http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf/ ) tetapi belum melihat perbedaan kinerja yang besar saat melakukannya.

Bagi saya, kemudahan docker-compose up testuntuk menjalankan lingkungan saya sepadan dengan biaya kinerja (saya secara rutin mengerjakan banyak proyek dengan tumpukan berbeda).

PS: nodemonadalah salah satu dari sedikit pengamat file yang bekerja dengan vboxsf (lihat https://github.com/remy/nodemon/issues/419 ).

Olivier Lalonde
sumber
Bahkan jika saya melewatkan build awal dengan Jekyll, setiap kali saya mengubah file, file tersebut harus dibangun ulang, yang masih membutuhkan waktu 1-3 menit jika kode sumber dipasang. Hal ini membuat tidak mungkin untuk melakukan pengembangan gaya ubah-dan-muat ulang.
Yevgeniy Brikman
@YevgeniyBrikman Oh, saya tidak menyadarinya :( Saya kira opsi terakhir adalah membuat kode Anda hidup di dalam VM boot2docker dan memasangnya di mesin host Anda menggunakan sshfs. Jika tidak, saya rasa Anda harus menunggu kinerja folder yang dipasang lebih baik untuk menggunakan buruh pelabuhan sebagai lingkungan pengembang
Olivier Lalonde
-1

Membuat buruh pelabuhan bekerja sebagai alat pengembangan adalah mungkin. Tapi itu akan menyakitkan. Saya telah mendokumentasikan prosesnya di sini:

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

harmingcola
sumber
Terima kasih telah memposting, tetapi bagaimana cara ini menyelesaikan masalah kinerja dengan volume yang dipasang?
Yevgeniy Brikman
Ah, maaf, Anda tidak perlu lagi menggunakan vBox untuk memasang apapun. Anda dapat memasang folder melalui antarmuka buruh pelabuhan biasa
harmingcola
-4

Metode ini adalah yang terbaru (Sep 2015) dan cara termudah untuk mendapatkan pengaturan Docker di Mac: tautkan di sini:

Anda menginstal Docker menggunakan Docker Toolbox tautan ke instruksi di sini:

Ini adalah paket pengaturan Docker lengkap, yang mencakup alat Docker berikut:

Docker Machine untuk menjalankan biner docker-machine

Docker Engine untuk menjalankan biner buruh pelabuhan

Docker Compose untuk menjalankan biner docker-compose

Kitematic, Docker GUI, shell yang telah dikonfigurasi sebelumnya untuk lingkungan baris perintah Docker

Oracle VM VirtualBox

masukkan deskripsi gambar di sini

Apa yang ada di kotak alat:

  • Klien Docker
  • Mesin Docker
  • Docker Compose (khusus Mac)
  • Docker Kitematic
  • VirtualBox
rootscript
sumber
3
Ya tapi sayangnya itu tidak menyelesaikan masalah yang awalnya disajikan.
Nick