在Windows上使用X11转发在Docker内部运行Omnet .SSH不起作用



无法在Windows Hostmachine上运行的容器

对于大学项目,我构建了一个包含Omnet 的Docker映像,以提供一致的开发环境。

图像使用了浮标的基础图像,并像Rogaha在他的Docker-Desktop图像中一样通过SSH进行X11转发。

该图像在Linux主机系统上的工作正常。但是在Windows和OS X上,我无法从主机计算机上的容器上进行SSH。

我认为这是由于在Windows和OS X上对Docker的实现不同。


我的问题是我不知道如何通过SSH到达运行的容器。我已经尝试了以下内容:

  • 如Microsoft文章所述,将容器网络更改为透明网络。Windows和OS X中同时出现以下错误:
docker network create -d transparent MyTransparentNetwork
Error response from daemon: legacy plugin: plugin not found
  • 在Windows运行Docker上,在VirtualBox中而不是Hyper-V
  • 明确暴露端口22:
docker run -p 52022:22 containerName
ssh -p 52022 root@ContainerIP 

dockerfile

FROM phusion/baseimage:latest
MAINTAINER Robin Finkbeiner 
LABEL Description="Docker image for Nesting Stupro University of Stuttgart containing full omnet 5.1.1"
# Install dependencies
RUN apt-get update && apt-get install -y 
    xpra
    rox-filer
    openssh-server
    pwgen
    xserver-xephyr
    xdm
    fluxbox
    sudo
    git 
    xvfb
    wget 
    build-essential 
    gcc 
    g++
    bison 
    flex 
    perl 
    qt5-default
    tcl-dev 
    tk-dev 
    libxml2-dev 
    zlib1g-dev 
    default-jre 
    doxygen 
    graphviz 
    libwebkitgtk-3.0-0 
    libqt4-opengl-dev 
    openscenegraph-plugin-osgearth 
    libosgearth-dev
    openmpi-bin
    libopenmpi-dev
# Set the env variable DEBIAN_FRONTEND to noninteractive
ENV DEBIAN_FRONTEND noninteractive
#Enabling SSH -- from phusion baseimage documentation 
RUN rm -f /etc/service/sshd/down
# Regenerate SSH host keys. baseimage-docker does not contain any, so you
# have to do that yourself. You may also comment out this instruction; the
# init system will auto-generate one during boot.
RUN /etc/my_init.d/00_regen_ssh_host_keys.sh
# Copied command from https://github.com/rogaha/docker-desktop/blob/master/Dockerfile
# Configuring xdm to allow connections from any IP address and ssh to allow X11 Forwarding. 
RUN sed -i 's/DisplayManager.requestPort/!DisplayManager.requestPort/g' /etc/X11/xdm/xdm-config
RUN sed -i '/#any host/c*' /etc/X11/xdm/Xaccess
RUN ln -s /usr/bin/Xorg 
RUN echo X11Forwarding yes >> /etc/ssh/ssh_config
# OMnet++ 5.1.1
# Create working directory
RUN mkdir -p /usr/omnetpp
WORKDIR /usr/omnetpp
# Fetch Omnet++ source
RUN wget https:******omnetpp-5.1.1-src-linux.tgz
RUN tar -xf omnetpp-5.1.1-src-linux.tgz
# Path
ENV PATH $PATH:/usr/omnetpp/omnetpp-5.1.1/bin
# Configure and compile 
RUN cd omnetpp-5.1.1 &&  
    xvfb-run ./configure &&  
    make 
# Cleanup 
RUN apt-get clean && 
    rm -rf /var/lib/apt && 
    rm /usr/omnetpp/omnetpp-5.1.1-src-linux.tgz

解决方案

首先,链接的Microsoft文章仅适用于Windows容器。本文很好地解释了Docker网络的工作方式。

为了简化说明,我绘制了一个简单的示例。简单的ssh到docker网络中。

要能够到达桥接网络中的一个容器,需要明确曝光必要的端口。

  1. 公开端口

    docker run -p 22 {$imageName}

  2. 在主机上查找端口映射

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a2ec2bd2b53b renderfehler/omnet_ide_baseimage "/sbin/my_init" 17 hours ago Up 17 hours 0.0.0.0:32773->22/tcp tender_newton

  3. SSH使用映射端口

    在容器上

    ssh -p 32772 root@0.0.0.0

最新更新