<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://purl.org/rss/1.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel rdf:about="https://www.dwt.life/feed/rss/tag/%E5%AE%B9%E5%99%A8%E7%BD%91%E7%BB%9C/">
<title>dwt&#039;s life - 容器网络</title>
<link>https://www.dwt.life/tag/%E5%AE%B9%E5%99%A8%E7%BD%91%E7%BB%9C/</link>
<description></description>
<items>
<rdf:Seq>
<rdf:li resource="https://www.dwt.life/archives/6/"/>
<rdf:li resource="https://www.dwt.life/archives/4/"/>
<rdf:li resource="https://www.dwt.life/archives/3/"/>
</rdf:Seq>
</items>
</channel>
<item rdf:about="https://www.dwt.life/archives/6/">
<title>docker for windows 容器和宿主机 ip互通</title>
<link>https://www.dwt.life/archives/6/</link>
<dc:date>2021-06-28T21:27:00+08:00</dc:date>
<description>Docker官方推荐我们通过端口映射的方式把Docker容器的服务提供给宿主机或者局域网其他容器使用。一般过程是：1、Docker进程通过监听宿主机的某个端口，将该端口的数据包发送给Docker容器2、宿主机可以打开防火墙让局域网其他设备通过访问宿主机的端口进而访问docker的端口但在实际使用中并不是很方便。以下在win10环境中队DockerDocker容器通过独立IP暴露给局域网的方法进行记录。Docker的默认启动方式中，会产生一块虚拟网卡，然后容器内自行分配单独的网卡和IP。可以在宿主机上通过ipconfig命令看到这个虚拟网卡。打开一个容器，可以看到容器ip地址为自动分配的。此时通过Windows宿主机是无法Ping通容器的通过配置路由表实现ip互通暴露给宿主机的为10.0.75.1添加路由route -p add 172.17.0.0 MASK 255.255.255.0 10.0.75.2重新ping容器地址，此时就可以Ping通了现在则可以直接通过ip访问。由于docker默认采用bridge网络，每次容器启动时自动分配ip，我们可以创建自己的网络bridge1，在创建容器时指定ip，如需独立ip访问则另外增加路由。如route -p add 172.18.12.0 MASK 255.255.255.0 10.0.75.2如果删除路由：route delete 172.18.12.0</description>
</item>
<item rdf:about="https://www.dwt.life/archives/4/">
<title>docker多节点跨网段互通</title>
<link>https://www.dwt.life/archives/4/</link>
<dc:date>2021-06-28T21:12:00+08:00</dc:date>
<description>安装Docker在能访问公网且DNS正常的情况下，将下面的代码，直接复制并在docker-host-01,docker-host-02上执行，即可完成Docker安装。#卸载原有docker环境及依赖，并安装必要的包 
yum remove docker-latest-logrotate docker-logrotate docker-selinux docker-engine 
yum install -y yum-utils   device-mapper-persistent-data   lvm2 
 
#使用阿里云安装源 
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
rpm --import http://mirrors.aliyun.com/docker-ce/linux/centos/gpg 
yum makecache fast 
yum -y install docker-ce 
 
