Docker核心技术(三)
网络管理
Docker 网络很重要,重要的,我们在上面学到的所有东西都依赖于网络才能工作。我们从两个方面来学习网络:端口映射和网络模式 为什么先学端口映射呢? 在一台主机上学习网络,学习端口映射最简单,避免过多干扰。
端口映射详解
默认情况下,容器和宿主机之间网络是隔离的,我们可以通过端口映射的方式,将容器中的端口,映射到宿主机的某个端口上。这样我们就可以通过宿主机的ip+port的方式来访问容器里的内容
Docker的端口映射
- 随机映射 -P(大写)
- 指定映射 -p 宿主机ip:宿主机端口:容器端口
注意: 生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突, 不管哪种映射都会有所消耗,影响性能,因为涉及到映射的操作
随机映射实践
随机映射我们从两个方面来学习:
- 默认随机映射
- 指定主机随机映射
默认随机映射
#命令格式:
docker run -d -P [镜像名称]
#命令效果:
#先启动一个普通的nginx镜像
$ docker run -d nginx
#查看当前宿主机开放了哪些端口
$ netstat -tnulp
#启动一个默认随机映射的nginx镜像
$ docker run -d -P nginx
#查看当前宿主机开放了哪些端口
$ netstat -tnulp
注意: 宿主机的32768被映射到容器的80端口 -P 自动绑定所有对外提供服务的容器端口,映射的端口将会从没有
使用的端口池中自动随机选择,但是如果连续启动多个容器的话,则下一个容器的端口默认是当前容器占用端口号+1,端口一般都是从32768开始分配映射。
指定主机随机映射
#命令格式
:~$ docker run -d -p [宿主机ip]::[容器端口] --name [容器名称][镜像名称]
#命令效果
:~$ docker run -d -p 192.168.8.14::80 --name nginx-1 nginx
#检查效果
:~$ docker ps
#随机映射还可以这么写(省略ip,默认0.0.0.0,注意端口前是::)
:~$ docker run -d -p ::80 --name nginx-1 nginx
指定映射实践
指定端口映射我们从二个方面来讲:
- 指定端口映射
- 指定多端口映射
指定端口映射
#命令格式:
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
网络管理基础
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
57942890c6d6 none null local
#查看bridge的网络内部信息
:~$ docker network inspect bridge
查看容器详细信息
#命令格式:
docker inspect [容器id]
#命令效果:
查看容器全部信息:
:~$ docker inspect 930f29ccdf8a
查看容器网络信息:
:~$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' 930f29ccdf8a
查看容器端口信息
#命令格式:
docker port [容器id]
#命令效果:
:~$ docker port 930f29ccdf8a
网络模式简介
从1.7.0版本开始,Docker正式把网络跟存储这两个部分的功能实现都以插件化的形式剥离出来,允许用户通过指令来选择不同的后端实现。这也就是Docker希望构建围绕着容器的强大生态系统的一些积极尝试。 剥离出来的独立网络项目叫做libnetwork,libnetwork中的网络模型(Container Networking Model ,CNM)十分简洁,可以让上层的大量应用容器最大程度上不去关心底层实现。
docker的常用的网络模式
==bridge模式==: 简单来说:就是穿马甲,打着宿主机的旗号,做自己的事情。 Docker的默认模式,它会在docker容器启动时候,自动配置好自己的网络信息,同一宿主机的所有容器都在一个网络下,彼此间可以通信。类似于我们vmware虚拟机的桥接模式。 利用宿主机的网卡进行通信,因为涉及到网络转换,所以会造成资源消耗,网络效率会低。
1.png
==host模式:== 简单来说,就是鸠占鹊巢,用着宿主机的东西,干自己的事情。容器使用宿主机的ip地址进行通信。特点:容器和宿主机共享网络
2.png
==container模式==: 新创建的容器间使用,使用已创建的容器网络,类似一个局域网。 特点:容器和容器共享网络
3.png
==none模式:== 这种模式最纯粹,不会帮你做任何网络的配置,可以最大限度的定制化。 不提供网络服务,容器启动
后无网络连接。
4.png
==overlay模式==: 容器彼此不再同一网络,而且能互相通行。
5.png
定制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
57942890c6d6 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-17847710137f 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
.......
#创建自定义网段与网关信息
:~$ docker network create --driver bridge --gateway 172.99.0.1 --subnet 172.99.0.0/16 bridge-test1
#成功返回对应的sha256码 9d02a01fa98b7a538027b624171481a2098232fa707cdc83084fc880d0afd091
#查看网络列表
:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
c2dcffa83a29 bridge bridge local
17847710137f bridge-test bridge local
9d02a01fa98b bridge-test1 bridge local
c4deefdaf53b host host local 57942890c6d6 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
ff07009ba3c29872145630814d163ccffe72643abef3acda2d443d6848004d87
#查看下容器
:~$ 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
cc55de5710ad8133991d52482d363b42dcdf6fff50f476b3024c626eb1c14da3
#查看下容器 :~$ 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": { "ff07009ba3c29872145630814d163ccffe72643abef3acda2d443d6848004d87": { "Name": "nginx--1", "EndpointID": "e2e8ba3091b27b333cf73673059dbc3a973540873fe64bd6c6300c89dc57eb75", "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": { "cc55de5710ad8133991d52482d363b42dcdf6fff50f476b3024c626eb1c14da3": { "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": { "cc55de5710ad8133991d52482d363b42dcdf6fff50f476b3024c626eb1c14da3": { "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": { "ff07009ba3c29872145630814d163ccffe72643abef3acda2d443d6848004d87": { "Name": "nginx--1", "EndpointID": "0c0367f49338274698e58aed371bf582d931d5824edf7f1385637ea3fabd242c", "MacAddress": "02:42:ac:63:00:02", "IPv4Address": "172.99.0.2/16", "IPv6Address": ""
定制bridge实践二
之前我们创建的容器,它们的ip都是从docker0自动获取的,接下来我们自己定义一个br0网桥,然后启动的容器就
用这个
网桥是什么? 他是一种设备,根据设备的物理地址来划分网段,并传输数据的,docker0就是默认的网桥。
需求: 定制docker网桥
分析:
- 网桥的创建
- docker服务使用新网桥
- 测试
知识点:
- bridge-utils软件的brctl工具可以实现创建网桥
- 配置/etc/default/docker文件 编辑systemctl的
配置文件使用该docker文件 重载systemctl配置 重启docker - 创建容器,查看容器信息即可
#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 783160 59632 ? Ssl 2月24 1:01 /usr/bin/dockerd - H fd:// #重启 :~$ systemctl restart docker #重启后效果 :~$ ps aux |grep docker root 45737 4.3 1.2 527600 50572 ? Ssl 09:32 0:00 /usr/bin/dockerd -H fd:// - b=br0 #3、容器测试 #3.1 创建容器并测试 #创建默认网络的容器 :~$ docker run -itd --name nginx--3 nginx 92d4b5e434d2ba1a00426e987b113fdaa1dff82364240a9c498ee813529331b4 :~$ 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": { "92d4b5e434d2ba1a00426e987b113fdaa1dff82364240a9c498ee813529331b4": { "Name": "nginx--3", "EndpointID": "b5c2e1ea9dcd722b102b7f63f569604cd65be378da649e8f8edd492c083cfec5",
"MacAddress": "02:42:c0:a8:63:02", "IPv4Address": "192.168.99.2/24",
host模型实践
host模型我们知道,容器使用宿主机的ip地址进行对外提供服务,本身没有ip地址。
docker run --net=host -itd --name [容器名称] 镜像名称
docker run --net=host -itd --name nginx-1 nginx
cf5f44228d7efa6271d494bc658a8073c1a3961dc0c7acab3c58796dfa925f6e
==host特点==: host模型比较适合于,一台宿主机跑一个固定的容器,比较稳定,或者一个宿主机跑多个占用不同端
口的应用的场景,他的网络性能是很高的。 host模型启动的容器不会有任何地址,他其实是使用了宿主机的所有
信息
none 模型实践
none网络模式,是一种自由度非常高的网络模式,我们可以最大化的自定义我们想要的网络
docker run --net=none -itd --name [容器名称] 镜像名称
none案例--自定义桥接网络
配置自定义桥接网络案例 为了使本地网络中和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段,而且还要指定容器的ip地址。
需求: 自定义容器网络和宿主机为同一网段,容器ip可以指定。
案例分析:
- 自定义容器网络段和宿主机一样
- 自定义容器ip地址
知识关键点:
- 网络配置
docker虚拟网桥配置docker服务使用网桥 容器创建使用none模式
- 使用pipwork工具实现定制docker容器ip地址注释:
pipwork的命令格式
pipework [桥接设备][容器id或者名字] [容器ip]/[ip掩码]@[宿主机网关]
例子:
pipework br0 ubuntu-test1 192.168.8.201/24@192.168.8.2
映射虚拟机软件源进入到容器,替换掉容器内部软件源后进行软件源更新与安装
注释:docker上pull下来的Ubuntu,使用apt-get install 命令下载速度奇慢无比,需要修改其软件源,进入etc/apt 目录欲修改sources.list 发现vi,vim,gedit都没有,再下这些软件也非常慢.
解决方法:
- 启动容器时,挂载本地Linux系统的etc/apt文件
- docker run -ti -v /etc/apt/:/home/etc ubuntu
- 删除容器下的sources.lis rm /etc/apt/sources.list
- 将本地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.14
netmask 255.255.255.0
gateway 192.168.110.2
dns-nameservers 192.168.110.2 bridge_ports ens33
#重启
service networking restart
#1.2 docker服务配置
.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.000c2960060c 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 68 #18.04:
:~$ sudo vim/etc/resolv.conf
#增加内容
nameserver 223.5.5.5
nameserver 114.114.114.114
nameserver 8.8.8.8 75
#注意如果重启后网络并未生效则
sudo /etc/init.d/networking restart
#1.3 容器创建
#基于ubuntu镜像创建一个容器,网络模式使用none ,启动容器时,挂载本地Linux系统的etc/apt文件
:~$ docker run -itd --net=none --name ubuntu-test1 -v /etc/apt/:/home/etc ubuntu /bin/bash
5f7b976ddfdf60dbc08cb81569488b70da15bc183d7f21da7030c316cd6ec96b
:~$ 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
跨主机容器通信
容器网络拓扑图
1.png
主机信息:
主机1:ubuntu 18.04 192.168.8.14
主机2:ubuntu 16.04 192.168.8.15
均安装 bridge-utils软件分析: 1、自定义br0
2、docker服务使用br0
3、创建容器使用br0
4、跨主机间网络测试
知识点: 1、使用手工方式定制ubuntu的网卡
2、 配置/etc/default/docker文件
编辑systemctl的配置文件使用该docker文件重载systemctl配置
重启docker或者重启虚拟机
3、创建容器,查看容器信息即可
4、两台主机分别测试
注意: 1、2、3 这三条在两台主机的配置大部分一模一样 ip地址划分不一样
方案: 1、ubuntu桥接网卡配置
1.1软件安装
1.2编辑网卡
2、docker配置网桥
2.1配置docker文件
2.2systemctl使用docker文件
2.3重启主机
3、容器测试
3.1创建容器
3.2容器间测试
实施:
#1、ubuntu桥接网卡配置
#1.1 软件安装
apt-get install bridge-utils -y 4
#1.2 编辑网卡
:~$ sudo vim /etc/network/interfaces
#与文件源内容进行1行的空行
#主机1
auto br0
iface br0 inet static
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 23
#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://help.bitscn.com/ip/
#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
58 br0 8000.000c2960060c no ens33
docker0 8000.02427c11f899 no 60
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的配置77 #16.04:
:~$ sudo vim/etc/resolvconf/resolv.conf.d/base 79 #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地址分配 生产中不容易实现、不好管理