Bạn có thể chạy Docker tự nhiên trên không gian người dùng bash Windows 10 (Ubuntu) mới không?


126

Tôi hiểu rằng giới hạn chính của việc chạy docker trên các HĐH khác là các thùng chứa Mạng Linux đã làm cho điều đó trở nên khả thi. (Chắc chắn cho máy Mac).

Gần đây, Microsoft đã công bố bản beta của chế độ người dùng Ubuntu linux chạy trên Windows 10. Điều này có thể chạy các tệp nhị phân được biên dịch theo định dạng ELF trên Windows (không giống như cygwin yêu cầu biên dịch.)

Câu hỏi của tôi là: Bạn có thể chạy Docker tự nhiên trên không gian người dùng bash Windows 10 (Ubuntu) mới không?


4
Đó không phải là "chỉ" một bashkhông gian người dùng. Đó là một không gian người dùng Linux thực sự, khá đầy đủ, nhưng không có X Windows tức là chỉ có văn bản. Nói "bash" truyền đạt giới hạn chỉ văn bản khá tốt ..
MSalters

Tôi đã bỏ lỡ một cái gì đó? Điều này thực sự đã được phân phối? Hiện tại tôi chỉ biết nó là hơi nước.
Michael Hampton

2
Tôi nghĩ rằng sẽ không rõ ràng cho đến khi họ phát hành điều này (AFAIK thậm chí còn chưa có sẵn cho người trong cửa sổ), tuy nhiên, đáng chú ý là Microsoft và Docker đang làm việc để đưa Docker lên Windows, được phát hành cùng với máy chủ Windows 2016
R®ry McCune

1
@ R®ryMcCune: Thú vị. Tuy nhiên, theo này Docker blog entry từ tháng 8 năm 2015, đây sẽ là một cổng cho phép Docker chạy của Windows hình ảnh trên Windows, không phải hình ảnh Linux trên Windows.
sleske

2
thực sự đó là mục đích của docker gốc Windows. Bản chất của container hóa là bạn không thể chạy các hệ thống với các nhân khác, mà không cần thêm một số ảo hóa hoặc (có thể) hệ thống con mới này mà Microsoft đang phát triển
R®ry McCune

Câu trả lời:


103

Bạn có thể sử dụng Docker Desktop cho Windows làm công cụ và Docker cho Linux làm máy khách trong WSL trên Ubuntu / Debian trên Windows. Kết nối chúng qua TCP.

Cài đặt Docker Desktop cho Windows: https://hub.docker.com/editions/community/docker-ce-desktop-windows Nếu bạn muốn sử dụng Windows Container thay vì Linux Container, cả hai loại container đều có thể được quản lý bởi máy khách docker Linux không gian người dùng bash.

Kể từ phiên bản 17.03.1-ce-win12 (12058), bạn phải kiểm tra Expose daemon trên tcp: // localhost: 2375 mà không có TLS để cho phép máy khách Docker của Linux tiếp tục liên lạc với trình nền Windows Docker bằng TCP

Thực hiện theo các bước sau:

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

hoặc là

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

Để làm cho nó vĩnh viễn:

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

Thêm các biến tương ứng vào .bashrc

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

Tất nhiên, bạn có thể cài đặt docker-compose

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

Hoặc sử dụng pip python

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

Và Bash hoàn thành. Phần tốt nhất:

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

Tôi đã thử nghiệm nó bằng phiên bản 2.1.0.1 (37199) của Docker Desktop bằng 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**

Khối lượng

Cẩn thận khi thêm khối lượng. Đường dẫn C:\dirsẽ hiển thị như /mnt/c/dirtrên WSL và như /c/dir/bởi công cụ docker. Bạn có thể khắc phục nó vĩnh viễn:

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

Bạn phải thoát và tải lại WSL sau khi thực hiện thay đổi thành wsl.conf để WSL đọc các thay đổi của bạn khi khởi chạy.

CẬP NHẬT

từ: Có gì mới cho Dòng lệnh trong Windows 10 phiên bản 1803

Ổ cắm Unix Ổ cắm Unix không được hỗ trợ trên Windows, và bây giờ chúng là! Bạn cũng có thể giao tiếp qua các ổ cắm Unix giữa Windows và WSL. Một trong những điều tuyệt vời ở đây là nó cho phép WSL chạy Linux Docker Client để tương tác với Docker Daemon chạy trên Windows.

CẬP NHẬT

Kịch bản này và việc sử dụng của Unix Sockets đã được đưa vào Pengwin pengwin-setup 's.

Trân trọng


