Pertanyaan Dapatkah Anda menjalankan Docker secara asli di Windows 10 (Ubuntu) bash userspace yang baru?


Pemahaman saya adalah bahwa keterbatasan utama menjalankan buruh pelabuhan di OS lain adalah wadah Linux Network yang memungkinkan. (Tentunya untuk Mac).

Baru saja Microsoft mengumumkan beta dari a Ubuntu linux mode pengguna berjalan secara asli pada Windows 10. Ini dapat menjalankan binari yang dikompilasi dalam format ELF pada Windows (tidak seperti cygwin yang memerlukan kompilasi.)

Pertanyaanku adalah: Dapatkah Anda menjalankan Docker secara asli di Windows 10 (Ubuntu) bash userspace yang baru?


121
2018-04-04 10:16




Bukan "hanya" a bash ruang pengguna. Ini adalah ruang pengguna Linux yang nyata dan cukup lengkap, tetapi tanpa X Windows hanya teks. Mengatakan "bash" mengkomunikasikan batasan teks saja dengan cukup baik .. - MSalters
Apakah saya melewatkan sesuatu? Apakah ini benar-benar didistribusikan? Saat ini saya hanya mengetahuinya sebagai vaporware. - Michael Hampton♦
Saya pikir itu tidak akan jelas sampai mereka merilis ini (AFAIK itu bahkan tidak tersedia untuk orang dalam windows belum) namun perlu dicatat bahwa Microsoft dan Docker bekerja untuk membawa Docker ke Windows secara asli, yang akan dirilis bersama dengan server Windows 2016 - Rоry McCune
@ RоryMcCune: Menarik. Namun, menurut entri blog Docker ini mulai Agustus 2015, ini akan menjadi port yang memungkinkan Docker berjalan Windows gambar di Windows, bukan gambar Linux di Windows. - sleske
memang itulah tujuan dari docker asli Windows. Sifat peti kemas adalah bahwa Anda tidak dapat menjalankan sistem dengan kernel lain, tanpa menambahkan beberapa virtualisasi atau (mungkin) subsistem baru ini yang dikembangkan Microsoft - Rоry McCune


Jawaban:


Mulai sekarang (April 2016) jawabannya adalah:

Kami belum tahu (tapi mungkin tidak).

Fakta-fakta

  • Windows 10 sekarang dapat menjalankan berbagai program Linux (diantaranya mereka shell Bash dan berbagai utilitas teks). Ini bukan port (yaitu versi yang dikompilasi ulang, seperti misalnya di Cygwin), mereka sama ELF binaries yang berjalan pada sistem Linux yang khas. Di kasus ini, mereka diambil dari Ubuntu.
  • Untuk memungkinkan hal ini, Windows 10 dimodifikasi untuk menerima Linux System calls (syscalls), dan untuk dapat memuat dan menjalankan binari ELF (komentar oleh Scott Hanselman). Ini berarti executable Linux yang tidak dimodifikasi dapat dijalankan, mereka akan memuat pustaka bersama yang tidak dimodifikasi seperti yang diperlukan, dan Windows akan menjalankannya sebagai proses Windows.
  • Kapan pun program Linux ingin berinteraksi dengan kernel, ia mengeluarkan panggilan sistem (atau memungkinkan perpustakaan melakukannya). Ini (mungkin) satu-satunya perbedaan untuk berjalan di Linux: Ketika berjalan di Linux, kernel Linux menangani panggilan ini; pada Windows 10, kernel Windows 10 melakukannya.

Spekulasi

Jadi pertanyaannya adalah apakah syscall yang dibutuhkan Docker (untuk chroot dan namespace, antara lain) dilaksanakan atau tidak. Jawabannya adalah "tidak". Docker membutuhkan fungsionalitas yang cukup canggih (dan Linux-spesifik) untuk proses dan manajemen sumber daya, dan proses isolasi. Meskipun mungkin untuk mereplikasi semua ini di Windows, itu akan menjadi banyak pekerjaan, dan karena tujuan dari fitur Windows ini tampaknya menjalankan program-program userspace Linux, tampaknya tidak mungkin mereka melakukan semua pekerjaan (dan merahasiakannya) .

