Bisakah Anda menjalankan Docker secara native di bash userspace Windows 10 (Ubuntu) yang baru?

126

Pemahaman saya adalah bahwa batasan utama menjalankan buruh pelabuhan pada OS lain adalah wadah Jaringan Linux yang memungkinkan. (Pasti untuk Mac).

Baru-baru ini Microsoft mengumumkan versi beta dari mode pengguna linux Ubuntu yang berjalan secara native di Windows 10. Ini dapat menjalankan binari yang dikompilasi dalam format ELF pada Windows (tidak seperti cygwin yang membutuhkan kompilasi.)

Pertanyaan saya adalah: Dapatkah Anda menjalankan Docker secara native di bash userspace Windows 10 (Ubuntu) yang baru?

Hawkeye
sumber
4
Ini bukan "hanya" ruang bashpengguna. 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
2
Saya pikir itu tidak akan jelas sampai mereka merilis ini (AFAIK bahkan belum tersedia untuk windows insiders belum) namun perlu dicatat bahwa Microsoft dan Docker sedang bekerja untuk membawa Docker ke Windows secara native, yang akan dirilis bersama Windows server 2016
Rоry McCune
1
@ RоryMcCune: Menarik. Namun, menurut ini Docker blog entri dari Agustus 2015, ini akan menjadi pelabuhan yang memungkinkan Docker untuk menjalankan Windows gambar pada Windows, bukan gambar Linux pada Windows.
sleske
2
memang itulah tujuan dari buruh pelabuhan asli Windows. Sifat containerisation adalah bahwa Anda tidak dapat menjalankan sistem dengan kernel lain, tanpa menambahkan beberapa virtualisasi atau (mungkin) subsistem baru yang sedang dikembangkan Microsoft ini
Rоry McCune

Jawaban:

103

Anda dapat menggunakan Docker Desktop untuk Windows sebagai mesin dan Docker untuk Linux sebagai klien di WSL di Ubuntu / Debian di Windows. Hubungkan mereka melalui TCP.

Instal Docker Desktop untuk Windows: https://hub.docker.com/editions/community/docker-ce-desktop-windows Jika Anda ingin menggunakan Windows Containers dan bukan Linux Containers, kedua jenis container dapat dikelola oleh klien docker Linux di bash userspace.

Sejak versi 17.03.1-ce-win12 (12058) Anda harus memeriksa Expose daemon di tcp: // localhost: 2375 tanpa TLS untuk memungkinkan klien Linux Docker untuk terus berkomunikasi dengan daemon Windows Docker oleh TCP

Ikuti langkah ini:

cd
wget https://download.docker.com/linux/static/stable/`uname -m`/docker-19.03.1.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 buruh pelabuhan

sudo -i
curl -L https://github.com/docker/compose/releases/download/1.24.1/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 selesai Bash. 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 sudah mengujinya menggunakan versi Docker Desktop versi 2.1.0.1 (37199) menggunakan Hyper-V:

$ docker version
Client: Docker Engine - Community
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.5
 Git commit:        74b1e89e8a
 Built:             Thu Jul 25 21:17:37 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.1
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       74b1e89
  Built:            Thu Jul 25 21:17:52 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
Look both client and server say **OS/Arch: linux/amd64**

Volume

Hati-hati saat menambahkan volume. Path C:\dirakan terlihat seperti /mnt/c/dirpada WSL dan seperti /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 memuat ulang WSL setelah melakukan perubahan ke wsl.conf sehingga WSL membaca perubahan Anda saat peluncuran.

MEMPERBARUI

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

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

MEMPERBARUI

Script ini dan penggunaan Unix Socket termasuk dalam Pengwin pengwin-pengaturan 's.

Salam

Carlos Rafael Ramirez
sumber
3
Halo @ joel-pearson, buruh pelabuhan memiliki dua bagian: mesin dan klien. Mesin dijalankan di windows menggunakan Docker Toolbox (berbasis VirtualBox) atau Docker untuk Windows (berbasis Hyper-V) keduanya secara resmi didukung oleh tim buruh pelabuhan. Mesin Docker belum berjalan di ruang pengguna bash. Docker client 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 suka bash, penyelesaiannya berhasil. Saya setuju bahwa pertanyaannya adalah mengenai mesin docker, tetapi saya menemukannya ketika saya sedang mencari klien, dan banyak orang melakukan hal yang sama.
Carlos Rafael Ramirez
1
Saya baru saja mengujinya dan berfungsi untuk saya di 1.12 :) Super bersemangat untuk sekarang dapat melakukan beberapa pengembangan serius pada windows.
Zach Russell
2
Mencoba instruksi Anda di Bash pada Ubuntu di Windows, dapatkan "Tidak dapat terhubung ke daemon Docker. Apakah daemon docker berjalan di host ini?". Apakah Anda melewatkan beberapa langkah?
mpen
5
Hingga Februari 2017, ini masih satu-satunya cara.
hdave
3
Setelah Juni 2017, Anda dapat menjalankan docker for windows executable dari bash shell . Alih-alih menginstal klien buruh pelabuhan Anda dapat menggunakan docker.exelangsung untuk permintaan / interaksi subsistem buruh pelabuhan. Namun, perhatikan bahwa buruh pelabuhan untuk windows akan menggunakan variabel dan konfigurasi windows.
Jaime
51

