Docker核心技术(三)

网络管理

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

端口映射详解

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

Docker的端口映射

  1. 随机映射 -P(大写)
  2. 指定映射 -p 宿主机ip:宿主机端口:容器端口

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

随机映射实践

随机映射我们从两个方面来学习:

  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,端口一般都是从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网桥
分析:

  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 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地址分配 生产中不容易实现、不好管理

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 网络管理 Docker 网络很重要,重要的,我们在上面学到的所有东西都依赖于网络才能工作。我们从两个方面来学习网络...
    强某某阅读 663评论 0 0
  • 五、Docker 端口映射 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了...
    R_X阅读 1,670评论 0 7
  • docker 网络的种类 host bridge overlay Macvlan host 如果你对一个容器使用的...
    Tim_SSS阅读 23,827评论 0 7
  • 一、Docker容器概述 1、docker中的容器技术演进 lxc --> libcontainer --> ru...
    任总阅读 3,861评论 0 26
  • 本文是篇翻译。原文:https://docs.docker.com/engine/userguide/networ...
    周立_itmuch阅读 861评论 0 4