一尘不染

Docker命令中的--net = host选项实际上是做什么的?

docker

我是Docker的新手。我在docker run命令中找不到对此选项的任何清晰描述,对此有些困惑。

我们可以使用它来访问在docker容器上运行的应用程序而无需指定端口吗?例如,如果我使用-p 8080:8080docker
run命令中的选项运行通过端口8080中的docker映像部署的webapp ,我知道我将必须在Docker容器ip /
theWebAppName的8080端口上访问它。但是我真的无法想到--net=host期权的运作方式。


阅读 1787

收藏
2020-06-17

共1个答案

一尘不染

在docker安装之后,默认情况下您具有3个网络:

docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f3be8b1ef7ce        bridge              bridge              local
fbff927877c1        host                host                local
023bb5940080        none                null                local

我试图保持这种简单。因此,如果默认情况下启动容器,它将在网桥(docker0)网络内创建。

$ docker run -d jenkins
1498e581cdba        jenkins             "/bin/tini -- /usr..."   3 minutes ago       Up 3 minutes        8080/tcp, 50000/tcp   friendly_bell

在詹金斯的dockerfile中,端口808050000被暴露。这些端口在其桥接网络上为容器打开。因此,该桥接网络中的所有内容都可以访问端口8080和上的容器50000。桥接网络中的所有内容都在的私有范围内。"Subnet": "172.17.0.0/16",如果要从外部访问它们,则必须使用映射端口-p 8080:8080。这会将容器的端口映射到真实服务器(主机网络)的端口。因此,在上访问服务器8080将路由到port上的网桥8080

现在您也有了主机网络。不会将容器网络化。因此,如果您在主机网络中启动容器,它将看起来像这样(这是第一个容器):

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
1efd834949b2        jenkins             "/bin/tini -- /usr..."   6 minutes ago       Up 6 minutes                              eloquent_panini
1498e581cdba        jenkins             "/bin/tini -- /usr..."   10 minutes ago      Up 10 minutes       8080/tcp, 50000/tcp   friendly_bell

区别在于端口。您的容器现在位于主机网络中。因此,如果您8080在主机上打开端口,则将立即访问该容器。

$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT

我已经8080在防火墙中打开了端口,当我现在在端口上8080访问服务器时,我正在访问我的詹金斯。我认为此博客对于更好地理解它也很有用。

2020-06-17