Namun, tidak ada informasi yang pasti, sejauh yang saya tahu. 

Ada port Docker

Tentu saja, jika Microsoft memutuskan bahwa mereka menginginkan dukungan Docker di Windows 10, mereka mungkin akan dapat menawarkannya. Ada beberapa preseden untuk porting Docker ke kernel yang berbeda:

  • Ada sebuah Port Docker untuk FreeBSD. Ini diberi label "eksperimental", tetapi tampaknya bekerja pada prinsipnya. Ia dapat menggunakan kontainer Docker yang tidak dimodifikasi dari repositori Docker, yang berarti ia benar-benar menyediakan lingkungan host Linux-seperti untuk gambar.
  • Ada proyek yang sedang berlangsung untuk porting Docker ke Windows (khususnya, Windows Server 2016) - lihat ini Entri blog Docker dari Agustus 2015. Namun, tidak seperti port FreBSD di atas, ini akan menjadi port yang memungkinkan Docker untuk menjalankan gambar Windows di Windows, bukan gambar Linux di Windows. Terima kasih kepada Rоry McCune untuk menunjukkan ini.

50
2018-04-05 07:15



Pembaruan: Ada artikel tentang topik di blog MSDN sekarang: Subsistem Windows untuk Tinjauan Linux. - sleske
Sampai hari ini mungkin dengan Hyper-V: tutorials.ubuntu.com/tutorial/… - Nick Sweeting
Saya kalah suara hanya karena jawaban suara yang lebih tinggi lebih berguna daripada spekulasi tentang apa yang mungkin, itu mencakup apa. - James


Anda dapat menggunakan Docker untuk Windows sebagai mesin dan Docker untuk linux sebagai klien di Bash pada Ubuntu di Windows. Hubungkan mereka melalui TCP.

Instal Docker untuk Windows: https://docs.docker.com/docker-for-windows/ Jika Anda ingin menggunakan Wadah Windows sebagai gantinya, Wadah Linux kedua tipe kontainer dapat dikelola oleh klien docker linux di bash userspace.

Sejak versi 17.03.1-ce-win12 (12058) Anda harus memeriksanya Buka daemon di tcp: // localhost: 2375 tanpa TLS agar klien linux docker terus berkomunikasi dengan windows docker daemon oleh TCP

Ikuti langkah ini:

cd
wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.1-ce.tgz
tar -xzvf docker-*.tgz
cd docker
./docker -H tcp://0.0.0.0:2375 ps

atau

env DOCKER_HOST=tcp://0.0.0.0:2375 ./docker ps

Untuk membuatnya permanen:

mkdir ~/bin
mv ~/docker/docker ~/bin

Tambahkan variabel yang sesuai ke .bashrc

export DOCKER_HOST=tcp://0.0.0.0:2375
export PATH=$PATH:~/bin

Tentu saja Anda dapat menginstal docker-compose

sudo -i
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Atau menggunakan pip python

sudo apt-get install python-pip bash-completion
sudo pip install docker-compose

Dan Bash selesai. Bagian terbaik:

sudo -i
apt-get install bash-completion
curl -L https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker > /etc/bash_completion.d/docker
curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

Saya telah mengujinya menggunakan versi Docker untuk Windows 1886.0-win59 (19098) menggunakan Hyper-V:

~$ docker version
Client:
 Version:           18.06.0-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        0ffa825
 Built:             Wed Jul 18 19:04:39 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.0-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       0ffa825
  Built:            Wed Jul 18 19:13:46 2018
  OS/Arch:          linux/amd64
  Experimental:     true

Lihatlah kata klien dan server OS / Arch: linux / amd64

Volume

Hati-hati saat menambahkan volume. Jalan C:\dir akan terlihat sebagai /mnt/c/dir di WSL dan sebagai /c/dir/ oleh mesin buruh pelabuhan. Anda dapat mengatasinya secara permanen:

sudo bash -c "echo -e '[automount] \nroot = /'>/etc/wsl.conf"

