Oke, ada beberapa poin yang perlu dibahas di sini.
Mari kita mulai dengan apa itu volume buruh pelabuhan (Cobalah untuk tidak memikirkan macbook atau mesin gelandangan Anda saat ini. Perhatikan fakta bahwa buruh pelabuhan menggunakan sistem file yang berbeda, di mana pun ia berada saat ini):Mungkin bayangkan seperti ini, dengan sendirinya setiap volume di Docker hanyalah bagian dari sistem file internal yang digunakan buruh pelabuhan. Kontainer dapat menggunakan volume ini, seperti "hard drive kecil" yang dapat dipasang oleh mereka dan juga dibagikan di antara mereka ( atau dipasang oleh dua dari mereka secara bersamaan, seperti memasang versi super cepat dari beberapa server ftp ke dua klien atau apa pun :P ).
Pada prinsipnya Anda dapat mendeklarasikan volume ini ( masih tidak memikirkan komputer Anda/gelandangan itu sendiri, hanya buruh pelabuhan;) ) melalui instruksi VOLUME Dockerfile. Contoh standar, jalankan satu wadah server web seperti:
FROM: nginx
VOLUME /www
Sekarang semua yang masuk ke /www secara teori dapat dipasang dan dilepas dari wadah dan juga dipasang ke beberapa wadah. Sekarang Nginx saja sudah membosankan, jadi kami ingin php menjalankan file yang disimpan nginx untuk menghasilkan konten yang lebih menyenangkan. => Kita perlu memasang volume itu ke dalam beberapa wadah php-fpm. Ergo di file penulisan kita, kita akan melakukan ini
web:
image: nginx
php:
image: php-fpm
volumes_from:
- web
=> voila! setiap folder yang dideklarasikan oleh arahan VOLUME di wadah nginx/web akan terlihat di folder php. Poin penting yang perlu diperhatikan di sini, apa pun yang ada di /www nginx, akan menimpa apa pun yang ada di /www php. Jika Anda meletakkan :ro, php bahkan tidak dapat menulis ke folder itu :)
Sekarang mendekati masalah Anda, ada cara kedua untuk mendeklarasikan volume, yang tidak mengharuskannya dideklarasikan di Dockerfile. Ini dapat dilakukan dengan memasang volume dari Host (dalam hal ini gelandangan/boo2docker Anda). Mari kita bahas ini seolah-olah kita menjalankan Linux asli terlebih dahulu.
Jika Anda ingin meletakkan sesuatu seperti:
volumes:
- /home/myuser/folder:/folder
di docker-compose.yml Anda, maka ini berarti bahwa /home/myuser/folder sekarang akan dipasang ke docker. Itu akan menimpa apa pun yang dimiliki buruh pelabuhan di /folder dan sama seperti /www juga dapat diakses dari hal yang mendeklarasikannya. Sekarang mesin Linux yang menjalankan daemon buruh pelabuhan.
Begitu banyak teorinya :), sebenarnya Anda mungkin hanya memerlukan saran berikut untuk menjalankan tugas Anda :):
Cara boot2docker/docker-machine/kitematic dan semua hal ini menangani masalah ini sederhana, bahwa mereka pertama-tama hanya memasang volume di mesin gelandangan ke wadah buruh pelabuhan, dan mereka juga memasang benda ini ke sistem file Mac Anda , semoga berhasil :P
Sekarang untuk masalah praktis kita semua menggunakan ini (atau hanya mencoba membantu rekan kerja mereka ke dunia Docker manis manis :P) di Mac yang dihadapi adalah izin. Maksud saya pikirkan tentang itu ( root atau pengguna lain menangani file dalam wadah, pengguna gelandangan mungkin menangani file di Host gelandangan dan kemudian pengguna Mac Anda "skalfyfan" menangani file-file itu di Mac. Mereka semua memiliki id pengguna yang berbeda dan yang lainnya => banyak masalah terjadi dengan itu, dan agak tergantung pada apa yang sebenarnya Anda jalankan di Docker. Mysql dan Apache sangat menyakitkan, karena mereka tidak berjalan sebagai root di dalam wadah. Ini berarti, mereka sering mengalami kesulitan menulis ke file Mac sistem.
Sebelum mencoba pendekatan kedua di bawah ini, coba letakkan volume kontainer Anda di bawah direktori home Mac Anda. Ini akan menyelesaikan masalah dengan MySQL dalam banyak kasus seperti yang saya temukan dari waktu ke waktu. Btw:Tidak perlu mendeklarasikan path lengkap ke volumes ./folder baik-baik saja dan membaca relatif terhadap tempat docker-compose.yml Anda berada!
Letakkan saja compose-yml di folder pengguna Mac Anda, itu yang terpenting. Tidak ada chmod 777 -R :P akan membantu Anda di sini, hanya perlu di bawah folder rumah Anda :)
Masih beberapa aplikasi ( Apache misalnya ) masih akan menyulitkan Anda. Fakta bahwa id pengguna dari apa pun yang berjalan di wadah berbeda dari id pengguna Mac Anda akan membuat hidup Anda seperti neraka. Untuk menyiasatinya, Anda perlu menyesuaikan id pengguna serta grup pengguna dengan cara yang tidak bertentangan dengan izin Mac Anda. Grup yang Anda inginkan di Mac adalah staf, UID yang berfungsi misalnya 1000. Oleh karena itu, Anda dapat meletakkan ini di akhir Dockerfile Anda:
RUN usermod -u 1000 www-data
RUN usermod -G staff www-data
atau
RUN usermod -u 1000 mysql
RUN usermod -G staff mysql
Jadi seperti yang telah Anda pelajari sekarang:
Benar, ia melakukan itu :)
Yang ini Anda salah :) Seperti yang dijelaskan, jika Anda tidak memberikan folder host, maka Docker akan mempertahankan jalur ini. Tetapi hanya untuk wadah ini dan semuanya akan tetap berada di dalam sistem file buruh pelabuhan. Tidak ada yang ditulis untuk tuan rumah sama sekali! Ini hanya akan terjadi jika Anda memberikan folder host sebelum folder container!
Semoga membantu :)