#安装完成启动Docker 
systemctl start docker 
systemctl enable docker 
systemctl status docker 下载演示镜像Docker官方在https://hub.docker.com/中提供了很多镜像，你可以根据自己的需要选择并下载，也可以自行安装Docker镜像仓库，此处我就直接下载使用docker hub中提供的centos官方镜像进行后续演示;[root@docker-host-01 ~]# docker pull centos镜像在两台Docker主机中都下载，当然如果网速慢的话，可以下载一个，然后使用docker save 打包镜像，将镜像传到第二台机器上，在用docker load导入镜像。方法很多，适合你的才是最好的。镜像下载完成，使用docker images命令查看。[root@docker-host-01 ~]# docker images 
REPOSITORY         TAG                 IMAGE ID           CREATED             SIZE 
centos             latest             470671670cac        3 days ago         237MB 通过直接路由方式实现跨主机Docker容器通信直接路由这种方式操作起来比较简单，对Docker原生网络改变最小，只需要互相指定对方的路由即可完成跨主机Docker容器之间的互通;主机配置及IP信息基础环境需要准备两台主机，系统可以是CentOS，Ubuntu;需要能支持安装Docker，本实战文档中使用的主机信息如下;主机名IP配置容器网段主机名 IP  配置  容器网段 docker-host-01  192.168.61.132  2核4G内存，50G硬盘    172.16.200.0/24 docker-host-02  192.168.61.135  2核4G内存，50G硬盘    172.16.201.0/24 调整Docker网络配置Docker安装完之后，默认会创建一个docker0的网桥，启动的Docker容器网段是172.17.0.1/16，如果不做调整，两台Docker主机上的容器，就可能出现IP地址冲突，所以我们先将默认docker0网桥的地址按【主机配置及IP信息】中规划的进行调整。在docker-host-01中创建/etc/docker/daemon.json文件，内容如下[root@docker-host-01 ~]# cat /etc/docker/daemon.json 
{ 
 &quot;bip&quot;: &quot;172.16.200.1/24&quot; 
} 重启docker服务[root@docker-host-01 ~]# systemctl restart docker完成重启后，再看docker0的IP，已经调整完成了;[root@docker-host-01 ~]# ifconfig docker0 
docker0: flags=4099&lt;UP,BROADCAST,MULTICAST&gt; mtu 1500 
      inet 172.16.200.1 netmask 255.255.255.0 broadcast 172.16.200.255 
      inet6 fe80::42:b3ff:fef9:1cc1 prefixlen 64 scopeid 0x20&lt;link&gt; 
      ether 02:42:b3:f9:1c:c1 txqueuelen 0 (Ethernet) 
      RX packets 2916 bytes 121276 (118.4 KiB) 
      RX errors 0 dropped 0 overruns 0 frame 0 
      TX packets 3115 bytes 10870567 (10.3 MiB) 
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 使用同样的方法，调整docker-host-02主机上的的docker网络。创建并进入Docker容器在docker-host-01中执行下面命令创建容器并查看IP和网关信息。[root@docker-host-01 ~]# docker run --name host-01-docker -it centos /bin/bash 
[root@6cb01044fda8 /]# yum install -y net-tools #安装工具查看ip和网关 
[root@6cb01044fda8 /]# ifconfig eth0 
eth0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt; mtu 1500 
      inet 172.16.200.2 netmask 255.255.255.0 broadcast 172.16.200.255 
      ether 02:42:ac:10:c8:02 txqueuelen 0 (Ethernet) 
      RX packets 3168 bytes 10876332 (10.3 MiB) 
      RX errors 0 dropped 0 overruns 0 frame 0 
      TX packets 2970 bytes 165058 (161.1 KiB) 
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 
[root@6cb01044fda8 /]# route -n 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface 
0.0.0.0         172.16.200.1    0.0.0.0         UG    0      0        0 eth0 
172.16.200.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0 如上，创建了一个名为host-01-docker 的容器，容器的ip是172.16.200.2/24，网关是172.16.200.1;同理在docker-host-02中也执行上述命令;[root@docker-host-02 ~]# docker run --name host-02-docker -it centos /bin/bash 
[root@f52ed4088844 /]# yum install -y net-tools 
[root@f52ed4088844 /]# ifconfig eth0 
eth0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt; mtu 1500 
      inet 172.16.201.2 netmask 255.255.255.0 broadcast 172.16.201.255 
      ether 02:42:ac:10:c9:02 txqueuelen 0 (Ethernet) 
      RX packets 3436 bytes 10890638 (10.3 MiB) 
      RX errors 0 dropped 0 overruns 0 frame 0 
      TX packets 3159 bytes 175122 (171.0 KiB) 
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 
 