Anda harus keluar dan mengisi kembali WSL setelah membuat perubahan ke wsl.conf sehingga WSL membaca perubahan Anda saat peluncuran.

MEMPERBARUI

dari: Apa yang baru untuk Command Line di Windows 10 versi 1803

Soket Unix   Soket Unix tidak didukung di Windows, dan sekarang sudah! Anda juga dapat berkomunikasi melalui soket Unix antara Windows dan WSL. Salah satu hal hebat tentang hal ini adalah memungkinkan WSL untuk menjalankan Linux Docker Client untuk berinteraksi dengan Docker Daemon yang berjalan di Windows.

Salam


99
2017-07-19 22:05



Halo @ joel-pearson, buruh pelabuhan memiliki dua bagian: mesin dan klien. Mesin berjalan di windows menggunakan Docker Toolbox (VirtualBox based) atau Docker for Windows (berbasis Hyper-V) yang secara resmi didukung oleh tim docker. Mesin Docker tidak berjalan di ruang pengguna bash. Klien Docker di windows dapat dijalankan dalam cmd, powershell atau cygwin. Apa jawaban ini katakan adalah cara untuk menjalankan klien buruh pelabuhan di bash userspace. Mengapa? Secara pribadi saya lebih menyukai bash, penyelesaiannya berhasil. Saya setuju bahwa pertanyaannya adalah mengenai mesin docker, tetapi saya menemukannya ketika saya mencari klien, dan banyak orang melakukan hal yang sama. - Carlos Rafael Ramirez
Saya baru saja mengujinya dan berhasil untuk saya pada 1,12 :) Super bersemangat untuk sekarang dapat melakukan beberapa pengembangan serius pada windows. - Zach Russell
Mencoba instruksi Anda di Bash pada Ubuntu di Windows, mendapat "Tidak dapat terhubung ke daemon Docker. Apakah daemon docker berjalan pada host ini?". Apakah Anda kehilangan beberapa langkah? - mpen
Pada Februari 2017, ini masih satu-satunya cara. - hdave
Setelah Juni 2017, Anda bisa jalankan buruh pelabuhan untuk windows executable dari shell bash. Alih-alih menginstal klien buruh pelabuhan Anda dapat menggunakan docker.exe langsung ke query / berinteraksi subsistem buruh pelabuhan. Namun, perhatikan bahwa docker untuk windows akan menggunakan variabel windows dan konfigurasi. - Jaime


Pratinjau orang dalam pertama dirilis kemarin. Saya sudah mencoba menginstal docker tetapi gagal dengan yang berikut: docker fail

Jadi itu akan muncul, bahwa untuk pratinjau pertama itu saat ini tidak bekerja. Namun karena banyak orang berspekulasi, itu mungkin bekerja di masa depan.


12
2018-04-07 10:29



Keren - terima kasih sudah mencoba! - Hawkeye
Ide bagus untuk benar-benar mencoba ini. Satu hal: Bisakah Anda menambahkan teks screenshot sebagai teks aktual (terminal Ubuntu mendukung copy & paste). Teks "Nyata" memiliki banyak keuntungan (lebih mudah dibaca, mendukung pembaca layar, dapat dirayapi oleh mesin telusur) - sleske
Beberapa pembaruan: Saya telah berhasil memasang docker di mesin saya yang menjalankan pembaruan ulang tahun terakhir. Tetapi melakukan suatu docker ps gagal dengan: Get http:///var/run/docker.sock/v1.18/containers/json: dial unix /var/run/docker.sock: setsockopt: invalid argument. Are you trying to connect to a TLS-enabled daemon without TLS? - kumar_harsh
Sepertinya ini berfungsi sekarang: tutorials.ubuntu.com/tutorial/… - Nick Sweeting


Tidak, ini tidak mungkin.

Docker membutuhkan banyak hal untuk menjalankan kontainer:

  • chroot
  • Namespaces untuk:
    • PID
    • Pengguna
    • Jaringan
    • Mount
    • UTS
    • IPC

