TOC

网络名称空间

    网络名称空间在较早版本的内核,2.6版本就已经添加进去了,也就意味着在我们现在这个系统内核之上默认支持,所谓网络名称空间其主要是实现网络设备、协议栈等的隔离,假如我们宿主机有四块网络,现在要创建2个名称空间,而这四块网卡上可以单独给某一个单独的名称空间使用的,当这个网卡设备给了第一个名称空间使用,那么第二个名称空间上不可知的,一个设备一般只能属于一个空间,这就使得每一个名称空间都能配置IP地址,能够与外部进行通讯,因为他们是物理网卡。
    假如我们现在的名称空间数量超过物理网卡数量,每一个名称空间的进程也需要能够通过网络通讯,那么此时我们就可以使用虚拟网卡设备,用纯软件的方式来模拟一组设备来使用,Linux内核级支持两种级别设备的模拟一种是二层设备,一种是三层设备。所以我们就可以借助这个功能在Linux借助内核的功能创建虚拟网卡接口的,而且这种虚拟网卡很独特,每一个虚拟网卡上成对出现的,可以模拟为一根网线的两端,其中一端可以插在主机之上,一端可以插在交换机之上,那就相当于让一个主机连接到一个交换机上,而linux内核原生支持二层虚拟网桥设备,就是用软件来构建一个交换机,一个软件所实现的虚拟机,自己创建一个网卡,一头关联到这个名称空间,一头关联到交换机,这就相当于模拟了让一个主机连接到了一个交换机上了。同样的,如果有两个名称空间,这两个名称空间都这么做,各自创建一个虚拟网卡,一端留在名称空间,一端留在交换机,那么我们就能是实现网络连接的功能。如果这两个名称空间的网卡配置的网络地址在同一网段,那么他们就可以直接通讯了。
    这就是所谓的虚拟化网络,从网络设备的虚拟设备到网卡都是用纯软件的方式来实现,能够在一台主机之上用软件来实现,所以我们把它称为网络虚拟化技术当中的一种简单的实现,而现在在云计算的大潮之下,网络无非上最复杂的一个环境,然后才是网络之上承载的主机才能够通信,而这个网络虚拟化为了实现更高级的功能,它需要软硬件结合起来实现,SDN。

容器网桥互联

    当有两个主机上的容器想要进行通讯的时候,这就有一个问题了,因为都是私有网络,想要进行外部通讯,一个主机的IP地址192.168.1.0网段另一个主机的网络上192.168.2.0网段,网段都不同如何进行通讯呢,更何况容器之外还隔了一层宿主机,这个时候可以想象我们的VMware,借助vmware来看,我们可以在他们两个主机之间使用桥接网络,将主机的网卡变成一个网桥,然后每个容器都有自己的能够和外部主机通讯的IP地址,但是这样来看,大量的容器这样操作起来,代价上很大的,比如说,你的所有容器都桥接在同一个平面网络中,都是使用的桥接,很容易产生广播风暴,因此在隔离的管理上是没那么完善的;

Overlay Network(叠加网络)

    它的原理是采用隧道机制实现网络通讯,一个A主机上面有一个A1容器,一个B主机之上有一个B1容器,A1想要和B1通讯,那么会在首先A和A1之间会有一个虚拟网卡,这个虚拟网卡上容器专用网卡,这个网卡有自己MAC地址和IP地址,B和B1也一样,当A1需要和B1通讯的时候,首先TCP报文首部会封装原IP上A1的IP,目标IP是B1的IP,当这个报文达到A和A1中间的这个虚拟网卡的时候,它能够知道这个报文不是送往宿主机A的,所以会在这个报文之上在封装一层,原IP为A的IP目标IP为B的IP,当这个报文达到B网卡的时候,拆报文,得到目的IP是B1所以这个包就直接送往了B实现多主机之间的容器通讯,这种网络就叫叠加网络,基于隧道叠加实现另外一层网络途径;

Docker网络

    docker安装完成之后默认提供了三种网络,bridge、host、none;
