docker - JupyterHub产生的Jupyter Notebook容器没有外部网络访问权限

标签 docker docker-compose jupyter docker-networking jupyterhub

因此,这是我想要实现的目标:

  • 一个Jupyterhub服务器
  • 在访问并且您未登录时,它将带您到另一个Web服务器(在Django中自定义编码)
  • 该Web服务器使用OAuth验证用户
  • 然后生成一个笔记本容器。
  • 此笔记本容器必须预先填充一个 token ,该 token 由烘焙到笔记本Docker镜像中的自定义库使用,以针对服务进行身份验证。
  • 笔记本容器需要能够与Web服务器通信以进行进一步的交互,例如检索结果等。

  • 除了最后一部分,我或多或少已经实现了这一目标。我正在启动笔记本服务器,但无法访问外界。它只能访问Jupyter Hub(这就是它起作用的原因!),而不能访问其他任何内容。

    这是我与DockerSpawner有关的Jupyter Hub配置(我省略了OAuth设置,因为这些设置可以正常工作。
    # Tell JupyterHub that we want Docker Spawner to be used.
    c.JupyterHub.spawner_class = 'dockerspawner.DockerSpawner'
    
    # And what image should be used by the Docker Spawner
    c.DockerSpawner.image = 'jupyter/scipy-notebook:7a0c7325e470'
    
    # The Hub must listen on all interfaces.
    c.JupyterHub.hub_ip = '0.0.0.0'
    
    # And this should be the address of the Hub API
    c.JupyterHub.hub_connect_ip = 'jupyterhub'
    
    # Ask containers to connect to this network so that they can
    # communicate with the Hub.
    c.DockerSpawner.network_name = 'djangodockerjupyterdemo_default'
    
    # And let's not make a mess, remove user containers when done.
    c.DockerSpawner.remove = True
    
    # We need to set the Notebook Directory
    notebook_dir = '/home/jovyan/work'
    c.DockerSpawner.notebook_dir = notebook_dir
    
    # Need to tell where to mount the volumes.
    c.DockerSpawner.volumes = { 'jupyterhub-user-{username}': notebook_dir }
    

    请注意,由于项目目录的名称如此,docker-compose正在创建djangodockerjupyterdemo_default。 (我知道这不是最好的事情,但是现在我只是希望有一个最小的例子可以工作。)

    这是我的 docker 组成:
    version: "2"
    
    services:
      database:
          image: "mysql:5.6"
          volumes:
          - ./data:/var/lib/mysql
          environment:
          - MYSQL_ROOT_PASSWORD=test123
          - MYSQL_DATABASE=oauthserver
          - MYSQL_USER=oauthadmin
          - MYSQL_PASSWORD=test123
      webapp:
        image: auth_server:latest
        volumes:
          - ./:/app
        links:
          - database:database
        environment:
          - PYTHONUNBUFFERED=1
          - ENV=DEV
          - DATABASE_HOST=database
          - DATABASE_USER=oauthadmin
          - DATABASE_DBNAME=oauthserver
          - DATABASE_PASSWORD=test123
        hostname: oauthserver.ddi.in
      jupyterhub:
        image: "jupyterhub:test"
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock:rw"
          - "./jupyterhub:/srv/jupyterhub"
        environment:
          - OAUTH2_AUTHORIZE_URL=http://oauthserver.ddi.in:8000/o/authorize
          - OAUTH2_TOKEN_URL=http://oauthserver.ddi.in:8000/o/token/
        hostname: jhtest.ddi.in
        links:
          - webapp:oauthserver.ddi.in
    

    我使用https://hub.docker.com/r/defreitas/dns-proxy-server来访问JupyterHub服务器,方法是说“http://jhtest.ddi.in:8000”。

    现在,一旦容器装满,我可以确认以下内容:

  • docker exec编码到webappjupyterhub容器中,然后对Internet上某个位置的文件进行wget起作用。
  • docker exec插入生成的Jupyter笔记本容器中,而执行此操作不会。尝试从笔记本内部使用requests.get()也是一样。

  • 我如何使生成的笔记本能够访问外界?这对我的用例至关重要(我敢肯定,这是合理的期望)。

    PS:我注意到几乎没有关于使用自定义Django应用程序进行OAuth JupyterHub设置的示例。我希望公开发布我的示例,希望它可以作为Jupyter Hub文档上的资源。

    最佳答案

    您可能想在Jupyter Discourse Forum上的'JupyterHub'类别下发表一个非常简短的文章,突出显示此文章以获得更多专家的关注。

    关于docker - JupyterHub产生的Jupyter Notebook容器没有外部网络访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59871431/

    相关文章:

    docker - sonarqube的docker镜像未与mysql数据库配置一起运行

    docker - 为什么 docker-compose up 似乎不同步卷

    docker-compose - DDEV/PhpStorm - 无效的 ddev-docker-compose-full.yaml

    android - 如何在 Android 设备上安装 Jupyter notebook?

    python - ipyparallel 附加到列表的并行 for 循环

    amazon-web-services - ECS 网络主机模式和链接 = CannotCreateContainerError : Container already exists

    django - Docker:将新的 postgres 容器重新连接到现有的数据容器

    Docker overlay2 占用磁盘空间

    python - 如何修复 Jupyter Notebook pandas 错误(OSError : [WinError 193] %1 is not a valid Win32 application)

    docker - 无法在 Linux 上使用 ElasticSearch 映射 logstash