Docker核心技术之网络管理

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容器宿主机的ip:容器映射的端口

指定主机随机映射
#命令格式
    :~$ 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
57942890c6d6        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": "9e91f5d77b9c0ef85bb8a4f8aa2f4fb883243371b0946ee5f5e728ba9a409b0d",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "faecdcae982a658b1c1a1abbd57125ca5eae5234d3e684ce771b8a952317a3b6": {
                "Name": "nginx-1",
                "EndpointID": "72f7a99c28838ee670240c9e7bd79eee24c0dea28203e4fe0286fdb3ab084ac7",
                "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 网络模式简介

​ 从1.7.0版本开始,Docker正式把网络跟存储这两个部分的功能实现都以插件化的形式剥离出来,允许用户通过指令来选择不同的后端实现。这也就是Docker希望构建围绕着容器的强大生态系统的一些积极尝试。
​ 剥离出来的独立网络项目叫做libnetwork,libnetwork中的网络模型(Container Networking Model ,CNM)十分简洁,可以让上层的大量应用容器最大程度上不去关心底层实现。

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
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 
[
    {
        "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码
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": ""

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 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",

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": "98f3a7d052fabd7aa3e06c5a8d95d1db1ed28ffd81f7b0344b104217a505f94b",
#查看nginx-1这个容器的全部信息
:~$ docker inspect nginx-1 
 #发现网络信息为空
    "Networks": {
            "host": {
                "IPAMConfig": null,
                "Links": null,
                "Aliases": null,
                "NetworkID": "b5a84f949a9f2466430c7734a9e68d4499382efdee27886cb97bfdec0fb3834f",
                "EndpointID": "98f3a7d052fabd7aa3e06c5a8d95d1db1ed28ffd81f7b0344b104217a505f94b",
                "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
    31b52114415459a415ffebb527aea43b857f4c4f82daaab363293a0a98cef713
 
    :~$ docker ps
CONTAINERID  IMAGE COMMAND             CREATED         STATUS         PORTS  NAMES
31b521144154 nginx "nginx-g'daemonof…" Aboutaminuteago UpAboutaminute      nginx-2
    #查看nginx-2的全部信息
    :~$ docker inspect  nginx-2
    #发现网络信息皆为空 
     "Networks": {
                    "none": {
                        "IPAMConfig": null,
                        "Links": null,
                        "Aliases": null,
                        "NetworkID": "e70e4cb94db206011a26daa48331d376318fd6060ac20f027709d5e6b70fdbc2",
                        "EndpointID": "2bcba7434eee8ec827192b45bb0b0d2b71c916fd7da5a21562a34dca3726387a",
                        "Gateway": "",
                        "IPAddress": "",
                        "IPPrefixLen": 0,
                        "IPv6Gateway": "",
                        "GlobalIPv6Address": "",
                        "GlobalIPv6PrefixLen": 0,
                        "MacAddress": "",
                        "DriverOpts": null
                    }
                }
            }
        }
    ]
    :~$ docker network inspect none
    #none网络下有none的网络下包含容器 nginx-2并且没有网络信息
    [
        {
            "Name": "none",
            "Containers": {
                "31b52114415459a415ffebb527aea43b857f4c4f82daaab363293a0a98cef713": {
                    "Name": "nginx-2",
                    "EndpointID": "2bcba7434eee8ec827192b45bb0b0d2b71c916fd7da5a21562a34dca3726387a",
                    "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案例–自定义桥接网络

**配置自定义桥接网络案例 **
为了使本地网络中和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段,而且还要指定容器的ip地址。

需求
自定义容器网络和宿主机为同一网段,容器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.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
#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
    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

4.1.11 跨主机容器通信

容器网络拓扑图

在这里插入图片描述

主机信息:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值