记录 Docker 的学习过程 (网络篇)

打开2个会话,分别运行如下命令node

# docker run -it -P --name nginx2 nginx #-P 端口随机映射nginx

再打开一个会话查看 运行中的容器docker

# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e065a4861a7f nginx "nginx -g 'daemon of…" 7 seconds ago Up 6 seconds 0.0.0.0:32769->80/tcp nginx2
101c87844e00 nginx "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 0.0.0.0:32768->80/tcp nginx网络

能够发现 使用了-P参数后 会从32768开始映射到容器的80端口,不会形成端口冲突,缺点是没法知道每次映射的端口是多少tcp


# docker run -it -p 53:53/udp --name dhcp dhcp #能够指定映射协议/udp
# docker run -it -p 192.168.56.11:80:80 --name ngxin3 nginx #假如宿主机有多个ip,能够指定映射致哪一个ip 这个例子是将容器的80端口映射到本机的192.168.56.11的80端口上oop


容器之间的互联性能

第一种方法 经过给容器命名别名的方式链接测试

打开第一个会话,运行如下
# docker run -it --name busybox1 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
44: eth0@if45: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
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 forever3d


再打开第二个对话,运行如下
# docker run -it --link busybox1:busyboxbieming --name busybox2 busybox # --link起别名
/ # cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 busyboxbieming 6e6aca74d76c busybox1
172.17.0.3 35087ae7a3d4
/ # ping busyboxbieming
PING busyboxbieming (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.065 msrouter

查看hosts文件能够发现多了一条别名的记录,ping别名发现能够解析到第一台的ip,所以能够经过这种别名的方式去链接

第二种方式

# docker network ls #查看网络模式
NETWORK ID NAME DRIVER SCOPE
2e7f4890adbc bridge bridge local
cb1cfe757fe7 host host local
35bc4c0ccb9b none null local

host模式会使容器的网卡信息和宿主机保持一致


先打开一个会话,执行如下命令

#docker run -it --net=host nginx

再打开一个会话,继续执行如下命令

#docker run -it --net=host nginx

此时会报错,提示80端口被占用
# docker run -it --net=host nginx
2020/02/21 16:34:54 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
2020/02/21 16:34:54 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address already in use)

再宿主机上执行netstat命令能够发现 80端口已经被第一台容器使用了
# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 959/master
tcp 0 0 192.168.56.11:2375 0.0.0.0:* LISTEN 878/dockerd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7306/nginx: master

这种模式的好处是,性能高,可是容易占用本机端口,通常对网络性能要求高时使用

 

下面建立一个属于本身的网络

# docker network create --driver bridge mydockernet
76d079e545f183fd799cebc203d4fb55f94110a0043da8377cbeb5009aa32af2

# docker network ls
NETWORK ID NAME DRIVER SCOPE
2e7f4890adbc bridge bridge local
cb1cfe757fe7 host host local
76d079e545f1 mydockernet bridge local
35bc4c0ccb9b none null local

使用刚刚建立的网络来创建容器

# docker run -it --network=mydockernet busybox #--network指定使用的网络
/ #
/ # 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
53: eth0@if54: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #
能够发现ip变成了172.18.x.0了

实际状况中咱们要指定建立的网段,下面继续建立一个指定的网段

 #docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2  #--subnet指定子网 --gateway指定网关2b3c58c61fb1bfa6f6959b7eb6b3b2d5c1c73f47b1f5663fcc601c31a93a1bdd


# docker run -it --rm --network=my_net2 --ip 172.22.16.88 busybox    #能够指定ip
/ #
/ #
/ # 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
5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:16:10:58 brd ff:ff:ff:ff:ff:ff
    inet 172.22.16.88/24 brd 172.22.16.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # exit

退出以前建立的2台,咱们再新建2台容器,测试下互通

# docker run -it --name oldboy1 --rm --network=my_net2 --ip 172.22.16.88 busybox    #新建第一台

# docker run -it --name oldboy2 --rm --network=my_net2 --ip 172.22.16.99 busybox    #新建第二台
互ping发现能够ping通,这是由于使用了docker自定义网络中的dns,使得用户名的已解析,这个解析仅对用户自定义的网络有效,默认的网络是无效的

下面的这种默认方式建立的容器,经过容器名是ping不通的

# docker run -it --rm --name oldboy1 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
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    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
/ # ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.065 ms
/ # ping oldboy2
ping: bad address 'oldboy2'


# docker run -it --rm --name oldboy2 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
13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ping oldboy1
ping: bad address 'oldboy1'

 

保留刚刚建立的oldboy1,删除oldboy2,而后再新建一个oldboy2

这个oldboy2使用自定网络

# docker run -it --name oldboy2 --rm --network=my_net2 --ip 172.22.16.99 busybox

此时oldboy2和oldboy1之间是经过容器名ping不通的

若是须要2台能够通,可使用下面的命令

# docker network connect my_net2 oldboy1      #把oldboy1容器加入my_net2网络中

随后便可互相经过容器名ping通

观察oldboy1

/ # 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
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    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
17: eth1@if18: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:16:10:02 brd ff:ff:ff:ff:ff:ff
    inet 172.22.16.2/24 brd 172.22.16.255 scope global eth1
       valid_lft forever preferred_lft forever

发现多了一块网卡

这样就能够解决不在同一网络的容器互通的问题

相关文章
相关标签/搜索