限制互联网访问docker集装箱?

在仍然转发端口的情况下限制对单个docker集装箱的互联网访问的最佳方式是什么?

我目前的做法是这样的:

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 

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

你可以按照这个方法:

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

我很快把这个例子放在一起,希望能让你开始:

docker network create --internal --subnet 10.1.1.0/24 no-internet

docker network create internet

docker-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实际上是不需要的,因为无论如何默认情况下docker容器共享主机networking。 只是为了让事情更清楚。

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