Docker核心技术之网络管理

Docker核心技术之网络管理4 1 网络管理 Docker 网络很重要 我们在上面学到的所有东西都依赖于网络才能工作 我们从两个方面来学习网络 端口映射和网络模式 为什么先学端口映射呢 在一台主机上学习网络 学习端口映射最简单 避免过多干扰 4 1 1 端口映射详解 默认情况下

大家好,我是讯享网,很高兴认识大家。

4.1网络管理

​ Docker 网络很重要,我们在上面学到的所有东西都依赖于网络才能工作。我们从两个方面来学习网络:端口映射和网络模式
​ 为什么先学端口映射呢?
在一台主机上学习网络,学习端口映射最简单,避免过多干扰。

4.1.1 端口映射详解

默认情况下,容器和宿主机之间网络是隔离的,我们可以通过端口映射的方式,将容器中的端口,映射到宿主机的某个端口上。这样我们就可以通过宿主机的ip+port的方式来访问容器里的内容

Docker的端口映射

1、随机映射 -P(大写)

2、指定映射 -p 宿主机ip:宿主机端口:容器端口

注意:
生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突,
不管哪种映射都会有所消耗,影响性能,因为涉及到映射的操作

4.1.2 随机映射实践

随机映射我们从两个方面来学习:
1、默认随机映射
2、指定主机随机映射

默认随机映射
#命令格式: docker run -d -P [镜像名称] #命令效果: #先启动一个普通的nginx镜像 $ docker run -d nginx #查看当前宿主机开放了哪些端口 $ netstat -tnulp 

讯享网

在这里插入图片描述
讯享网

讯享网#启动一个默认随机映射的nginx镜像 $ docker run -d -P nginx #查看当前宿主机开放了哪些端口 $ netstat -tnulp 

在这里插入图片描述

在这里插入图片描述

注意:
​ 宿主机的32768被映射到容器的80端口
-P 自动绑定所有对外提供服务的容器端口,映射的端口将会从没有使用的端口池中自动随机选择,
但是如果连续启动多个容器的话,则下一个容器的端口默认是当前容器占用端口号+1

在这里插入图片描述

在浏览器中访问http://192.168.110.20:32768

效果显示

在这里插入图片描述

指定主机随机映射
#命令格式 :~$ docker run -d -p [宿主机ip]::[容器端口] --name [容器名称][镜像名称] #命令效果 :~$ docker run -d -p 192.168.8.14::80 --name nginx-1 nginx #检查效果 :~$ docker ps 

4.1.3 指定映射实践

指定端口映射我们从二个方面来讲

指定端口映射

指定多端口映射

指定端口映射
讯享网#命令格式: docker run -d -p [宿主机ip]:[宿主机端口]:[容器端口] --name [容器名字][镜像名称] #注意: #如果不指定宿主机ip的话,默认使用 0.0.0.0, #命令实践: #现状我们在启动容器的时候,给容器指定一个访问的端口 1199 docker run -d -p 192.168.8.14:1199:80 --name nginx-2 nginx #查看新容器ip docker inspect --format='{ 
   {range .NetworkSettings.Networks}}{ 
   {.IPAddress}}{ 
   {end}}' 0ad3acfbfb76 #查看容器端口映射 docker ps 
多端口映射方法
#命令格式 docker run -d -p [宿主机端口1]:[容器端口1] -p [宿主机端口2]:[容器端口2] --name [容器名称][镜像名称] #开起多端口映射实践 docker run -d -p 520:443 -p 6666:80 --name nginx-3 nginx #查看容器进程 docker ps 

4.1.4 网络管理基础