3
Xin chào @ joel-pearson, docker có hai phần: động cơ và máy khách. Công cụ chạy trong các cửa sổ bằng cách sử dụng Docker Toolbox (dựa trên VirtualBox) hoặc Docker cho Windows (dựa trên Hyper-V) chính thức được hỗ trợ bởi nhóm docker. Công cụ Docker chưa chạy trong không gian người dùng bash. Docker client trong windows có thể được chạy trong cmd, powershell hoặc cygwin. Câu trả lời này nói gì là cách chạy ứng dụng khách docker trong không gian người dùng bash. Tại sao? Cá nhân tôi thích bash, hoàn thành công việc. Tôi đồng ý rằng câu hỏi liên quan đến động cơ docker, nhưng tôi đã tìm thấy nó khi tôi đang tìm kiếm khách hàng và nhiều người cũng làm như vậy.
Carlos Rafael Ramirez

1
Tôi vừa thử nghiệm nó và nó hoạt động với tôi trên 1.12 :) Siêu hào hứng bây giờ có thể thực hiện một số phát triển nghiêm túc trên windows.
Zach Russell

2
Đã thử hướng dẫn của bạn trong Bash trên Ubuntu trên Windows, nhận được "Không thể kết nối với trình nền Docker. Trình nền của docker có chạy trên máy chủ này không?". Bạn đang thiếu một số bước?
mở

5
Tính đến tháng 2 năm 2017, đây vẫn là cách duy nhất.
hdave

3
Sau tháng 6 năm 2017, bạn có thể chạy docker cho các tệp thực thi của windows từ bash shell . Thay vì cài đặt máy khách docker, bạn có thể sử dụng docker.exetrực tiếp để truy vấn / tương tác hệ thống con docker. Tuy nhiên, lưu ý rằng docker cho windows sẽ sử dụng các biến và cấu hình của windows.
Jaime

51

Tính đến thời điểm hiện tại (tháng 4 năm 2016), câu trả lời là:

Chúng tôi chưa biết (nhưng có lẽ là không).

Sự thật

  • Windows 10 hiện có thể chạy nhiều chương trình Linux (trong đó có vỏ Bash và các tiện ích văn bản khác nhau). Đây không phải là các cổng (tức là các phiên bản được biên dịch lại, ví dụ như trong Cygwin ), chúng là các tệp nhị phân ELF giống nhau chạy trên một hệ thống Linux điển hình. Trong trường hợp này, chúng được lấy từ Ubuntu.
  • Để thực hiện điều này, Windows 10 đã được sửa đổi để chấp nhận các cuộc gọi (hệ thống tòa nhà) của Linux và để có thể tải và chạy các tệp nhị phân ELF ( bình luận của Scott Hanselman ). Điều này có nghĩa là các tệp thực thi Linux chưa được sửa đổi có thể được chạy, chúng sẽ tải các thư viện chia sẻ chưa sửa đổi của chúng theo yêu cầu và Windows sẽ chạy chúng dưới dạng các quy trình của Windows.
  • Bất cứ khi nào một chương trình Linux như vậy muốn tương tác với kernel, nó sẽ đưa ra một cuộc gọi hệ thống (hoặc cho phép một thư viện thực hiện nó). Đây có lẽ là sự khác biệt duy nhất để chạy trên Linux: Khi chạy trên Linux, nhân Linux xử lý các cuộc gọi này; trên Windows 10, nhân Windows 10 thực hiện thay thế.

Đầu cơ

Vì vậy, câu hỏi là liệu các tòa nhà mà Docker cần (cho chroot và không gian tên, trong số những thứ khác) đã được thực hiện hay không. Câu trả lời là có khả năng là "không". Docker yêu cầu chức năng khá tinh vi (và dành riêng cho Linux) để quản lý quy trình và tài nguyên và cách ly quy trình. Mặc dù có thể sao chép tất cả những thứ này trên Windows, nhưng nó sẽ rất nhiều công việc và vì mục tiêu của tính năng Windows này dường như là chạy các chương trình không gian người dùng Linux, nên có vẻ như họ không làm hết (và giữ bí mật) .

Tuy nhiên, không có thông tin chắc chắn nào cả, theo như tôi có thể nói.

Các cổng Docker hiện có

Tất nhiên, nếu Microsoft quyết định họ muốn hỗ trợ Docker trong Windows 10, họ có thể sẽ cung cấp nó. Có một số tiền lệ để chuyển Docker sang một kernel khác:

  • Có một cổng Docker cho FreeBSD . Nó được dán nhãn "thử nghiệm", nhưng dường như hoạt động trên nguyên tắc. Nó có thể sử dụng các container Docker chưa sửa đổi từ kho Docker, có nghĩa là nó thực sự cung cấp một môi trường máy chủ giống như Linux cho các hình ảnh.
  • Có một dự án đang được tiến hành để chuyển Docker sang Windows (cụ thể là Windows Server 2016) - xem mục blog Docker này từ tháng 8 năm 2015. Tuy nhiên, không giống như cổng FreBSD ở trên, đây sẽ là một cổng cho phép Docker chạy hình ảnh Windows trên Windows, không phải hình ảnh Linux trên Windows. Cảm ơn R®ry McCune đã chỉ ra điều này.