docker0:docker安装完成之后,它会自动在宿主机之上创建一个软交换机docker0,docker0既可以当网卡也可以当交换机,如果不给地址它就是交换机,给地址技能当交换机也能当网卡;
bridge:NAT桥接网络,并不是物理桥,当容器启动之后默认会自动创建一对网卡设备,一端在docker0桥上,一端在容器;
bridge
    在我们的宿主机安装了docker之后默认会创建一个虚拟网卡docker0,这个docker0是容器专用网卡,即在我们创建容器的时候因为默认使用的网络是bridge,所以会自动创建一对网卡设备,一端连接在docker0,一端连接在我们的容器,所以为什么我们在创建容器之后我们的容器会默认有一个eth0的网卡,具体示例如下
# 查看默认的docker0网桥
[root@node1 ~]# ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:cfff:fe13:7da3  prefixlen 64  scopeid 0x20<link>
        ether 02:42:cf:13:7d:a3  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 656 (656.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@node1 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.0242cf137da3       no
# 启动容器
[root@node1 ~]# docker run -itd --name busybox --rm busybox
571737b0c13d9f6d04025d12604099eb01a1882b8b5e418beb621ccd2508ebc9
# 查看网卡地址
[root@node1 ~]# docker exec busybox ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
19: eth0@if20: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue  # eth0@if20该网卡就是默认创建的两端虚拟网卡设备的一端
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
# 再次查看网桥是否有新的设备接入
[root@node1 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.0242cf137da3       no vethd6398e2
# 当我们使用ip命令的时候就会看到多了一个虚拟网卡
[root@node1 ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:62:df:29 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:62:df:33 brd ff:ff:ff:ff:ff:ff
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    link/ether 02:42:cf:13:7d:a3 brd ff:ff:ff:ff:ff:ff
20: vethd6398e2@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default  # vethd6398e2@if19该网卡就是连接到docker0的一端
    link/ether 2e:f6:05:e8:1e:89 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    因为docker0桥默认是一个NAT桥,一启动docker就会在主机的iptables创建一对规则,所以说docker0桥默认是NAT桥就是这个原因;

容器间通信

    假设1:C1需要访问C2,这样的通讯就极为简单了,因为他们都连接到了一个docker0网桥之上,所以从这个架构看来C1和C2他们之间是完全能够通讯的,无需其他手段;
    假设2:Docker Host 1需要访问C1,因为docker0是属于Docker Host 1 的一个虚拟网卡,该网卡具有两层和三层的功能,同时具有网卡和网桥的功能,所以他们也可以直接通讯,通过docker0网桥上面的IP与容器进行通讯;
    假设3:C1需要访问C3,这两个容器需要进行通讯,那么直接按常理的方式是无法通讯的,需要通过DNAT,则Docker Host 2 主机之上向外暴露一个访问地址,并且对该访问地址设置DNAT目的主机为C3;
host
    让容器使用宿主机的网络名称空间,同时与宿主机共享UTS/NET/IPC名称空间,容器有自己的文件系统,有自己的PID有自己的用户这几组名称空间都是隔离的,但是其他的几个名称空间都与宿主机共享,拥有同一个网络协议栈,拥有同一个主机名和域名,对外使用同一个主机名域名同一个在于,好处在于,比如第一个容器需要与第二个容器进行通讯,那么我们就可以使用lo接口进行通讯了,因为大家使用的都是同一个协议栈,同一个协议栈就说明都具有同一个网络接口,这就表示容器可以有自己隔离的名称空间,也可以有共享的名称空间;

none
    none网络模式,是一种自由度非常高的网络模式,我们可以最大化的自定义我们想要的网络;
container
    container网络模式,联盟式容器,让多个容器可以共享一个网络名称空间, 他们隔离USER、MOUNT、PID名称空间,但是他们几个容器之间共享UTS、NET、IPC名称空间,他们可以通过lo接口进行通讯,效果就像在一台主机之上运行的多个进程一样,但事实上他们还是有一部分空间是隔离的;

docker host配置

修改docker0桥的默认信息
{
    "registry-mirrors": ["https://owcyje1z.mirror.aliyuncs.com"],
    "bip":"10.0.0.1/16",
    "mtu":1500,
    "default-gateway":"10.0.0.1"
}

docker网络实例

Docker网络

    我们在用户空间的程序,通常都需要接入到网络中去,被客户的所访问,既然需要被客户端所访问,那它就需要接入到网络中去。当然在某些场景下用户也无需接入网络,所以docker也就提供了所谓的网络模型;

Docker 网络的创建

1、创建一个docker网桥
[root@node1 ~]# docker network create --subnet=192.168.1.0/24 cce
2、新建容器并将其和cce网桥关联起来
[root@node1 ~]# docker network list
NETWORK ID          NAME                DRIVER              SCOPE
dc84968efaa5        bridge              bridge              local
bf7a307e6c21        cce                bridge              local
958a94298c1f        host                host                local
e6bd6f693f1e        none                null                local
[root@node1 ~]# docker run -itd --name cce --net cce --ip 192.168.1.2 --rm busybox:latest
[root@node1 ~]# docker exec cce ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:C0:A8:01:02  
          inet addr:192.168.1.2  Bcast:0.0.0.0  Mask:255.255.255.0

Docker支持的网络模型

closed container:仅适用于,只有一个loopback接口,无需网络通信的场景,例如备份;
    使用方式:none:不使用网络
        --net=none #表示不使用网络
bridge container:桥接式容器,有两个接口,一个是loopback和以太网接口,一般默认桥接至docker0
    bridge:桥模式
    如果不想启动容器时使用默认的docker0桥接口,需要在运行docker deamon命令时,使用一下选项。
    -b:指明要使用的桥;
        使用方式:--net=bridge_name  
host container:仅主机模式
        使用方式:--net=host #仅仅是将容器和宿主机连接起来
join container:启动一个容器时,让其使用某个已经存在的容器的网络名称空间;
    container:容器模式
        使用方式:--net=container #指定新创建的容器和某一个容器共享一个网络名称空间
open container:容器使用宿主机的网络名称空间;
    使用方式:--net host
容器互联
    容器互联,其实就是除了端口映射之外,它的应用能实现交互的方式,在多个容器之间创建一个私有隧道,使他们能够直接互相通信,其原理就是获取第一个容器的IP然后给定一个主机名,放置到第二个容器的/etc/hosts里面:
    实现方法:
        --link
1、创建第一个容器
[root@node1 ~]# docker run -idt --name test1 --rm busybox:latest
cc4c44261fe4561f95e76e0a9c27225c7c7679cc66b4b02e7d8db7b114fef580
2、创建第二个容器,并指定link主机
[root@node1 ~]# docker run -idt --name test2 --link test1:web001 --rm busybox:latest
58bf06a7edb13fb986f96a6a0eeb544d9672e6e9ec859eefa7a410419f0474a1
3、测试通信
[root@node1 ~]# docker exec test2 ping web001
PING web001 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.106 ms
closed container
无网络模式使用实例:
[root@node1 ~]# docker run -it --name caichangen --net none busybox:latest /bin/sh
/ # ifconfig 
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
bridge container
网桥式容器实例一:
1、创建一个网桥
[root@node1 ~]#  docker network create -d bridge ccenet
a1ff142f8ab3a5a7c5b149e8f5f4a4681ddb0f60595e9389b08a0dde69d7c67d
[root@node1 ~]#  docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
454dc2e27ea5        bridge              bridge              local               
a1ff142f8ab3        ccenet              bridge              local               
37fbcaced3b8        host                host                local               
0d3c627f7394        none                null                local
2、查看该网桥的地址
[root@node1 ~]# ifconfig 
br-a1ff142f8ab3: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:ef:59:fc:a4  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 648 (648.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 648 (648.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
3、创建一个基于该桥的容器
[root@node1 ~]# docker run --name testnet --network=ccenet busybox:latest ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 02:42:AC:12:00:02  
          inet addr:172.18.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe12:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:180 (180.0 B)  TX bytes:90 (90.0 B)
网桥式容器实例二:
[root@node1 ~]# docker network create --subnet=192.168.1.0/24 cce
a709ca0b2addb3371b00f4d5b5e96c54fe0c7a2625ec7cc54be577102b017e38
[root@node1 ~]# docker inspect cce
[
    {
        "Name": "cce",
        "Id": "a709ca0b2addb3371b00f4d5b5e96c54fe0c7a2625ec7cc54be577102b017e38",
        "Created": "2017-11-23T01:02:53.89849231+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.1.0/24"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
[root@node1 ~]# docker run -itd --name cce --rm --net=cce busybox:latest
7ebd3cbdaac1c09baa30b5ef55524673b8facd50168da9d5e8e7fe43335bedcb
[root@node1 ~]# docker exec cce ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 02:42:C0:A8:01:02  
          inet addr:192.168.1.2  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:16 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1296 (1.2 KiB)  TX bytes:0 (0.0 B)
join container
联盟式容器使用实例:
1、首先创建一个容器
[root@node1 ~]# docker run -it --name caichangen --rm busybox:latest /bin/sh
/ # ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:508 (508.0 B)  TX bytes:508 (508.0 B)
2、不停止上一个容器,继续创建另外一个容器,使用join的网络模型
[root@node1 ~]# docker run -it --name test --rm --net container:caichangen  busybox:latest ifconfig -a eth0
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:648 (648.0 B)  TX bytes:648 (648.0 B)
    此时可以看见,两个容器都是使用的一个网络名称空间
open container
开放式容器使用实例:
[root@node1 ~]# docker run -it --name caichangen --net host --rm busybox:latest /bin/sh
/ # ifconfig 
docker0   Link encap:Ethernet  HWaddr 02:42:09:40:16:1A  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:9ff:fe40:161a/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:185 errors:0 dropped:0 overruns:0 frame:0
          TX packets:64 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:13454 (13.1 KiB)  TX bytes:6930 (6.7 KiB)

eno16777736 Link encap:Ethernet  HWaddr 00:0C:29:FD:A2:C1  
          inet addr:192.168.1.71  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fefd:a2c1/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:11657 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9914 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1163954 (1.1 MiB)  TX bytes:2760856 (2.6 MiB)

eno33554960 Link encap:Ethernet  HWaddr 00:0C:29:FD:A2:CB  
          inet addr:192.168.0.124  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fefd:a2cb/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:29985 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2452 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3779438 (3.6 MiB)  TX bytes:228068 (222.7 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1020 (1020.0 B)  TX bytes:1020 (1020.0 B)

使用网桥管理工具管理网络

1、安装网桥管理工具
[root@node1 ~]# yum install -y bridge-utils
2、查看当前主机的网桥信息
[root@node1 ~]# brctl show
bridge name    bridge id        STP enabled    interfaces
docker0        8000.024205b67f0a    no        vethbd3b82a
                                                                      vethd999e0   (只有一个网桥,并且有两个主机已经加入到网桥)
...
网桥管理脚本
#!/bin/bash
#
#
# 网桥名称
br_name=br0
# 添加网络
brctl addbr $br_name
# 给网桥设置IP
ip addr add 172.16.1.71/24 dev $br_name
# 激活网桥
ip link set $br_name up
# 添加eth0到网桥
brctl addif $br_name eth0
# 还需要在Docker启动时桥接这个网桥
# vim /etc/default/docker
# DOCKER_OPTS="-b=br0"
# systemctl restart network
测试利用该网桥创建容器
Docker使用重点
[root@node1 ~]# docker run -it --name caichangen --net host busybox:latest httpd 
[root@node1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
c94ce585f727        busybox:latest      "httpd"             3 seconds ago       Exited (0) 2 seconds ago                       caichangen
    此上我们可以看到,我们运行一个httpd守护程序,之后就自动退出了,那是因为在容器当中我们运行程序一定不能在后台,因为一旦运行在后台就表示释放控制台了,释放控制台任务就终止了,任务终止了容器就退出了。
正确的做法:
[root@node1 ~]# docker run -it -d --name caichangen --net host busybox:latest httpd -f

Docker端口映射

    工作在nat桥上的容器的地址需要被外部访问,那么我们只有一个办法,那就是做端口映射,又因为每个主机的端口是唯一的,如果我们的两个容器都占用的80端口,那么我们做映射的时候也直接将宿主机的80端口映射到其中一个主机之上,这是无法避免的 。
    docker0 NAT桥模型上的容器发布给外部网络访问:
        -p <container port>:将容器的端口发布出去,但是它仅给出了容器端口,映射在宿主机的一个动态端口;
        -p <host port>:<container port>:将主机的一个端口,映射到容器的端口;
        -p <hostIP>::<container port>:将宿主机上的某个IP和随机端口映射为容器的端口(用于宿主机上有多个IP的情况下);
        -p <host ip>:<host port>:<container port>:将主机的某个指定端口和IP,映射到容器的端口;
        -P,--publish-all:发布所有端口,但是要和--expose选项一起使用,指明需要暴露的端口;
实例一
1、运行一个容器,而后将容器的80端口映射到本地某一端口
[root@node1 ~]# docker run -it --name caichangen --hostname cce -p 80 --net bridge --add-host     "www.cce.com:192.168.1.1" --rm busybox:latest /bin/sh
2、在宿主机上观察,此时查看我们的iptables,会发现创建了一对DNAT规则
[root@node1 ~]# docker port caichangen
80/tcp -> 0.0.0.0:32768
[root@node1 ~]# netstat -ntlp|grep 32768
tcp6       0      0 :::32768                :::*                    LISTEN      9003/docker-proxy-c 
3、提供httpd访问页面
/ # echo "Test Page" > /var/www/index.html
4、启动busybox自带的httpd
/ # httpd -f -v -h /var/www/
5、测试访问

实例二
1、将宿主机的80端口映射为容器的80端口
[root@node1 ~]# docker run -it --name caichangen --hostname cce -p 80:80 --net bridge --add-host "www.cce.com:192.168.1.1" --rm busybox:latest /bin/sh
/ # echo "Hello Word" > /var/www/index.html
/ # httpd -f -v -h /var/www/
2、测试访问

实例三
    手动指定端口暴露,并且将其暴露出来;
[root@node1 ~]# docker run -it --name caichangen --hostname cce -P --expose 80 --expose 8080 --expose 443 --net bridge --add-host "www.cce.com:192.168.1.1" --rm busybox:latest /bin/sh
[root@node1 ~]# docker port caichangen
8080/tcp -> 0.0.0.0:32769
443/tcp -> 0.0.0.0:32770
80/tcp -> 0.0.0.0:32771
实例四
    在主机上只在特定IP上监听端口;
# 监听单个IP
[root@node01 ~]# docker run -itd --rm -p 172.16.1.1:80:80 busybox:latest
[root@node01 ~]# docker port tender_neumann 
80/tcp -> 172.16.1.1:80
# 监听主机上所有的端口(默认)
[root@node01 ~]# docker run -itd --rm -p 0.0.0.0:80:80 busybox:latest                   
[root@node01 ~]# docker port flamboyant_grothendieck
80/tcp -> 0.0.0.0:80

Docker容器间通信

    使用--link name:alias可以让容器之间安全的进行交互,Docker通过环境变量为容器公开连接信息;
# 先创建一个web服务器
[root@node01 ~]# docker run -itd --rm --name web busybox:latest httpd -f
[root@node01 ~]# docker inspect web |jq .[0].NetworkSettings.IPAddress
"172.17.0.2"
# 使用--link让一个新的容器可以连接到该容器
[root@node01 ~]# docker run -it --rm --name test --link web:web busybox:latest 
/ # 
# 此时容器已经建立关系,--link name:alias其中name是要连接容器的名称,alias是这个连接的别名
# 查看/etc/hosts文件查看是否有连接容器的主机名解析
/ # cat /etc/hosts
172.17.0.2      web c9fc5e5092b0

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注