[root@f52ed4088844 /]# route -n 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface 
0.0.0.0         172.16.201.1    0.0.0.0         UG    0      0        0 eth0 
172.16.201.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0 host-02-docker容器的ip是172.16.201.2/24，网关是172.16.201.1;此时我们直接在host-01-docker容器里面去ping host-02-docker容器的IP 172.16.201.2 肯定是不通的。添加互通路由原理非常简单，就是通过互相指定到达对方容器的路由;在docker-host-01主机添加到172.16.201.0/24网段的路由，指向docker-host-02的IP:192.168.61.135; 在docker-host-02主机添加到172.16.200.0/24网段的路由，指向docker-host-01的IP:192.168.61.132; docker-host-01主机上的操作如下[root@docker-host-01 ~]# route -n 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface 
0.0.0.0         192.168.61.2    0.0.0.0         UG    0      0        0 ens33 
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33 
172.16.200.0    0.0.0.0         255.255.255.0   U     0      0        0 docker0 
192.168.61.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33 
[root@docker-host-01 ~]# route add -net 172.16.201.0/24 gw 192.168.61.135 
[root@docker-host-01 ~]# route -n 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface 
0.0.0.0         192.168.61.2    0.0.0.0         UG    0      0        0 ens33 
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33 
172.16.200.0    0.0.0.0         255.255.255.0   U     0      0        0 docker0 
172.16.201.0    192.168.61.135  255.255.255.0   UG    0      0        0 ens33 
192.168.61.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33 docker-host-02主机上的操作如下[root@docker-host-02 ~]# route -n 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface 
0.0.0.0         192.168.61.2    0.0.0.0         UG    0      0        0 ens33 
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33 
172.16.201.0    0.0.0.0         255.255.255.0   U     0      0        0 docker0 
192.168.61.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33 
[root@docker-host-02 ~]# route add -net 172.16.200.0/24 gw 192.168.61.132 
[root@docker-host-02 ~]# route -n 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface 
0.0.0.0         192.168.61.2    0.0.0.0         UG    0      0        0 ens33 
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33 
172.16.200.0    192.168.61.132  255.255.255.0   UG    0      0        0 ens33 
172.16.201.0    0.0.0.0         255.255.255.0   U     0      0        0 docker0 
192.168.61.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33 验证在docker-host-01主机上的Docker容器中，ping docker-host-02中的Docker容器IP：172.16.201.2最后，需要注意一点，通过路由打通跨主机Docker容器之间的 网络，必须确保Docker宿主机是在相同的网段;通过桥接到Docker宿主机网络实现跨主机Docker容器通信将Docker容器网络直接桥接到Docker宿主机网络里面，容器通信过程中不在需要NAT的转换，优点是性能提升，容器及Docker宿主机IP统一管理;缺点是，容器及Docker宿主机IP统一管理之后带来的IP地址分配变复杂了;下面就来实战一下这种场景。主机配置及IP信息基础环境需要准备两台主机，系统可以是CentOS，Ubuntu;需要能支持安装Docker，本实战文档中使用的主机信息如下;主机名IP配置容器网段docker-host-01192.168.61.1322核4G内存，50G硬盘192.168.61.64/27docker-host-02192.168.61.1352核4G内存，50G硬盘192.168.61.96/27调整Docker宿主机网桥默认情况下docker0，是不与物理接口连接了，Docker宿主机的IP地址也是配置在物理接口上的，现在需要把物理接口添加到docker0网桥中，并把IP地址配置到docker0上;具体操作如下在docker-host-01上,创建并编辑docker配置文件,bip表示网桥接口的地址，配置为Docker宿主机 IP，fixed-cidr配置的是分配给docker容器的IP地址，这个地方需要注意，每台宿主机上不能重复，否则会IP地址冲突。[root@docker-host-01 ~]# cat /etc/docker/daemon.json 
{ 
 
 &quot;bip&quot;: &quot;192.168.61.132/24&quot;, 
 &quot;fixed-cidr&quot;: &quot;192.168.61.64/27&quot;, 
 &quot;default-gateway&quot;: &quot;192.168.61.1&quot; 
} 重启docker服务,重启完成后，192.168.61.132已经被配置到docker0上了[root@docker-host-01 ~]# systemctl restart docker 
[root@docker-host-01 ~]# ifconfig docker0 
docker0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt; mtu 1500 
      inet 192.168.61.132 netmask 255.255.255.0 broadcast 192.168.61.255 
      inet6 fe80::42:b3ff:fef9:1cc1 prefixlen 64 scopeid 0x20&lt;link&gt; 
      ether 02:42:b3:f9:1c:c1 txqueuelen 0 (Ethernet) 
      RX packets 6420 bytes 308080 (300.8 KiB) 
      RX errors 0 dropped 0 overruns 0 frame 0 
      TX packets 6373 bytes 21761327 (20.7 MiB) 
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 将物理接口添加到docker0网桥中，同时清空物理网卡上的IP ,注意必须两条命令一起执行，否则会断网。[root@docker-host-01 ~]# brctl addif docker0 ens33&amp;&amp;ifconfig ens33 0.0.0.0注意：网桥配置，如果需要永久保存，需要通过配置文件的方式配置检查网桥信息[root@docker-host-01 ~]# brctl show 
bridge name     bridge id               STP enabled     interfaces 
docker0         8000.0242b3f91cc1       no             ens33 创建并进入Docker容器在docker-host-01中创建容器并查看容器ip是192.168.61.64[root@docker-host-01 ~]# docker run -it centos /bin/bash 
[root@811f01405906 /]# ip a 
1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 
  link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
  inet 127.0.0.1/8 scope host lo 
      valid_lft forever preferred_lft forever 