Ini semua adalah fitur-fitur kernel yang diimplementasikan di Linux. Sayangnya, kebanyakan dari mereka tidak memiliki fitur serupa di Windows untuk digunakan sebagai pengganti (atau dalam Subsistem Linux yang diimplementasikan Microsoft di kernel Windows). Semua ini perlu disediakan oleh OS.


11
2018-04-04 10:21



Sebenarnya, Windows memiliki ruang nama untuk Pengguna, Dudukan dan IPC. Ruangnama pengguna diperlukan untuk Active Directory, mount namespace dan ruangnama IPC diperlukan untuk operasi multi-pengguna. Pada dasarnya, kernel Object Manager di Windows selalu memiliki ruang nama, dari rilis Windows NT pertama, jadi tidak aneh. - MSalters
Dan dengan Layanan Desktop Jarak Jauh, objek Sesi aktif menggunakan ruang nama ini untuk menyediakan operasi bersamaan. Itu tidak berarti Anda memiliki semua infrastruktur yang dibutuhkan, tetapi sebagian besar ada di sana. Seperti untuk chroot, sadari bahwa lingkungan Ubuntu sudah memiliki akar yang berbeda dari yang Win32. - MSalters
Sebenarnya, saya pikir ini terlalu dini untuk menjawab ini dengan cara baik. Seperti yang dijelaskan dalam komentar oleh Scott Hanselman, Windows 10 kernel sekarang menerima syscalls Linux. Jadi pertanyaannya adalah apakah syscall yang dibutuhkan Docker (untuk chroot dan namespaces) diimplementasikan atau tidak. Walau jawabannya "tidak", tidak ada informasi pasti, sejauh yang saya tahu. - sleske
@sleske benar, pertanyaan ini tidak dapat dijawab pada saat ini, dan mengatakan "tidak tidak bisa" tanpa indikasi nyata apa yang dilakukan para devs yang bekerja di ruang linux di janda sangat sombong. - Ryan
Saya tidak cukup tahu untuk menyatakan dengan keyakinan bahwa jawaban ini benar-benar salah, tetapi cara itu diungkapkan membuat saya sedikit skeptis terhadap validitasnya. Secara khusus menyatakan "Bash adalah program ruang pengguna yang sederhana dan tidak dapat menyediakan semua ini" dan mengacu pada Window Subsystem untuk Linux sebagai "fitur Bash baru" membuatnya terdengar seperti jawaban ini didasarkan pada asumsi yang benar-benar salah bahwa semua Microsoft melakukan adalah port bash ke Windows. Bukan itu yang terjadi. Mereka mengembangkan seluruh antarmuka kernel Linux yang berjalan di atas kernel Windows: msdn.microsoft.com/en-us/commandline/wsl/about - Ajedi32


Mulai dari Pembaruan Pembuat (dirilis secara publik pada 13 Juni 2017) Anda dapat menjalankan Windows asli yang dapat dieksekusi langsung di WSL. Ini berarti jika Anda sudah menginstalnya Docker untuk Windows Anda cukup memanggilnya docker binari yang diinstal di bawah C:\Program Files. Karena mereka berakhir .exe pilihan termudah adalah membuat alias. Sesuatu seperti yang berikut di Anda .bashrc harus berfungsi:

