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:
- Saya dapat memodifikasi kode di OS X menggunakan alat (editor teks, IDE, git, dll) yang sudah saya instal.
- 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:
- Saya mengganti Boot2Docker untuk menggunakan NFS , tetapi juga lambat.
- Saya mencoba Vagrant + NFS , dan itu juga lambat.
- Saya mencoba memasang Samba , tetapi folder selalu muncul kosong di kontainer Docker.
- Saya mencoba menggunakan sistem file Unison , yang berfungsi sebentar untuk menyinkronkan file, tetapi kemudian terus menunjukkan kesalahan koneksi .
- Saya mengaktifkan pemungutan suara di Jekyll , tetapi itu secara signifikan meningkatkan penundaan sampai perubahan saya diambil.
- 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 .
sumber
Jawaban:
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 (
inotify
berfungsi 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
brew install boot2docker
.boot2docker init && boot2docker start --vbox-share=disable
.boot2docker shellinit
dan salin variabel lingkungan yang dicetaknya ke dalam~/.bash_profile
file Anda .boot2docker ssh "tce-load -wi rsync"
./foo/bar
folder dari OS X, Anda perlu membuat/foo/bar
pada Boot2Docker VM:boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar"
.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 .git
untuk mengecualikan.git
folder saat menyinkronkan.brew install fswatch
) yang disalurkan ke rsync.docker run
untuk menjalankan kontainer Docker Anda dan menggunakan-v
bendera untuk me-mount folder Anda sinkronisasi sedang:docker run -v /foo/bar:/src some-docker-image
.inotify
), dan build harus berjalan cepat karena semua file bersifat "lokal" ke penampung.boot2docker ip
perintah untuk mengetahui IP-nya.sumber
VOLUME
, maka Anda dapat memberikan akses kontainer lain ke volume itu menggunakan--volumes-from
bendera. Saya belum mencobanya, tetapi saya curiga itu akan berhasil.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.
Tunggu beberapa saat dan ini hampir pasti akan membaik.
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.
sumber
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 :
sumber
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!
sumber
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 up
bukan boot2docker normal Anda.sumber
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-compose
pengaturan besar. Saya tidak benar-benar merasakan penundaan atau konsumsi sumber daya yang besar.Seperti inilah
Vagrantfile
penampilanku:sumber
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 contohdocker-compose.yml
file yang saya gunakan:docker-compose.yml:
Dockerfile:
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 test
untuk menjalankan lingkungan saya sepadan dengan biaya kinerja (saya secara rutin mengerjakan banyak proyek dengan tumpukan berbeda).PS:
nodemon
adalah salah satu dari sedikit pengamat file yang bekerja dengan vboxsf (lihat https://github.com/remy/nodemon/issues/419 ).sumber
Docker Unison bekerja seperti pesona! https://github.com/leighmcculloch/docker-unison
Bidirectional Sync dengan performa yang sangat bagus!
sumber
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
sumber
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
Apa yang ada di kotak alat:
sumber