1
Cập nhật: Hiện tại có một bài viết về chủ đề trên blog MSDN: Tổng quan về hệ thống phụ Windows cho Linux .
sleske

Tính đến hôm nay nó có thể với Hyper-V: tutorials.ubuntu.com/tutorial/...
Nick Sweeting

Tôi đánh giá thấp đơn giản vì câu trả lời được bình chọn cao hơn sẽ hữu ích hơn sau đó suy đoán về những gì có thể, nó bao gồm những gì.
James

13

Bản xem trước nội bộ đầu tiên đã được phát hành ngày hôm qua. Tôi đã cố gắng cài đặt docker nhưng không thành công như sau: docker thất bại

Vì vậy, nó sẽ xuất hiện, cho lần xem trước đầu tiên, nó hiện không hoạt động. Tuy nhiên, như nhiều người đã suy đoán, nó có thể hoạt động trong một phiên bản tương lai.


5
Ý tưởng tốt để thực sự thử điều này. Một điều: Bạn có thể vui lòng thêm văn bản của ảnh chụp màn hình dưới dạng văn bản thực tế (thiết bị đầu cuối Ubuntu hỗ trợ sao chép và dán). Văn bản "thực" có nhiều lợi thế (dễ đọc hơn, hỗ trợ trình đọc màn hình, có thể thu thập thông tin bằng các công cụ tìm kiếm)
sleske

Một số cập nhật: Tôi đã có thể cài đặt hoàn toàn docker trên máy của mình đang chạy bản cập nhật kỷ niệm cuối cùng. Nhưng làm một docker psthất bại với: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

Hình như nó hoạt động bây giờ: tutorials.ubuntu.com/tutorial/...
Nick Sweeting

13

Không, điều này là không thể.

Docker cần nhiều thứ để chạy container:

  • chroot
  • Không gian tên cho:
    • PID
    • Người dùng
    • Mạng
    • Núi
    • UTS
    • IPC

Đây là tất cả các tính năng kernel được triển khai trong Linux. Thật không may, hầu hết trong số chúng không có tính năng tương tự trong Windows để sử dụng thay thế (cũng không phải trong Hệ thống con Linux mà Microsoft triển khai trong nhân Windows). Tất cả những điều này cần được cung cấp bởi HĐH.


4
Trên thực tế, Windows không có không gian tên cho Người dùng, Gắn kết và IPC. Không gian tên người dùng được yêu cầu cho Active Directory, không gian tên mount và không gian tên IPC được yêu cầu cho hoạt động của nhiều người dùng. Về cơ bản, Trình quản lý đối tượng hạt nhân trong Windows luôn có các không gian tên, từ bản phát hành Windows NT đầu tiên, vì vậy nó không có gì lạ.
MSalters

3
Và với Dịch vụ Máy tính Từ xa, các đối tượng Phiên tích cực sử dụng các không gian tên này để cung cấp hoạt động đồng thời. Điều đó không có nghĩa là bạn có tất cả các cơ sở hạ tầng cần thiết, nhưng các phần chính ở đó. Về phần chroot, nhận ra rằng môi trường Ubuntu đã có một bản gốc khác với bản WIN32.
MSalters

6
Thật ra, tôi nghĩ còn quá sớm để trả lời theo cách này. Theo mô tả trong một nhận xét của Scott Hanselman , nhân Windows 10 hiện chấp nhận các tòa nhà của Linux. Vì vậy, câu hỏi là liệu các tòa nhà chọc trời mà Docker cần (cho chroot và không gian tên) đã được thực hiện hay chưa. Mặc dù câu trả lời có thể là "không", nhưng không có thông tin chắc chắn nào cả, theo như tôi có thể nói.
sleske

1
@sleske đã đúng, câu hỏi này hiện tại không thể trả lời được và nói "không, không thể" mà không có bất kỳ dấu hiệu thực sự nào về việc các nhà phát triển làm việc trên không gian linux trong các góa phụ là khá tự phụ.
Ryan

2
Tôi không biết đủ để khẳng định rằng câu trả lời này là hoàn toàn sai, nhưng cách nó được đặt ra khiến tôi có chút hoài nghi về tính hợp lệ của nó. Cụ thể nói rằng "Bash là một chương trình không gian người dùng đơn giản và không thể cung cấp bất kỳ thứ nào trong số này" và đề cập đến Window subsystem cho Linux là "tính năng Bash mới" cho thấy câu trả lời này dựa trên giả định hoàn toàn sai lầm mà tất cả Microsoft đã làm là cổng bash cho Windows. Đó không phải là những gì đã xảy ra. Họ đã phát triển toàn bộ giao diện kernel Linux chạy trên kernel Windows: msdn.microsoft.com/en-us/commandline/wsl/about
Ajedi32

