Debian host - ubuntu docker:
# Allow x11 forwarding
xhosts +
docker run --rm=true --name="container_name" -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix -it image_name /bin/bash
# This is the most important part from the command:
# -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix
Run GUI apps on docker without xserver installed on host
We have three layers: A -> My desktop PC**B -> Host server(runs docker) C -> docker container that runs on BHow to connect to C and run a GUI app from A? Without having installed xserver on B** (no -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix
options given to the docker run command). I did it this way:
- Create a docker image with ssh running on it: Here
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE in users profile
RUN echo export VISIBLE=now >> /etc/profile
EXPOSE 22
CMD [/usr/sbin/sshd, -D]
Build the image: docker build -t ubuntu_sshd .
Run the container: docker run -d -P --name test_sshd ubuntu_sshd
Get port of the docker container: docker port test_sshd 22
Now connect to it using ssh:
ssh root@ip -p port
# The password is ``screencast``.
root@f38c87f2a42d:/#Enable X11Forwarding : Add
X11Forwarding yes
to/etc/ssh/sshd_config
Disable X11UseLocalhost : Add X11UseLocalhost no to /etc/ssh/sshd_config
Reload ssh config: /etc/init.d/ssh reload
Exit from the ssh session
All those commands were made from the B machine(from 5 - 8 were run on the docker container)
Now go to your desktop machine A and connect via ssh on the docker machine(also enable x forwarding on your destktop PC), using the ip of B and the port you got from the command at step 4:
# Allow xserver forward(allow clients to connect to your x server)
$ xhost +
# Connect via ssh and forward the xserver `-X`
$ ssh -X root@B_host_ip -p docker_port
# The password is ``screencast``.
root@f38c87f2a42d:/# apt-get install x11-apps -y
root@f38c87f2a42d:/# xeyes
# Magic happens!!!
Debian:
# Debian with sshd
FROM debian
RUN apt-get update
RUN apt-get install -y openssh-server
RUN echo 'root:password' | chpasswd
RUN mkdir -p /var/run/sshd && sed -i s/UsePrivilegeSeparation.*//g /etc/ssh/sshd_config \
&& sed -i 's/PermitRootLogin without-password//' /etc/ssh/sshd_config \
&& touch /root/.Xauthority \
&& true
RUN sed -i 's/PermitRootLogin .*/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN echo X11UseLocalhost no >> /etc/ssh/sshd_config
RUN echo PermitRootLogin yes >> /etc/ssh/sshd_config
RUN echo UsePrivilegeSeparation no >> /etc/ssh/sshd_config
EXPOSE 22
CMD [/usr/sbin/sshd, -D]