Chuyển tiếp X11 qua kết nối SSH đến máy chủ chứa?


4

Tôi muốn chạy một ứng dụng GUI được đóng gói từ một máy từ xa.

Tôi không muốn giải quyết vấn đề này bằng cách thêm máy chủ ssh vào container vì

  • Tôi đã có quyền truy cập vào máy chủ qua SSH
  • Nó thêm chi phí không cần thiết
  • Nó làm cho container không di động giữa sử dụng từ xa và cục bộ

Tôi đã có thể chạy thành công các ứng dụng GUI trên máy chủ, nhưng không phải từ trong container. Đây là những bước tôi đã thực hiện cho đến nay:

Người dẫn chương trình

  • xauth + (không lâu dài, nhưng hữu ích để loại bỏ các vấn đề có thể xảy ra)
  • docker-uservới uid 501000 trên máy chủ == docker-uservới uid 1000 trong vùng chứa thông qua tính năng không gian tên
  • .Xauthoritytập tin sao chép vào docker-userthư mục nhà

Dockerfile

  • Dựa trên núi cao
  • Cài đặt xauthvà, cho mục đích thử nghiệm,xterm
  • Tạo ra docker-uservới uid / gid thích hợp

docker-soạn

  • Biến môi trường DISPLAYchuyển tiếp trong
  • Khối lượng /home/docker-user/:/home/docker-user/:rođể cung cấp .Xauthoritycookie
  • Âm lượng /tmp/.X11-unix:/tmp/.X11-unix:rođể cung cấp quyền truy cập ổ cắm X11
  • Chạy lệnh su - docker-user -c "export DISPLAY=$DISPLAY && xterm"
    • su được sử dụng để chạy như docker-user
    • DISPLAYchuyển tiếp vào subối cảnh

Thật không may, điều này vẫn chưa đủ. Trong khi xterm trên hệ điều hành máy chủ kết nối với máy chủ X cục bộ của tôi mà không gặp sự cố, xterm trong vùng chứa nói Xt error: Can't open display: localhost:10.0.

Tôi đã xác nhận rằng "localhost: 10.0" là chính xác, localhost tồn tại trong bộ chứa /etc/hostsvà cookie và ổ cắm đang thực hiện với các quyền phù hợp.

Điều gì khác có thể có thể đi sai?

Câu trả lời:


5

Có vẻ như bạn đang làm tất cả những thứ tương tự Tôi đang làm NGOẠI TRỪ bạn đang chia sẻ .Xmasterity tại thời điểm tạo container. Điều đó có nghĩa là nếu bạn từng ssh -X vào máy của mình sau khi tạo vùng chứa thì .Xmasterity sẽ không còn hiệu lực nữa. Bạn không thể ssh -X từ một thiết bị đầu cuối khác vào cùng một máy và quay lại và sử dụng .Xmasterity, ssh -X thay đổi .Xmasterity mỗi lần cho thiết bị đầu cuối gần đây nhất. Tôi chỉ làm cho nó hoạt động bằng cách sao chép .Xmasterity mỗi khi tôi ssh -X vào máy của mình và thử và chia sẻ màn hình với hộp đựng của tôi.

lưu ý: Tôi đang chia sẻ thiết bị và id máy vì tôi đang chuyển tiếp đầu ra webcam

1. Tạo bộ chứa và báo cho xhost để cho phép chuyển tiếp từ id của bộ chứa:

sudo docker run -it -d \
    --net=host \
    --env="DISPLAY" \
    --env="QT_X11_NO_MITSHM=1" \
    --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
    --device="/dev/video0:/dev/video0" \
    --volume="/path/to/your/sharedDockerFiles:/root/sharedDockerFiles" \
    --volume="/etc/machine-id:/etc/machine-id" \
    yourdockerrepo/image:tag \
    bash
export containerId=$(docker ps -l -q)
sudo xhost +local:`sudo docker inspect --format='{{ .Config.Hostname }}' $containerId`
sudo docker start $containerId

2.Copy .Xmasterity từ máy chủ lưu trữ đến thư mục sharedDockerFiles:

sudo cp ~/.Xauthority /path/to/your/sharedDockerFiles

3. Bắt đầu và đính kèm container của bạn

4. Sao chép .Xmasterity trong thư mục dùng chung của bạn vào nhà chứa

sudo cp /root/sharedDockerFiles/.Xauthority ~/

5. (cần thiết một lần): Chỉnh sửa ngăn chứa / etc / ssh / ssh_config trong Máy chủ * để bao gồm:

   ForwardX11 yes
   X11Forwarding yes

6. Khởi động lại container của bạn và gắn lại và chạy ứng dụng GUI

7. Nếu bạn vẫn gặp sự cố, hãy đảm bảo biến $ HIỂN THỊ trong vùng chứa giống với biến của máy chủ lưu trữ

echo $DISPLAY #do this in the container
exit
echo $DISPLAY #do this in the host, should be the same as container's
#if they aren't equal, start container and:
export DISPLAY= #put the output of your host's $DISPLAY variable here

1

Sao chép .Xmasterity trong vùng chứa vào đầu phiên ssh trước khi sử dụng GUI:

sudo docker exec -i container_name bash -c 'cat > ~/.Xauthority' < ~/.Xauthority

Sau đó, bạn có thể vượt qua HIỂN THỊ nếu sử dụng 'docker exec'. Ví dụ: để mở bash mới:

sudo docker exec -it --env="DISPLAY" container_name bash

Thêm 2 nguyên nhân có thể gây ra lỗi: (ngoài câu trả lời được chấp nhận)

  • cơ bản: Bạn không có máy chủ ssh hoặc xauth trong container (đối với Ubuntu chạy 'apt install openssh-server xauth')

  • lén lút: Nếu tên máy chủ chứa của bạn khác với tên máy chủ lưu trữ (ví dụ: đặt huy hiệu qua -h trong 'docker run'), bạn sẽ gặp lỗi và bạn phải xử lý (ví dụ: đặt cùng tên máy chủ hoặc thêm cookie vào xauth)


Giải pháp này đã làm việc cho tôi. Rõ ràng nó là đủ để chỉ cần sao chép tệp .Xmasterity vào container docker mà không cần phải khởi động lại nó.
Nikolay Frick

0

Hãy bắt đầu docker với tùy chọn --net = host. Nó làm cho container để xem cùng một ngăn xếp mạng của máy chủ.

Ví dụ,

docker run --net = host --rm -ti -u myid -e HIỂN THỊ = "$ HIỂN THỊ" -v /tmp/.X11-unix:/tmp/.X11-unix

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.