3、Docker网络
网络名称空间
容器网桥互联
Overlay Network(叠加网络)
Docker网络
bridge
容器间通信
host
none
container
docker host配置
修改docker0桥的默认信息
docker网络实例
Docker网络
Docker 网络的创建
Docker支持的网络模型
容器互联
closed container
bridge container
join container
open container
使用网桥管理工具管理网络
Docker使用重点
Docker端口映射
实例二
实例三
实例四
Docker容器间通信
容器网桥互联
Overlay Network(叠加网络)
Docker网络
bridge
容器间通信
host
none
container
docker host配置
修改docker0桥的默认信息
docker网络实例
Docker网络
Docker 网络的创建
Docker支持的网络模型
容器互联
closed container
bridge container
join container
open container
使用网桥管理工具管理网络
Docker使用重点
Docker端口映射
实例二
实例三
实例四
Docker容器间通信
网络名称空间
网络名称空间在较早版本的内核,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