Sampai sekarang (April 2016) jawabannya adalah:

Kami belum tahu (tapi mungkin tidak).

Fakta-fakta

  • Windows 10 sekarang dapat menjalankan berbagai program Linux (di antaranya Bash shell dan berbagai utilitas teks). Ini bukan port (yaitu versi yang dikompilasi ulang, seperti misalnya di Cygwin ), mereka adalah binari ELF yang sama yang dijalankan pada sistem Linux yang khas. Dalam hal ini, mereka diambil dari Ubuntu.
  • Untuk memungkinkan ini, Windows 10 telah dimodifikasi untuk menerima panggilan Sistem Linux (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 sebagaimana diperlukan, dan Windows akan menjalankannya sebagai proses Windows.
  • Setiap kali program Linux seperti itu ingin berinteraksi dengan kernel, ia mengeluarkan panggilan sistem (atau membiarkan perpustakaan melakukannya). Ini (mungkin) satu-satunya perbedaan untuk berjalan di Linux: Ketika berjalan di Linux, kernel Linux menangani panggilan tesis; pada Windows 10, kernel Windows 10 yang melakukannya.

Spekulasi

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

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

Port Docker yang ada

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

  • Ada port Docker untuk FreeBSD . Ini diberi label "eksperimental", tetapi tampaknya bekerja pada prinsipnya. Itu dapat menggunakan wadah Docker yang tidak dimodifikasi dari repositori Docker, yang berarti itu benar-benar menyediakan lingkungan host seperti Linux untuk gambar.
  • Ada proyek yang sedang berlangsung untuk porting Docker ke Windows (khususnya, Windows Server 2016) - lihat entri blog Docker ini dari Agustus 2015. Namun, tidak seperti port FreBSD di atas, ini akan menjadi port yang memungkinkan Docker untuk menjalankan gambar Windows pada Windows, bukan gambar Linux di Windows. Terima kasih kepada Rоry McCune karena menunjukkan ini.
sleske
sumber
1
Pembaruan: Ada artikel tentang topik di blog MSDN sekarang: Subsistem Windows untuk Ikhtisar Linux .
sleske
Mulai hari ini dimungkinkan dengan Hyper-V: tutorials.ubuntu.com/tutorial/…
Nick Sweeting
Saya menurunkan suara hanya karena jawaban yang lebih tinggi lebih bermanfaat daripada spekulasi tentang apa yang mungkin, itu mencakup apa.
James
13

Pratinjau orang dalam pertama dirilis kemarin. Saya sudah mencoba memasang buruh pelabuhan tetapi gagal dengan yang berikut ini: buruh pelabuhan gagal

Maka akan muncul, bahwa untuk pratinjau pertama itu tidak berfungsi. Namun karena banyak orang berspekulasi, ini mungkin berhasil dalam rilis mendatang.

CodedBeard
sumber
5
Ide bagus untuk benar-benar mencoba ini. Satu hal: Bisakah Anda menambahkan teks tangkapan layar sebagai teks yang sebenarnya (terminal Ubuntu mendukung copy & paste). Teks "asli" memiliki banyak keunggulan (lebih mudah dibaca, mendukung pembaca layar, dapat dijelajahi oleh mesin pencari)
sleske
Beberapa pembaruan: Saya dapat menginstal sepenuhnya buruh pelabuhan di mesin saya yang menjalankan pembaruan hari jadi terakhir. Tetapi melakukan docker psgagal 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?
kumarharsh
Sepertinya itu berfungsi sekarang: tutorials.ubuntu.com/tutorial/…
Nick Sweeting
13

Tidak, ini tidak mungkin.

Docker membutuhkan banyak hal untuk menjalankan kontainer:

  • chroot
  • Ruang nama untuk:
    • PID
    • Pengguna
    • Jaringan
    • Gunung
    • UTS
    • IPC

Ini semua adalah 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 oleh Microsoft dalam kernel Windows). Semua ini perlu disediakan oleh OS.