DOCKER_BIN='/mnt/c/Program Files/Docker/Docker/resources/bin'
for f in "$DOCKER_BIN"/*; do
  alias "$(basename "$f" | sed 's/.exe$//')"'="'"$f"'"'
done

Ini membuat alias untuk semua file dalam DOCKER_BINdirektori:

$ type docker
docker is aliased to `"/mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe"'

$ docker --version
Docker version 17.03.1-ce, build c6d412e

Satu peringatan: Anda akan mendapatkan pesan kesalahan seperti "Tidak dapat menerjemahkan direktori kerja saat ini"jika dijalankan dari direktori Linux. Hanya cd ke dalam direktori Windows (mis. /mnt/c/Users/YourUsername) dan Anda harus menjadi baik.


6
2018-06-22 06:02



Ini tampaknya tidak mengambil variabel lingkungan bash ke file YML docker-compose. Ada ide untuk itu? - Rüdiger Schulz
Itu masuk akal, karena Anda memohon Windows docker biner, dan hanya melakukannya melalui shell Linux. Saya tidak yakin apakah ada cara yang bagus untuk mencapai itu. - dimo414


Setelah Docker 1.12 dilepaskan dan klien Linux Docker terpisah, Anda harus dapat menjalankan docker klien di Windows 10 bash.

Ini mungkin tidak terdengar seperti banyak karena Anda memiliki klien Docker Windows tetapi berguna jika Anda memiliki toolchain Linux yang termasuk buruh pelabuhan untuk fungsionalitas sisi kliennya.


5
2018-04-29 09:31





Di Windows 10 Versi 1607 Build 1493.10 Anda dapat berhasil menginstalnya di Ubuntu Bash, tapi itu tidak berhasil :(

"Versi docker" sederhana akan memberi tahu Anda:

Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.2.1
Git commit (client): 7c8fca2
OS/Arch (client): linux/amd64
FATA[0000] Get http:///var/run/docker.sock/v1.18/version: dial unix /var/run/docker.sock: setsockopt: invalid argument. Are you trying to connect to a TLS-enabled daemon without TLS?

Jika Anda kemudian menjalankan "sudo docker -d" Anda mendapatkan kesalahan berikut:

FATA[0000] ERROR: You are running Linux kernel version 3.4.0+, which is unsupported for running Docker. Please upgrade your kernel to 3.8+.

Jadi ini jelas stopper dari sisi bash.

Namun demikian, Anda dapat menginstal Docker untuk Windows dan berfungsi seperti jimat, Anda jelas dapat menggunakan Server Linux dan semua yang Anda butuhkan.

> docker version
Client:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:15:28 2016
 OS/Arch:      windows/amd64

Server:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:15:28 2016
 OS/Arch:      linux/amd64

3
2017-08-12 21:38





Mulai September 2016, Tidak.

Semua penerapan Docker saat ini di Windows menggunakan virtualisasi, Docker 1.12 menggunakan hypervisor di Windows —menghilangkan keuntungan dari penampung lebih dari virtualisasi.

Docker membutuhkan lebih dari sekedar menggunakan panggilan sistem Linux.

Ini membutuhkan kelompok kontrol proses (cgroups), filesystem stackable (aufs), plus sistem berbasis Linux lain di luar kernel.

Baik cgroup maupun auf tidak ada di kernel Windows 10.

Ada implementasi Windows Server 2016 di sini: https://msdn.microsoft.com/en-gb/virtualization/windowscontainers/quick_start/quick_start_windows_server ..tapi ini hanya akan menjalankan beberapa layanan Windows, mis. IIS, dan bukan Ubuntu


2
2017-09-05 13:15





Docker saat ini tidak berfungsi di build saat ini (14316) - dengan asumsi Anda dapat menginstalnya.

root@localhost:~# docker --help
runtime: address space conflict: map(0x7ff5ddbb0000) = 0x7ff5ffd20000
fatal error: runtime: address space conflict

1
2018-04-12 20:47



Luar biasa! Tolong terus mencoba. - Hawkeye
Sepertinya ini mungkin terkait dengan bagaimana alokasi memori berfungsi di golang (yang ditulis oleh Docker): groups.google.com/forum/#!msg/golang-dev/EpUlHQXWykg/… - Timothy Meade
Milikku hanya tergantung selamanya setelah perintah. - wieczorek1990


Dari: https://blog.docker.com/2016/07/docker-for-mac-and-windows-production-ready/

Faster and more reliable – native development environment using
hypervisors built into each operating system. (No more VirtualBox!)

0
2017-08-03 12:20



Ini dilengkapi dengan fakta bahwa sekarang Anda dapat menjalankan klien docker untuk linux di bash, jadi hindari menggunakan PowerShell jika Anda tidak menggunakannya - Carlos Rafael Ramirez
Akan menarik untuk melihat apakah mereka menskalakan ini ke kawanan buruh. - Hawkeye