在转发端口的同时限制对单个 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 容器可以连接到同一网络上其他容器的公开/已发布端口。
您可以遵循以下方法:
我很快把这个例子放在一起,希望能让你开始:
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
network 实际上是不需要的,因为 docker 容器默认共享主机网络。它只是为了让事情更清楚。在上面描述的示例中,打开
http://localhost/
您将看到 whoami
的响应容器,whoami
但是容器本身无法连接到互联网。
关于docker - 限制对 docker 容器的互联网访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47001200/