docker网络命令
讯享网#查看网络命令帮助 :~$ docker network help 。。。。。。 connect Connect a container to a network #将一个容器连接到一个网络 create Create a network #创建一个网络 disconnect Disconnect a container from a network #从网络断开一个容器 inspect Display detailed information on one or more networks #在一个或多个网络上显示详细信息 ls List networks #网络列表 prune Remove all unused networks #删除所有未使用的网络 rm Remove one or more networks #删除一个或多个网络。 
经常使用的网络查看命令
#查看当前主机网络 $ docker network ls NETWORK ID NAME DRIVER SCOPE #网络id #名称 #驱动 #范围 c2dcffa83a29 bridge bridge local c4deefdaf53b host host local c6d6 none null local 
讯享网#查看bridge的网络内部信息 :~$ docker network inspect bridge [ { 
    "Name": "bridge", 。。。。。。 "Config": [ { 
    "Subnet": "172.17.0.0/16", "Gateway": "172.17.0.1" } ] }, 。。。。。。 "Containers": { 
    "1f182f7163cb194c7d49c75e46fc6dc7cbee59b55f04d74319df75b45a6f5ba0": { 
    "Name": "nginx-2", "EndpointID": "9e91f5d77b9c0ef85bb8a4f8aa2f4fbb0946ee5f5e728ba9a409b0d", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" }, "faecdcae982a658b1c1a1abbd57125ca5eae5234d3e684ce771b8aa3b6": { 
    "Name": "nginx-1", "EndpointID": "72f7a99c28838eec9e7bd79eee24c0dea28203e4fe0286fdb3ab084ac7", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" } }, ] 
回忆一下
查看容器详细信息
#命令格式: docker inspect [容器id] #命令效果: 查看容器全部信息: :~$ docker inspect 930f29ccdf8a 
查看容器端口信息
讯享网#命令格式: docker port [容器id] #命令效果: :~$ docker port 930f29ccdf8a 

4.1.5 网络模式简介

docker的常用的网络模式

bridge模式:
简单来说:就是穿马甲,打着宿主机的旗号,做自己的事情。
Docker的默认模式,它会在docker容器启动时候,自动配置好自己的网络信息,同一宿主机的所有容器都在一个网络下,彼此间可以通信。类似于我们vmware虚拟机的桥接模式。
利用宿主机的网卡进行通信,因为涉及到网络转换,所以会造成资源消耗,网络效率会低。

在这里插入图片描述

host模式:
简单来说,就是鸠占鹊巢,用着宿主机的东西,干自己的事情。容器使用宿主机的ip地址进行通信。
特点:容器和宿主机共享网络

在这里插入图片描述

container模式:
新创建的容器间使用,使用已创建的容器网络,类似一个局域网。
特点:容器和容器共享网络

在这里插入图片描述

none模式:
这种模式最纯粹,不会帮你做任何网络的配置,可以最大限度的定制化。
不提供网络服务,容器启动后无网络连接。

在这里插入图片描述

overlay模式:
容器彼此不再同一网络,而且能互相通行。

在这里插入图片描述

2.4.6 定制bridge实践一

​ 其实我们在端口映射的部分就是bridge模式的简单演示了,因为他们使用的是默认bridge网络模式,现在我们来自定义桥接网络。
这一部分我们从三个方面来演示:
​ 创建桥接网络

​ 使用自定义网络创建容器

​ 容器断开、连接网络

创建网络
#命令格式: docker network create --driver [网络类型][网络名称] #参数 create 创建一个网络 --driver 指定网络类型 #命令演示: $ docker network create --driver bridge bridge-test #查看主机网络类型: :~$ docker network ls NETWORK ID NAME DRIVER SCOPE #网络id #名称 #驱动 #范围 c2dcffa83a29 bridge bridge local c4deefdaf53b host host local c6d6 none null local d5c061bc02b1 bridge-test bridge local #查看新建网络的网络信息 :~$ docker network inspect bridge-test [ { 
    "Name": "bridge-test", 。。。。。。 "Config": [ { 
    "Subnet": "172.18.0.0/16",#ip/子网 "Gateway": "172.18.0.1"#网关 } ] }, 。。。。。。 } ] #宿主机又多出来一个网卡设备: $ ifconfig br-f Link encap:以太网 硬件地址 02:42:cb:8b:48:37 inet 地址:172.18.0.1 广播:172.18.255.255 掩码:255.255.0.0 。。。。。。 
自定义网段与网关
讯享网#自定义网段与网关 #查看关于网段和网管的相关命令 :~$ docker network create --help --gateway strings IPv4 or IPv6 Gateway for the master subnet 主子网的IPv4或IPv6网关。 --subnet strings Subnet in CIDR format that represents a network segment 表示网络段的CIDR格式的子网。 #查看刚刚创建的网络信息 :~$ docker network inspect bridge-test [ { 
    "Name": "bridge-test", 。。。 "Config": [ { 
    "Subnet": "172.18.0.0/16",#ip/子网 "Gateway": "172.18.0.1"#网关 。。。 #创建自定义网段与网关信息 :~$ docker network create --driver bridge --gateway 172.99.0.1 --subnet 172.99.0.0/16 bridge-test1 #成功返回对应的sha256码 9d02a01fa98b7abafa707cdc83084fc880d0afd091 #查看网络列表 :~$ docker network ls NETWORK ID NAME DRIVER SCOPE c2dcffa83a29 bridge bridge local f bridge-test bridge local 9d02a01fa98b bridge-test1 bridge local c4deefdaf53b host host local c6d6 none null local #查看自定义网络的网关与网络信息 :~$ docker network inspect bridge-test1 [ { 
    "Name": "bridge-test1", 。。。。。。 "Config": [ { 
    "Subnet": "172.99.0.0/16"#ip/子网 "Gateway": "172.99.0.1"#网关 } 。。。。 #查看主机网络信息 $ ifconfig br-9d02a01fa98b Link encap:以太网 硬件地址 02:42:41:18:2c:5a inet 地址:172.99.0.1 广播:172.99.255.255 掩码:255.255.0.0 UP BROADCAST MULTICAST MTU:1500 跃点数:1 接收数据包:0 错误:0 丢弃:0 过载:0 帧数:0 发送数据包:0 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:0 接收字节:0 (0.0 B) 发送字节:0 (0.0 B) 
在自定义网络中启动容器
#命令格式:  docker run --net=[网络名称] -itd --name=[容器名称][镜像名称] #使用效果: #查看创建的网络bridge-test :~$ docker network inspect bridge-test "Containers": { 
   },#容器是空的 #查看创建的网络bridge-test1 :~$ docker network inspect bridge-test1 "Containers": { 
   },#容器也是是空的 #创建启动1个使用网络为bridge-test 名为nginx--1的容器 :~$ docker run --net=bridge-test -itd --name nginx--1 nginx ff07009ba3c814d163ccffe72643abef3acda2d443dd87 ``` #查看下容器 :~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ff07009ba3c2 nginx "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 80/tcp nginx--1 #查看容器的信息 :~$ docker inspect ff07009ba3c2 #网络信息已经变成bridge-test的网段了 "Gateway": "172.18.0.1", "IPAddress": "172.18.0.2", #创建启动1个使用网络为bridge-test1 名为nginx--2的容器 :~$ docker run --net=bridge-test1 -itd --name nginx--2 nginx cc55de5710add52482d363b42dcdf6fff50f476b3024c626eb1c14da3 #查看下容器 :~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cc55de5710ad nginx "nginx -g 'daemon of…" 5 seconds ago Up 4 seconds 80/tcp nginx--2 #查看容器的信息 :~$ docker inspect cc55de5710ad #网络信息已经变成bridge-test1的网段了 "Gateway": "172.99.0.1", "IPAddress": "172.99.0.2", #查看bridge-test的网络信息 :~$ docker network inspect bridge-test #bridge-test下包含了nginx--1 "Containers": { 
     "ff07009ba3c814d163ccffe72643abef3acda2d443dd87": { 
     "Name": "nginx--1", "EndpointID": "e2e8ba3091b27b333cfdbc3afe64bd6c6300c89dc57eb75", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", #查看bridge-test1的网络信息 :~$ docker network inspect bridge-test1 #bridge-test下包含了nginx--2 "Containers": { 
     "cc55de5710add52482d363b42dcdf6fff50f476b3024c626eb1c14da3": { 
     "Name": "nginx--2", "EndpointID": "66eefc70755e94a306a7b71ea08f262ea656f7e7a2b117ee716e9de2014a35e5", "MacAddress": "02:42:ac:63:00:02", "IPv4Address": "172.99.0.2/16", ``` #注意部分 #使用默认的桥接模型创建的容器是可以直接联网的。 #使用自定义的桥接模型创建的容器不可以直接联网,但是可以通过端口映射来实现联网 
容器断开网络
讯享网#命令格式:  docker network disconnect [网络名][容器名] #命令演示: docker network disconnect bridge-test nginx1 #效果展示: #断开容器nginx--1网络bridge-test :~$ docker network disconnect bridge-test nginx--1 #查看下容器 :~$ docker ps #发现nginx-1的网络消失 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ff07009ba3c2 nginx "nginx -g 'daemon of…" 37 minutes ago Up 37 minutes nginx--1 #断开容器nginx--2网络bridge-test1 :~$ docker network disconnect bridge-test1 nginx--2 #查看下容器 :~$ docker ps #发现nginx-2的网络消失 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cc55de5710ad nginx "nginx -g 'daemon of…" 28 minutes ago Up 28 minutes nginx--2 #分别查看网络bridge-test bridge-test1的网络 :~$ docker network inspect bridge-test :~$ docker network inspect bridge-test1 #发现容器内容消失 "Containers": { 
   },#已经没有容器了 #分别查看两个容器的信息发现容器网络信息消失 :~$docker inspect nginx--1 :~$docker inspect nginx--2 
容器连接网络
#命令格式:  docker network connect [网络名][容器名] #命令演示: #将容器nginx--1连接到bridge-test1网络 :~$ docker network connect bridge-test1 nginx--1 :~$ docker ps CONTAINERID IMAGE COMMAND CREATED STATUS PORTS NAMES cc55de5710ad nginx "nginx-g'daemonof…" Aboutanhourago UpAboutanhour nginx--2 #将容器nginx--2连接到bridge-test网络 :~$ docker network connect bridge-test nginx--2 :~$ docker ps CONTAINERID IMAGE COMMAND CREATED STATUS PORTS NAMES ff07009ba3c2 nginx "nginx-g'daemonof…" Aboutanhourago UpAboutanhour 80/tcp nginx1 查看bridge-test网络是否包含容器 :~$ docker network inspect bridge-test "Containers": { 
    "cc55de5710add52482d363b42dcdf6fff50f476b3024c626eb1c14da3": { 
    "Name": "nginx--2", "EndpointID": "6eee4258bc62645fd611f292f52e8b0ea2d0262ab5c99bc097f26eed95d1f886", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", "IPv6Address": "" 查看bridge-test1网络是否包含容器 :~$ docker network inspect bridge-test1 "Containers": { 
    "ff07009ba3c814d163ccffe72643abef3acda2d443dd87": { 
    "Name": "nginx--1", "EndpointID": "0c0367fe58aed371bf582d931d5824edf7fea3fabd242c", "MacAddress": "02:42:ac:63:00:02", "IPv4Address": "172.99.0.2/16", "IPv6Address": "" 

4.1.7 定制bridge实践二

​ 之前我们创建的容器,它们的ip都是从docker0自动获取的,接下来我们自己定义一个br0网桥,然后启动的容器就用这个

网桥是什么?
他是一种设备,根据设备的物理地址来划分网段,并传输数据的,docker0就是默认的网桥。

需求:
定制docker网桥

分析
1、网桥的创建

2、docker服务使用新网桥

3、测试

知识点
1、bridge-utils软件的brctl工具可以实现创建网桥
2、
​ 配置/etc/default/docker文件
​ 编辑systemctl的配置文件使用该docker文件
​ 重载systemctl配置
​ 重启docker
3、创建容器,查看容器信息即可

实施

讯享网#1、网桥环境部署 #1.1 网桥软件部署 #ubuntu默认不自带网桥管理工具,安装网桥软件 :~$ sudo apt-get install bridge-utils -y #查看网卡 :~$ brctl show bridge name bridge id STP enabled interfaces #网卡名称 网卡id STP启用 物理接口 #1.2 创建网桥 :~$ sudo brctl addbr br0 :~$ brctl show bridge name bridge id STP enabled interfaces br0 8000.000000000000 no #给网桥设置网段 :~$ sudo ifconfig br0 192.168.99.1 netmask 255.255.255.0 :~$ ifconfig br0 Link encap:以太网 硬件地址 f2:6c:fb:c6:89:f4 inet 地址:192.168.99.1 广播:192.168.99.255 掩码:255.255.255.0 #2、docker配置网桥 #2.1 配置docker文件 :~$ sudo vim /etc/default/docker #最末尾添加 DOCKER_OPTS="-b=br0" #2.2 systemctl使用docker文件 #创建服务依赖文件 :~$ sudo mkdir -p /etc/systemd/system/docker.service.d :~$ sudo vim /etc/systemd/system/docker.service.d/Using_Environment_File.conf #内容如下: [Service] EnvironmentFile=-/etc/default/docker ExecStart= ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS #重载服务配置文件 :~$ systemctl daemon-reload #2.3 重启docker  #重启前效果 :~$ ps aux |grep docker root 32949 0.1 1.4  59632 ? Ssl 2月24 1:01 /usr/bin/dockerd -H fd:// #重启 :~$ systemctl restart docker #重启后效果 :~$ ps aux |grep docker root 45737 4.3 1.2  50572 ? Ssl 09:32 0:00 /usr/bin/dockerd -H fd:// -b=br0 #3、容器测试 #3.1 创建容器并测试 #创建默认网络的容器 :~$ docker run -itd --name nginx--3 nginx 92d4b5e434d2ba1a00426e987b113fdaa1dffa9c498eeb4 :~$ docker ps CONTAINERID IMAGE COMMAND CREATED STATUS PORTS NAMES 92d4b5e434d2 nginx "nginx -g 'daemon of…" 5secondsago Up4seconds 80/tcp nginx--3 #查看信息已经使用了br0的网卡的网络 :~$ docker inspect 92d4b5e434d2 "Gateway": "192.168.99.1", "IPAddress": "192.168.99.2", #查看下网络 :~$ docker network ls NETWORK ID NAME DRIVER SCOPE e2f5f07d1d54 bridge bridge local #查看网络下的容器 :~$ docker network inspect bridge "Name": "bridge", "Driver": "bridge", "Config": [ { 
    "Subnet": "192.168.99.0/24", "Gateway": "192.168.99.1" "Containers": { 
    "92d4b5e434d2ba1a00426e987b113fdaa1dffa9c498eeb4": { 
    "Name": "nginx--3", "EndpointID": "b5c2e1ea9dcd722b102b7f63fcd65be378da649e8f8edd492c083cfec5", "MacAddress": "02:42:c0:a8:63:02", "IPv4Address": "192.168.99.2/24", 

4.1.8 host模型实践

host模型我们知道,容器使用宿主机的ip地址进行对外提供服务,本身没有ip地址。

#命令格式: docker run --net=host -itd --name [容器名称] 镜像名称 #命令示例: #查看下网络情况 :~$ docker network ls NETWORK ID NAME DRIVER SCOPE 35e1fe4bfd90 bridge bridge local b5a84f949a9f host host local e70e4cb94db2 none null local #查看host下有哪些容器 :~$ docker network inspect host #发现是空的 "Containers": { 
   } #查看宿主机启动网络 :~$ netstat -tnulp #发现没有80端口  #根据host网络创建启动容器 :~$ docker run --net=host -itd --name nginx-1 nginx cf5f44228d7efa6271d494bc658a8073c1a3961dc0c7acab3c58796dfa925f6e :~$ docker ps #发现没有端口映射 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cf5f44228d7e nginx "nginx -g 'daemon of…" 15 minutes ago Up 15 minutes nginx-1 #查看宿主机启动网络 :~$ netstat -tnulp Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name #多出了80端口  tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN - #查看host下有哪些容器 :~$ docker network inspect host #发现网络下包含了容器 nginx-1 "Name": "host", "Containers": { 
    "cf5f44228d7efa6271d494bc658a8073c1a3961dc0c7acab3c58796dfa925f6e": { 
    "Name": "nginx-1", "EndpointID": "98f3a7d052fabd7aa3e06c5a8d95d1db1ed28ffd81f7b0344ba505f94b", #查看nginx-1这个容器的全部信息 :~$ docker inspect nginx-1 #发现网络信息为空 "Networks": { 
    "host": { 
    "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "b5a84f949a9fc7734a9e68defdee27886cb97bfdec0fb3834f", "EndpointID": "98f3a7d052fabd7aa3e06c5a8d95d1db1ed28ffd81f7b0344ba505f94b", "Gateway": "", "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "", "DriverOpts": null 

查看网络运行效果
http://192.168.110.4

此处IP为对应宿主机ip并不固定

在这里插入图片描述

host特点:
​ host模型比较适合于,一台宿主机跑一个固定的容器,比较稳定,或者一个宿主机跑多个占用不同端口的应用的场景,他的网络性能是很高的。
​ host模型启动的容器不会有任何地址,他其实是使用了宿主机的所有信息

4.1.9 none 模型实践

none网络模式,是一种自由度非常高的网络模式,我们可以最大化的自定义我们想要的网络

讯享网#命令格式: docker run --net=none -itd --name [容器名称] 镜像名称 #命令示例: #查看网络 itcast@itcast-virtual-machine:~$ docker network ls NETWORK ID NAME DRIVER SCOPE 35e1fe4bfd90 bridge bridge local b5a84f949a9f host host local e70e4cb94db2 none null local #查看网络none的信息 :~$ docker network inspect none #发现包含容器为空 "Name": "none", "Containers": { 
   }, #根据none网络创建nginx-2容器 :~$ docker run -itd --name nginx-2 --net=none nginx 31ba415ffebb527aea43b857f4c4f82daaaba0a98cef713 :~$ docker ps CONTAINERID IMAGE COMMAND CREATED STATUS PORTS NAMES 31b nginx "nginx-g'daemonof…" Aboutaminuteago UpAboutaminute nginx-2 #查看nginx-2的全部信息 :~$ docker inspect nginx-2 #发现网络信息皆为空  "Networks": { 
    "none": { 
    "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "e70e4cb94dba26daa48331dfd6060ac20f027709d5e6b70fdbc2", "EndpointID": "2bcba7434eee8ecb45bb0b0d2b71c916fd7da5a21562a34dcaa", "Gateway": "", "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "", "DriverOpts": null } } } } ] :~$ docker network inspect none #none网络下有none的网络下包含容器 nginx-2并且没有网络信息 [ { 
    "Name": "none", "Containers": { 
    "31ba415ffebb527aea43b857f4c4f82daaaba0a98cef713": { 
    "Name": "nginx-2", "EndpointID": "2bcba7434eee8ecb45bb0b0d2b71c916fd7da5a21562a34dcaa", "MacAddress": "", "IPv4Address": "", "IPv6Address": "" } :~$ netstat -tnulp #发现并没有80端口的网络启动 Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN - tcp6 0 0 :::22 :::* LISTEN - tcp6 0 0 ::1:631 :::* LISTEN - udp 0 0 127.0.1.1:53 0.0.0.0:* - udp 0 0 0.0.0.0:45194 0.0.0.0:* - udp 0 0 0.0.0.0:631 0.0.0.0:* - udp 0 0 0.0.0.0:39822 0.0.0.0:* - udp 0 0 0.0.0.0:5353 0.0.0.0:* - udp6 0 0 :::56067 :::* - udp6 0 0 :::5353 :::* - 

4.1.10 none案例–自定义桥接网络

需求
自定义容器网络和宿主机为同一网段,容器ip可以指定。

案例分析:
1、自定义容器网络段和宿主机一样

2、自定义容器ip地址
知识关键点:
1、网络配置

docker虚拟网桥配置

docker服务使用网桥

容器创建使用none模式

2、使用pipwork工具实现定制docker容器ip地址

注释:pipwork的命令格式

pipework [桥接设备][容器id或者名字] [容器ip]/[ip掩码]@[宿主机网关]

例子:

pipework br0 ubuntu-test1 192.168.8.201/24@192.168.8.2

3、映射虚拟机软件源进入到容器,替换掉容器内部软件源后进行软件源更新与安装

注释:docker上pull下来的Ubuntu,使用apt-get install 命令下载速度奇慢无比,需要修改其软件源,进入etc/apt

目录欲修改sources.list 发现vi,vim,gedit都没有,再下这些软件也非常慢.

解决方法:

3.1启动容器时,挂载本地Linux系统的etc/apt文件

docker run -ti -v /etc/apt/:/home/etc ubuntu

3.2删除容器下的sources.lis rm /etc/apt/sources.list

3.3将本地sources.list 复制过来 cp /home/etc/sources.list /etc/apt/

自定义桥接网络实施

#1、网络环境部署 #1.1 网卡环境部署 #1.1.1 网桥软件部署 :~$ sudo apt-get install bridge-utils -y :~$ brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242a6e980f2 no #1.1.2 桥接网卡配置 #编辑网卡信息编辑Ubuntu的网卡信息文件 #对源文件进行备份 :~$ sudo cp /etc/network/interfaces /etc/network/interfaces-old :~$ sudo vim /etc/network/interfaces #与源文件内容进行1行的空行 auto br0 iface br0 inet static address 192.168.110.104 netmask 255.255.255.0 gateway 192.168.110.2 dns-nameservers 192.168.110.2 bridge_ports ens38 #重启 service networking restart #1.2 docker服务配置 #1.2.1 配置docker文件 :~$ sudo vim /etc/default/docker #最末尾添加 DOCKER_OPTS="-b=br0" #1.2.2 systemctl使用docker文件 #创建服务依赖文件 :~$ sudo mkdir -p /etc/systemd/system/docker.service.d :~$ sudo vim /etc/systemd/system/docker.service.d/Using_Environment_File.conf #内容如下: [Service] EnvironmentFile=-/etc/default/docker ExecStart= ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS #重载服务配置文件 :~$ systemctl daemon-reload #1.2.3 重启docker 第一次配置的时候需要重启linux虚拟机:reboot systemctl restart docker #注意查看网卡信息 :~$ brctl show bridge name bridge id STP enabled interfaces br0 8000.000cc no ens33 docker0 8000.02427c11f899 no br0 Link encap:以太网 硬件地址 00:0c:29:60:06:0c inet 地址:192.168.110.14 广播:192.168.110.255 掩码:255.255.255.0 inet6 地址: fe80::20c:29ff:fe60:60c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1 ens33 Link encap:以太网 硬件地址 00:0c:29:60:06:0c UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1 #广播运行多播 #验证dns解析是否正常 ping www.baidu.com #网络可能会没有dns解析所以我们需要进行dns的配置 #16.04: :~$ sudo vim/etc/resolvconf/resolv.conf.d/base #18.04: :~$ sudo vim /etc/resolv.conf #增加内容 nameserver 223.5.5.5 nameserver 114.114.114.114 nameserver 8.8.8.8 #注意如果重启后网络并未生效则 sudo /etc/init.d/networking restart #sudo vim /etc/systemd/resolved.conf #[Resolve] #DNS=119.29.29.29 #systemctl restart systemd-resolved.service #1.3 容器创建 #基于ubuntu镜像创建一个容器,网络模式使用none ,启动容器时,挂载本地Linux系统的etc/apt文件 :~$ docker run -itd --net=none --name ubuntu-test1 -v /etc/apt/:/home/etc ubuntu /bin/bash 5f7b976ddfdf60dbc08cbb70da15bc183d7f21da7030c316cd6ec96b :~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5f7b976ddfdf ubuntu "/bin/bash" 5 seconds ago Up 4 seconds ubuntu-test1 #2、定制容器ip #2.1 pipwork软件部署 #安装pipwork #方法1: git clone https://github.com/jpetazzo/pipework #方法2:将软件直接拖入ubuntu虚拟机 #直接解压安装包 :~$unzip pipework-master.zip #将文件拷贝到bin下 sudo cp pipework-master/pipework /usr/local/bin/ #2.2 定制容器ip :~$ sudo pipework br0 ubuntu-test1 192.168.110.129/24@192.168.110.2 #2.3 测试效果 #进入容器查看ip地址信息 :~$ docker exec -it ubuntu-test1 /bin/bash #删除容器下的sources.lis :~# rm /etc/apt/sources.list #将本地sources.list 复制过来 :~# cp /home/etc/sources.list /etc/apt/ #进行软件源更新 :~# apt-get update #安装ping命令 :~# apt-get install inetutils-ping -y #安装ifconfig命令 :~# apt-get install net-tools -y 宿主机ping命令测试 > ping 192.168.110.14 

4.1.11 跨主机容器通信

容器网络拓扑图

在这里插入图片描述

主机信息:

主机1:ubuntu 18.04 192.168.8.14

主机2:ubuntu 16.04 192.168.8.15

均安装 bridge-utils软件

2、docker服务使用br0

3、创建容器使用br0

4、跨主机间网络测试

编辑systemctl的配置文件使用该docker文件

重载systemctl配置

重启docker或者重启虚拟机

3、创建容器,查看容器信息即可

4、两台主机分别测试

注意:
1、2、3 这三条在两台主机的配置大部分一模一样
ip地址划分不一样

1.1 软件安装

1.2 编辑网卡

2、docker配置网桥

2.1 配置docker文件

2.2 systemctl使用docker文件

2.3 重启主机

3、容器测试

3.1 创建容器

3.2 容器间测试

实施:

讯享网#1、ubuntu桥接网卡配置 #1.1 软件安装 apt-get install bridge-utils -y #1.2 编辑网卡 :~$ sudo vim /etc/network/interfaces #与文件源内容进行1行的空行 #主机1 auto br0 iface br0 inet static #ip要和本机网卡一致 address 192.168.110.14 netmask 255.255.255.0 gateway 192.168.110.2 dns-nameservers 192.168.110.2 #使用本机的网卡 bridge_ports ens33 #主机2 auto br0 iface br0 inet static address 192.168.110.15 netmask 255.255.255.0 gateway 192.168.110.2 dns-nameservers 192.168.110.2 bridge_ports ens33 #2、docker配置网桥 #2.1 配置docker文件 #修改docker的守护进程文件 vim /etc/default/docker #末尾添加: #主机1 DOCKER_OPTS="-b=br0 --fixed-cidr=192.168.110.99/26" #主机2 DOCKER_OPTS="-b=br0 --fixed-cidr=192.168.110.170/26" #注释: #-b 用来指定容器连接的网桥名字 #--fixed-cidr用来限定为容器分配的IP地址范围 #192.168.110.99/26地址范围:192.168.110.64~192.168.110.127 #192.168.110.170/26地址范围:192.168.110.128~192.168.110.191 #网段的计算可以参考网址:http://www.ab126.com/goju/1840.html #2.2 systemctl使用docker文件 创建服务依赖文件 :~$ sudo mkdir -p /etc/systemd/system/docker.service.d :~$ sudo vim /etc/systemd/system/docker.service.d/Using_Environment_File.conf 内容如下: [Service] EnvironmentFile=-/etc/default/docker ExecStart= ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS #重载服务配置文件 :~$systemctl daemon-reload #2.3 重启主机 reboot #注意如果重启后网络并未生效则 sudo /etc/init.d/networking restart #注意查看网卡信息 :~$ brctl show bridge name bridge id STP enabled interfaces br0 8000.000cc no ens33 docker0 8000.02427c11f899 no br0 Link encap:以太网 硬件地址 00:0c:29:60:06:0c inet 地址:192.168.110.14 广播:192.168.110.255 掩码:255.255.255.0 inet6 地址: fe80::20c:29ff:fe60:60c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1 ens33 Link encap:以太网 硬件地址 00:0c:29:60:06:0c UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1 #广播运行多播 广播运行多播 #验证dns解析是否正常  ping www.baidu.com #网络可能会没有dns解析所以我们需要进行dns的配置 #16.04: :~$ sudo vim/etc/resolvconf/resolv.conf.d/base #18.04: :~$ sudo vim/etc/resolv.conf #增加内容 nameserver 223.5.5.5 nameserver 114.114.114.114 nameserver 8.8.8.8 #注意如果重启后网络并未生效则 sudo /etc/init.d/networking restart #3、容器测试 #3.1 创建容器 #主机1: :~$ docker run -itd --name ubuntu-test1 -v /etc/apt/:/home/etc ubuntu /bin/bash :~$ docker run -itd --name ubuntu-test2 -v /etc/apt/:/home/etc ubuntu /bin/bash #主机2  :~$ docker run -itd --name ubuntu-test3 -v /etc/apt/:/home/etc ubuntu /bin/bash :~$ docker run -itd --name ubuntu-test4 -v /etc/apt/:/home/etc ubuntu /bin/bash #3.2 容器间测试 进入容器 #主机1 :~$docker exec -it ubuntu-test1 /bin/bash :~$docker exec -it ubuntu-test2 /bin/bash #主机2 :~$docker exec -it ubuntu-test3 /bin/bash :~$docker exec -it ubuntu-test4 /bin/bash :~# rm /etc/apt/sources.list #容器内部将本地sources.list 复制过来 :~# cp /home/etc/sources.list /etc/apt/ #容器内部进行软件源更新 :~# apt-get update #容器内部安装ping命令 :~# apt-get install inetutils-ping -y #容器内部安装ifconfig命令 :~# apt-get install net-tools -y #四个容器之间相互ping通 宿主机ping命令测试 > ping 192.168.110.14 > ping 192.168.110.15 

总结:
优点:
配置简单,不依赖第三方软件
缺点:
容器依赖于主机间的网络
容器与主机在同网段,注意ip地址分配
生产中不容易实现、不好管理

小讯
上一篇 2025-01-12 13:15
下一篇 2025-01-15 21:22

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/119440.html