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 yesto- /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]