Florin Asăvoaie
sumber
4
Sebenarnya, Windows memang memiliki ruang nama untuk Pengguna, Mounts dan IPC. Ruang nama pengguna diperlukan untuk Active Directory, ruang nama mount dan ruang nama IPC diperlukan untuk operasi multi-pengguna. Pada dasarnya, Object Manager kernel di Windows selalu memiliki ruang nama, dari rilis Windows NT pertama, jadi itu tidak aneh.
MSalters
3
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 diperlukan, tetapi ada bagian-bagian utama di sana. Adapun chroot, sadarilah bahwa lingkungan Ubuntu sudah memiliki root yang berbeda dari yang WIN32.
MSalters
6
Sebenarnya, saya pikir terlalu dini untuk menjawab ini. Seperti dijelaskan dalam komentar oleh Scott Hanselman , kernel Windows 10 sekarang menerima syscalls Linux. Jadi pertanyaannya adalah apakah syscall yang dibutuhkan Docker (untuk chroot dan namespaces) diimplementasikan atau tidak. Sementara jawabannya mungkin "tidak", tidak ada informasi pasti, sejauh yang saya tahu.
sleske
1
@sleske benar, pertanyaan ini tidak dapat dijawab saat ini, dan mengatakan "tidak bisa" tanpa indikasi nyata tentang apa yang para dev yang bekerja di ruang linux di janda-janda cukup sombong.
Ryan
2
Saya tidak cukup tahu untuk menyatakan dengan yakin bahwa jawaban ini benar-benar salah, tetapi cara pengungkapannya membuat saya agak skeptis dengan validitasnya. Secara khusus menyatakan "Bash adalah program ruang pengguna yang sederhana dan tidak dapat menyediakan semua ini" dan merujuk ke Window Subsystem untuk Linux sebagai "fitur Bash baru" membuatnya terdengar seperti jawaban ini didasarkan pada asumsi yang sepenuhnya salah bahwa semua yang dilakukan Microsoft 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
7

Pada Pembaruan Creator (dirilis secara publik pada 13 Juni 2017) Anda dapat menjalankan Windows asli yang dapat dieksekusi langsung di WSL. Ini berarti jika Anda sudah menginstal Docker untuk Windows, Anda cukup memanggil dockerbinari yang terinstal di bawah C:\Program Files. Karena mereka berakhir pada .exepilihan termudah adalah membuat alias. Sesuatu seperti yang berikut ini di Anda .bashrcharus 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 di 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. Masuk cdke direktori Windows (mis. /mnt/c/Users/YourUsername) Dan Anda harus baik.

dimo414
sumber
Tampaknya ini tidak mengambil variabel lingkungan bash ke dalam file YML yang dibuat-dok. Ada ide untuk itu?
Rüdiger Schulz
1
Itu masuk akal, karena Anda menggunakan dockerbinari Windows , dan melakukannya melalui shell Linux. Saya tidak yakin apakah ada cara yang baik untuk mencapai itu.
dimo414
6

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

Ini mungkin kedengarannya tidak banyak mengingat Anda memiliki klien Docker Windows, tetapi itu berguna jika Anda memiliki rantai alat Linux yang menyertakan buruh pelabuhan untuk fungsionalitas sisi kliennya.

campuran
sumber
4

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

"Versi buruh pelabuhan" yang 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 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 merupakan stopper dari sisi bash.

Namun demikian, Anda dapat menginstal Docker untuk Windows dan berfungsi seperti pesona, 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
Bruno Medina
sumber
3

Per September 2016, No.

Semua implementasi Docker saat ini di Windows menggunakan virtualisasi, Docker 1.12 menggunakan hypervisor di Windows -yaitu menghapus keuntungan dari kontainerisasi daripada virtualisasi.

Docker membutuhkan lebih dari sekadar menggunakan panggilan sistem Linux.

Dibutuhkan kelompok kontrol proses (cgroups), sistem file stackable (aufs), plus sistem berbasis Linux lain di luar kernel.

Baik cgroups maupun aufs 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 .. tetapi ini hanya akan menjalankan beberapa layanan Windows, misalnya IIS, dan bukan Ubuntu

Graham
sumber
2

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
lgj
sumber
Luar biasa! Tolong terus berusaha.
Hawkeye
Sepertinya ini mungkin terkait dengan bagaimana alokasi memori berfungsi di golang (yang menjadi tempat Docker ditulis): groups.google.com/forum/#!msg/golang-dev/EpUlHQXWykg/…
Timothy Meade
Milik saya hanya menggantung selamanya setelah perintah.
wieczorek1990
1

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!)
gavenkoa
sumber
2
Ini dilengkapi dengan fakta bahwa sekarang Anda dapat menjalankan docker client untuk linux di bash, jadi hindari menggunakan PowerShell jika Anda tidak terbiasa
Carlos Rafael Ramirez
1
Akan menarik untuk melihat apakah mereka meningkatkan kerawanan buruh pelabuhan ini.
Hawkeye