7

Kể từ Bản cập nhật của người tạo (được phát hành công khai vào ngày 13 tháng 6 năm 2017), bạn có thể chạy Windows thực thi trực tiếp trong WSL. Điều này có nghĩa là nếu bạn đã cài đặt Docker cho Windows, bạn chỉ cần gọi các dockernhị phân được cài đặt bên dưới C:\Program Files. Vì chúng kết thúc trong .exetùy chọn dễ nhất là tạo bí danh. Một cái gì đó như sau trong của bạn .bashrcnên làm việc:

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

Điều này tạo bí danh cho tất cả các tệp trong DOCKER_BINthư mục:

$ 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

Một cảnh báo: bạn sẽ nhận được thông báo lỗi như " Không thể dịch thư mục làm việc hiện tại " nếu chạy từ thư mục Linux. Chỉ cần cdvào một thư mục Windows (ví dụ /mnt/c/Users/YourUsername) và bạn sẽ tốt.


Điều này dường như không nhận các biến môi trường bash vào các tệp YML docker-compose. Bất cứ ý tưởng cho điều đó?
Rüdiger Schulz

1
Điều đó có ý nghĩa, vì bạn đang gọi dockernhị phân Windows và chỉ cần thực hiện thông qua trình bao Linux. Tôi không chắc có cách nào tốt để thực hiện điều đó không.
dimo414

6

Khi Docker 1.12 được phát hành và máy khách Docker Linux được tách ra, bạn sẽ có thể chạy ứng dụng khách docker trong Windows 10 bash.

Điều này nghe có vẻ không giống với việc bạn có máy khách Docker Windows nhưng thật hữu ích nếu bạn có các bộ công cụ Linux bao gồm docker cho chức năng phía máy khách.


4

Trong Windows 10 Phiên bản 1607 Build 1493.10, bạn có thể cài đặt thành công trên Ubuntu Bash, nhưng nó không hoạt động :(

Một "phiên bản docker" đơn giản sẽ cho bạn biết:

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?

Nếu sau đó bạn chạy "sudo docker -d", bạn sẽ gặp lỗi sau:

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+.

Vì vậy, đây chắc chắn là một nút chặn từ phía bash.

Tuy nhiên, bạn có thể cài đặt Docker cho Windows và nó hoạt động như một cơ duyên, rõ ràng bạn có thể triển khai Máy chủ Linux và mọi thứ bạn cần.

> 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

Kể từ tháng 9 năm 2016, số

Tất cả các triển khai hiện tại của Docker trên Windows đều sử dụng ảo hóa, Docker 1.12 sử dụng một trình ảo hóa trong Windows - vì vậy sẽ loại bỏ lợi thế của việc chứa trong quá trình ảo hóa.

Docker cần nhiều hơn là chỉ sử dụng các cuộc gọi hệ thống Linux.

Nó cần các nhóm điều khiển quá trình (cgroups), một hệ thống tập tin có thể xếp chồng (aufs), cộng với các hệ thống dựa trên Linux khác bên ngoài kernel.

Cả nhóm và auf đều không có trong nhân Windows 10.

Có một triển khai Windows Server 2016 tại đây: https://msdn.microsoft.com/en-gb/virtualization/windowscontainers/quick_start/quick_start_windows_server .. nhưng điều này sẽ chỉ chạy một số dịch vụ Windows, ví dụ như IIS chứ không phải Ubuntu


2

Docker hiện không hoạt động trong bản dựng hiện tại (14316) - giả sử bạn có thể cài đặt nó.

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

Tuyệt vời! Hãy tiếp tục cố gắng.
Hawkeye

Dường như điều này có thể liên quan đến cách phân bổ bộ nhớ làm việc trong golang (mà Docker được viết bằng): groups.google.com/forum/#!msg/golang-dev/EpUlHQXWykg/...
Timothy Meade

Của tôi chỉ bị treo mãi mãi sau khi ra lệnh.
wieczorek1990

1

Từ: https://blog.docker.com/2016/07/docker-for-mac-and-windows-production- yet /

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

2
Điều này được bổ sung với thực tế là bây giờ bạn có thể chạy ứng dụng khách docker cho linux trong bash, do đó, tránh sử dụng PowerShell nếu bạn không sử dụng
Carlos Rafael Ramirez

1
Sẽ rất thú vị để xem nếu họ mở rộng quy mô này lên bầy docker.
Hawkeye
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.