docker - 限制对 docker 容器的互联网访问?

标签 docker

在转发端口的同时限制对单个 Docker 容器的 Internet 访问的最佳方法是什么?

我目前的做法是这样的:

sudo docker network create --internal --subnet 10.1.1.0/24 no-internet
sudo docker run --name gitlab -d -p 80:80 -p 822:22 --restart always gitlab/gitlab-ce
sudo docker network connect no-internet gitlab
sudo docker network disconnect bridge gitlab

问题是,如果我重新启动系统,端口将不再转发:
sudo docker ps重启前:
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                             PORTS                                              NAMES
2d2a062744ec        gitlab/gitlab-ce    "/assets/wrapper"   13 seconds ago      Up 13 seconds (health: starting)   0.0.0.0:80->80/tcp, 443/tcp, 0.0.0.0:822->22/tcp   gitlab
sudo docker ps重启后:
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
2d2a062744ec        gitlab/gitlab-ce    "/assets/wrapper"   12 minutes ago      Up 2 minutes (healthy)                       gitlab

最佳答案

因此,如果我正确理解您的情况,您希望避免将主机的网络共享到您的 gitlab 容器,以确保 gitlab 无法连接到互联网。同时您希望共享主机的网络以将容器端口绑定(bind)到您的主机系统。它不是那样工作的,但以下可能是您可以接受的解决方法:共享同一内部网络的 docker 容器可以连接到同一网络上其他容器的公开/已发布端口。

您可以遵循以下方法:

  • 在你的 gitlab 容器前运行反向代理
  • 反向代理是您的内部网络和默认桥接网络(包括主机网络)的成员
  • 这使反向代理能够绑定(bind)到主机端口并将请求转发到您的 gitlab 容器,而 gitlab 仍然无法访问互联网

  • 我很快把这个例子放在一起,希望能让你开始:
    docker network create --internal --subnet 10.1.1.0/24 no-internetdocker network create internetdocker-compose.yml :
    version: '2'
    
    services:
      whoami:
        image: jwilder/whoami
        container_name: whoami
        networks:
          - no-internet
    
      proxy:
        image: nginx:1.13-alpine 
        container_name: proxy
        networks:
          - internet
          - no-internet
        volumes:
          - ./vhost.conf:/etc/nginx/conf.d/default.conf
        ports:
          - "80:80"
    
    networks:
      internet:
        external:
          name: internet
      no-internet:
        external:
          name: no-internet
    
    vhost.conf :
    upstream whoami {
        server whoami:8000;
    }
    
    server {
        server_name localhost;
        listen 80;
        location / {
            proxy_pass http://whoami;
        }
    }
    

    请注意上面提到的internet network 实际上是不需要的,因为 docker 容器默认共享主机网络。它只是为了让事情更清楚。

    在上面描述的示例中,打开 http://localhost/您将看到 whoami 的响应容器,whoami但是容器本身无法连接到互联网。

    关于docker - 限制对 docker 容器的互联网访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47001200/

    相关文章:

    node.js - 使用 docker compose 将 nodejs 应用程序连接到 localstack s3

    docker - 无法停止正在运行的 docker 容器

    node.js - 在子域中托管多个 Node app.js

    python - ModuleNotFoundError : No moudle name <name> in docker python

    docker - docker :无法提交构建的 docker 镜像

    docker - CentOS 7 Docker 镜像和语言环境编译

    spring-boot - 如何修复ZuulException:转发错误

    r - 在 Dockerfile 中添加用于从 Github 安装的 R 包

    docker - 无法在 Docker 中将 nodetool 命令和 cqlsh 运行到 Scylla

    node.js - 为什么docker-compose env_file不起作用,而环境却起作用?