12: eth0@if13: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc noqueue state UP group default 
  link/ether 02:42:c0:a8:3d:40 brd ff:ff:ff:ff:ff:ff link-netnsid 0 
  inet 192.168.61.64/24 brd 192.168.61.255 scope global eth0 
      valid_lft forever preferred_lft forever在docker-host-02中创建容器并查看容器ip是192.168.61.96[root@docker-host-02 ~]# docker run -it centos /bin/bash 
[root@7940a9efcf6a /]# ip a 
1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 
  link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
  inet 127.0.0.1/8 scope host lo 
      valid_lft forever preferred_lft forever 
4: eth0@if5: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc noqueue state UP group default 
  link/ether 02:42:c0:a8:3d:60 brd ff:ff:ff:ff:ff:ff link-netnsid 0 
  inet 192.168.61.96/24 brd 192.168.61.255 scope global eth0 
      valid_lft forever preferred_lft forever 验证在docker-node-01宿主机的容器中ping docker-node-02宿主机上的容器IP 192.168.61.96，可以ping通验证没问题。</description>
</item>
<item rdf:about="https://www.dwt.life/archives/3/">
<title>docker设置容器固定ip</title>
<link>https://www.dwt.life/archives/3/</link>
<dc:date>2021-06-28T21:00:00+08:00</dc:date>
<description>docker安装后，默认会创建三种网络类型，bridge、host和none，可通过如下命令查看sudo docker network lsbridge:网络桥接默认情况下启动、创建容器都是用该模式，所以每次docker容器重启时会按照顺序获取对应ip地址，这就导致容器每次重启，ip都发生变化none：无指定网络启动容器时，可以通过–network=none,docker容器不会分配局域网iphost：主机网络docker容器的网络会附属在主机上，两者是互通的。创建固定ip容器1、创建自定义网络类型，并且指定网段sudo docker network create --subnet=192.168.0.0/16 staticnet通过docker network ls可以查看到网络类型中多了一个staticnet2、使用新的网络类型创建并启动容器sudo docker run -it --name userserver --net staticnet --ip 192.168.0.2 ubuntu /bin/bash通过docker inspect可以查看容器ip为192.168.0.2，关闭容器并重启，发现容器ip并未发生改变如果需要设置容器请求出去的IP，使用IPtablesiptables -t nat -l POSTROUTING -o eth0 -d 0.0.0.0/0 -s 172.18.0.10 -j SNAT --to-source 103.213.245.111</description>
</item>
</rdf:RDF>