DatawhaleTL24 | Docker Task04:网络

16 篇文章 0 订阅
16 篇文章 1 订阅


Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。

1. Docker 基础网络介绍

1.1 外部访问容器

当使用 -P 标记时,Docker随机映射 一个端口到内部容器开放的网络端口。

使用 docker container ls 可以看到,本地主机的 49154 被映射到了容器的 80 端口。此时访问本机的 49154 端口(本机访问http://localhost:49154)即可访问容器内 nginx 默认页面。
在这里插入图片描述nginx访问之后,可以通过 docker logs continerID 查看访问日志:
在这里插入图片描述-p 则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有:

  • ip:hostPort:containerPort
  • ip::containerPort
  • hostPort:containerPort

示例如下:
在这里插入图片描述访问:http://localhost:4172
在这里插入图片描述查看日志:
在这里插入图片描述

1.1.1 映射所有端口地址

使用 hostPort:containerPort 格式本地的 80 端口映射到容器的 80 端口,可以执行:

docker run -d -p 80:80 nginx:alpine

此时默认会绑定本地所有接口上的所有地址。访问:http://localhost 即可看到 nginx 页面。

1.1.2 映射到指定地址的指定端口

可以使用 ip:hostPort:containerPort 格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1

docker run -d -p 127.0.0.1:80:80 nginx:alpine

1.1.3 映射到指定地址的任意端口

使用 ip::containerPort 绑定 localhost 的任意端口到容器的 80 端口,本地主机会 自动分配 一个端口。

docker run -d -p 127.0.0.1::80 nginx:alpine

在这里插入图片描述

还可以使用 udp 标记来指定 udp 端口

docker run -d -p 127.0.0.1:80:80/udp nginx:alpine

在这里插入图片描述

1.1.4 查看映射端口配置

使用 docker port containerID portID 来查看当前映射的端口配置,也可以查看到绑定的地址

docker port 1aae 80
127.0.0.1:12500

在这里插入图片描述

注意:

  • 容器有自己的内部网络和 ip 地址(使用 docker inspect 查看,Docker 还可以有一个可变的网络配置。)
  • -p 标记可以多次使用来绑定多个端口

例如

$ docker run -d \
    -p 80:80 \
    -p 443:443 \
    nginx:alpine

在这里插入图片描述

1.2 容器互联

如果你之前有 Docker 使用经验,你可能已经习惯了使用 --link 参数来进行容器互联。

然而,随着 Docker 网络的完善,这种方式已不是最优策略,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 --link 参数。

1.2.1 新建网络

首先,我们来新建一个 Docker 网络:

docker network create -d bridge dnet

-d 参数用来指定 Docker 网络类型,有 bridgeoverlay 两种,其中 overlay 网络类型用于 Swarm mode,这里我们先忽略此概念。

1.2.2 连接容器

运行一个容器并连接到新建的 dnet 网络:

docker run -it --rm --name busybox1 --network dnet busybox sh

打开新的终端,再运行一个容器并加入到 dnet 网络:

docker run -it --rm --name busybox2 --network dnet busybox sh

再打开一个新的终端查看容器信息:
在这里插入图片描述
下面通过 ping 来证明 busybox1 容器和 busybox2 容器建立了互联关系。

busybox1 容器输入以下命令:

/ # ping busybox2

截图如下:
ping busybox2ping 来测试连接 busybox2 容器,它会解析成 172.18.0.3
同理,在 busybox2 容器执行 ping busybox1 容器,也可以成功连接。
在这里插入图片描述这就证明,busybox1 容器和 busybox2 容器建立了互联关系。可以看到,这种 Docker 网络构建的方式非常简单。

ps:
如果你有多个容器之间需要互相连接,推荐使用 Docker Compose

1.2.3 配置 DNS

如何自定义配置容器的主机名和 DNS 呢?秘诀就是 Docker 利用虚拟文件来挂载容器的 3 个相关配置文件。

容器 中使用 mount 命令可以看到挂载信息:

未找到相应文件和路径,此处暂时略过

2. 高级网络配置

Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。

同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。

当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
docker net

2.1 快速配置指南

Docker 网络相关命令列表:
部分命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效。

  • -b BRIDGE 或 --bridge=BRIDGE 指定容器挂载的网桥
  • –bip=CIDR 定制 docker0 的掩码
  • -H SOCKET… 或 --host=SOCKET… Docker 服务端接收命令的通道
  • –icc=true|false 是否支持容器之间进行通信
  • –ip-forward=true|false 请看下文容器之间的通信
  • –iptables=true|false 是否允许 Docker 添加 iptables 规则
  • –mtu=BYTES 容器网络中的 MTU

2.2 容器访问控制

容器的访问控制,主要通过 Linux 上的 iptables 防火墙来进行管理和实现。iptablesLinux 上默认的防火墙软件,在大部分发行版中都自带。

2.2.1 容器访问外部网络

容器要想访问外部网络,需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。

sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

如果为 0,说明没有开启转发,则需要手动打开。

sysctl -w net.ipv4.ip_forward = 1

如果在启动 Docker 服务的时候设定 --ip-forward=true , Docker 就会自动设定系统的 ip_forward 参数为 1

2.2.2 容器之间访问

容器之间相互访问,需要两方面的支持。

  • 容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到 docker0 网桥上。
  • 本地系统的防火墙软件 -- iptables 是否允许通过

2.2.3 访问所有端口

当启动 Docker 服务(即 dockerd )的时候,默认会添加一条转发策略到本地主机 iptablesFORWARD 链上。策略为通过( ACCEPT )还是禁止( DROP )取决于配置 --icc=true (缺省值)还是 --icc=false 。当然,如果手动指定 --iptables=false 则不会添加 iptables 规则。

可见,默认情况下,不同容器之间是允许网络互通的。如果为了安全考虑,可以在 /etc/docker/daemon.json ( WSL2 : ~/.docker/.daemon.json) 文件中配置 {"icc": false} 来禁止它。

2.2.4 访问指定端口

通过 -icc=false 关闭网络访问后,还可以通过 --link=CONTAINER_NAME:ALIAS 选项来访问容器的开放端口。

例如,在启动 Docker 服务时,可以同时使用 icc=false --iptables=true 参数来关闭允许相互的网络访问,并让 Docker 可以修改系统中的 iptables 规则。

此时,系统中的 iptables 规则可能是类似

下边省略的太多了,进行不下去了

2.3 映射容器端口到宿主主机的实现

2.3.1 容器访问外部实现

2.3.2 外部访问容器实现

2.3.3 访问所有端口

2.3.4 访问指定端口

2.4 自定义网桥

2.4.1 容器访问外部实现

2.4.2 外部访问容器实现

2.4.3 访问所有端口

2.4.4 访问指定端口

2.5 工具和示例

2.4.1 容器访问外部实现

2.4.2 外部访问容器实现

2.4.3 访问所有端口

2.4.4 访问指定端口

2.6 编辑网络配置文件

2.7 实例:创建一个点到点连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值