Task 4 Docker网络

一、Docker基础网络介绍

1、外部访问容器

想要使容器外访问容器中的网络应用,可以添加-P或-p参数来完成端口映射

-P标记时,随机映射一个端口到容器开放的网络端口

-p标记时,则指定映射端口,且一个指定端口只能绑定一个容器,支持的格式:ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

其中,使用hostPort:containerPort格式,则时绑定本地该端口所有接口上的所有地址。

使用ip:hostPort:containerPort 格式,将映射到指定地址的指定端口。

使用ip:hostPort:containerPort 格式,将映射到指定地址的任意端口。

默认绑定为tcp端口,若要指定udp端口,可以使用/udp 标记,例如127.0.0.1:80:80/udp

查看端口映射情况可以使用 docker container ls -l ,如下所示表示本地主机49153映射到容器80端口

查看当前映射端口配置使用docker port,若要看指定端口,则docker port 容器名 端口号

2、容器互联

第一步 新建docker 网络,-d指定网络类型

docker network create -d bridge my-net

第二部 运行容器并连接到刚才新建的网络中【注意:运行不同容器连接到网络时,要使用不同终端】

 docker run -it --rm --name deng2 --network my-net busybox sh

新建了两个容器后查看,并且可以在不同容器中使用ping来测试连接:

3、配置DNS

Docker利用虚拟文件来挂载容器的 3个相关配置文件,在容器中使用mount可以看挂在信息。

/etc/resolv.conf是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名,也可以在/etc/docker/daemon.json中进行所有容器的配置。

在docker run命令启动容器时也可以使用-h HOSTNAME或者--hostname=HOSTNAME设定容器的主机名,对应的会被写到容器内的/etc/hostname 和 /etc/hosts。--dns=IP_ADDRESS添加 DNS 服务器到容器的/etc/resolv.conf中。--dns-search=DOMAIN设定容器的搜索域。

二、Dokcer的网络模式

通过docker network ls查看网络,默认会创建三种默认。其中my-net是自己创建的。

各网络模式的含义【具体介绍参考https://juejin.cn/post/6868086876751085581】:

三、高级网络配置

一些快速命令,其中有些命令选项只有在 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个命令选项既可以在启动服务时指定,也可以在启动容器时指定。在 Docker服务启动的时候指定则会成为默认值,后面执行 docker run 时可以覆盖设置的默认值。

  • --dns=IP_ADDRESS... 使用指定的DNS服务器
  • --dns-search=DOMAIN... 指定DNS搜索域

最后这些选项只有在 docker run 执行时使用,因为它是针对容器的特性内容。

  • -h HOSTNAME 或 --hostname=HOSTNAME 配置容器主机名
  • --link=CONTAINER_NAME:ALIAS 添加到另一个容器的连接
  • --net=bridge|none|container:NAME_or_ID|host 配置容器的桥接模式
  • -p SPEC 或 --publish=SPEC` 映射容器端口到宿主主机
  • -P or --publish-all=true|false 映射容器所有端口到宿主主机

1、容器访问控制

通过iptables防火墙进行管理与实现。

1.1 容器访问外部网络

需要本地转发支持实现外部网络的访问,通过以下命令检查转发是否打开,如果为0则需要手动打开

#检查命令
sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
#手动打开命令
sysctl -w net.ipv4.ip_forward=1

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

 

1.2 容器之间访问

实现容器之间互相访问,要满足以下两点支持。

  • 容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到 docker0 网桥上。
  • 本地系统的防火墙软件 -- iptables 是否允许通过。
  • 默认情况下,不同容器之间是允许网络互通的。如果为了安全考虑,可以在 /etc/docker/daemon.json 文件中配置 {"icc": false} 来禁止它。

1.3 访问端口

关闭网络访问后,在启动容器时可以使用 --link=CONTAINER_NAME:ALIAS 选项来访问容器的开放端口。之后在iptable中为两个容器添加一条 ACCEPT 规则,允许相互访问开放的端口。

2 端口映射

默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。

使用以下命令查看主机NAT规则,其中所有源地址在172.17.0.0/16网段,目标地址为其他网段(外部网络)的流量动态伪装为从系统网卡发出。MASQUERADE 跟传统 SNAT 的好处是它能动态从网卡获取地址。

$ sudo iptables -t nat -nL
...
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16       !172.17.0.0/16
...

容器访问外部网络时,原地址会被NAT成本地系统的IP地址

容器若要运行外部访问,可以在 docker run 时候通过 -p 或 -P 参数来启用。

如果希望永久绑定到某个固定的 IP 地址,可以在 Docker 配置文件 /etc/docker/daemon.json 中添加如下内容。

{
  "ip": "固定ip"
}

3 自定义网桥

在启动 Docker 服务的时候,使用 -b BRIDGE--bridge=BRIDGE 来指定使用的网桥。

如果服务已经运行,那需要先停止服务,并删除旧的网桥。

$ sudo systemctl stop docker
$ sudo ip link set dev docker0 down
$ sudo brctl delbr docker0

然后创建一个网桥 bridge0

$ sudo brctl addbr bridge0
$ sudo ip addr add 192.168.5.1/24 dev bridge0
$ sudo ip link set dev bridge0 up

查看确认网桥创建并启动。

在 Docker 配置文件 /etc/docker/daemon.json 中添加如下内容,即可将 Docker 默认桥接到创建的网桥上。

{
  "bridge": "bridge0",
}

启动 Docker 服务。

新建一个容器,可以看到它已经桥接到了 bridge0 上。

可以继续用 brctl show 命令查看桥接的信息。另外,在容器中可以使用 ip addr 和 ip route 命令来查看 IP 地址配置和路由信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值