于今腐草无萤火,终古垂杨有暮鸦。这篇文章主要讲述09-docker系列-docker网络你了解多少(下)相关的知识,希望能为你提供帮助。
声明:本文乃“运维家”原创,转载请注明出处,更多内容请关注公众号“运维家”。
主旨
本文接上一篇介绍的4种网络模式,据此,分别来进行实验下。
环境
linux环境
docker环境
回忆
bridge:容器和宿主机的docker0网卡桥接
host:容器和宿主机共享网络
null:独立,不能进行网络交互
contain:容器网络共享,和host的差异在于所有的docker容器,共同拥有一个IP地址
bridge模式
使用nginx镜像,将容器的80端口,映射到宿主机上:
语法:
docker run -d -p 宿主机端口:容器端口 -p 宿主机端口:容器端口 镜像名
解释:
如果是多个端口映射,多个几个 -p 即可,下面我们只映射了一个端口
宿主机和容器端口可以不对应,即容器80端口,宿主机可以是10000端口
实例:
[yunweijia@localhost ~]$ sudo docker images
REPOSITORYTAGIMAGE IDCREATEDSIZE
yunweijiajenkins976d65da21b944 hours ago874MB
yunweijiapython331255eafafc347 hours ago662MB
nginxlatestc316d5a335a52 weeks ago142MB
centos7eeb6ee3f44bd5 months ago204MB
[yunweijia@localhost ~]$ sudo docker run -d -p 80:80 nginx
ed75d4ce62f1f5b3668f430726a6e4c1f630683ef12e2805019543bb96f33ce6
[yunweijia@localhost ~]$ sudo docker ps
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
ed75d4ce62f1nginx"/docker-entrypoint.…"10 minutes agoUp 10 minutes0.0.0.0:80->
80/tcp, :::80->
80/tcpquizzical_shannon
[yunweijia@localhost ~]$
[yunweijia@localhost ~]$ sudo netstat -tunlp | grep 80
tcp00 0.0.0.0:800.0.0.0:*LISTEN105966/docker-proxy
tcp600 :::80:::*LISTEN105970/docker-proxy
udp00 0.0.0.0:443800.0.0.0:*706/avahi-daemon: r
[yunweijia@localhost ~]$
开通防火墙策略:
[yunweijia@localhost ~]$ sudo firewall-cmd --add-port=80/tcp --permanent
success
[yunweijia@localhost ~]$ sudo firewall-cmd --reload
success
[yunweijia@localhost ~]$ sudo firewall-cmd --list-port
80/tcp
[yunweijia@localhost ~]$
浏览器访问验证:
http://宿主机IP:80
host模式
使用nginx镜像,也是将80端口暴露出来(记得将上一步启动的nginx镜像使用docker stop 容器ID 的方式停掉,因为我们上面使用的就是80端口,端口冲突的话容器无法启动):
语法:
docker run -d --net=host 镜像
实例:
[yunweijia@localhost ~]$ sudo docker run -d --net=host nginx
a515ca68b5db8f181ba746d074562971a1121222d13848e9f24382fb5664ac43
[yunweijia@localhost ~]$ sudo docker ps
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
a515ca68b5dbnginx"/docker-entrypoint.…"6 seconds agoUp 6 secondsserene_hopper
[yunweijia@localhost ~]$ sudo netstat -tunlp | grep 80
tcp00 0.0.0.0:800.0.0.0:*LISTEN106519/nginx: maste
tcp600 :::80:::*LISTEN106519/nginx: maste
udp00 0.0.0.0:443800.0.0.0:*706/avahi-daemon: r
[yunweijia@localhost ~]$
如果防火墙没有开通80端口,也是要开通的,以上文的方式开通,因为同样都是80端口,此处就不重复写入了。
浏览器访问验证:
http://宿主机IP:80
null模式
使用nginx镜像来验证,此处也需要停止上面建立的nginx容器,本来是不需要的,但是我们这里要做验证,所以需要停止,使用null模式启动的容器,自己是一个完全独立的环境:
语法:
docker run -d --net=none nginx
实例:
[yunweijia@localhost ~]$ sudo docker run -d --net=none nginx
5f73c16b7cdbf3e32d755b6cc1f4a28875ea734c6f916d03422b19f8d67429bf
[yunweijia@localhost ~]$
[yunweijia@localhost ~]$ sudo docker ps
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
5f73c16b7cdbnginx"/docker-entrypoint.…"5 seconds agoUp 4 secondsboring_cohen
[yunweijia@localhost ~]$
浏览器访问:
http://宿主机IP:80
可以看到在我们容器启动之后,浏览器也无法访问nginx,且如果我们进入容器中,他和谁也无法进行网络通信,但是nginx镜像为了控制镜像的大小,没有安装ping命令,故而我们再启动一个centos容器来进行验证,如下:
[yunweijia@localhost ~]$ sudo docker run -it --net=none centos:7 /bin/bash
[root@5b4d026a5a2c /]# ping 192.168.112.130
connect: Network is unreachable
[root@5b4d026a5a2c /]# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.045 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.050 ms
^C
--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.045/0.047/0.050/0.007 ms
[root@5b4d026a5a2c /]# ping www.baidu.com
ping: www.baidu.com: Name or service not known
[root@5b4d026a5a2c /]# exit
exit
[yunweijia@localhost ~]$
从上面可以看到只能通信本身的回环地址。
contain模式
先使用bridge模式,后台启动一个centos容器,然后再使用contain模式,启动其他容器:
PS:这里不得不再写两句,因为我就在这里就卡了一下子,尽管之前文章中也写到了,但是这里再次强调下。如果你的宿主机可以联网,且你使用brideg模式启动了容器,但是这个容器无法联网的话,第一,检查下路由转发是否打开了;第二,检查下selinux是否关闭了,如果前两项有问题,但是你改好了,容器也重启了,还是无法联网,那么你重启下docker服务,就行了,就可以联网了,一定要检查好,别急,稳住。
[yunweijia@localhost ~]$ sudo docker run -d centos:7 /bin/bash -c "while true;
do echo yunweijia;
sleep 5;
done"
8dac7ae5ce12e7aefca6c0640bf3a0504193ba2760324bae06d161e004452ebb
[yunweijia@localhost ~]$ sudo docker exec -it 8dac7a /bin/bash
[root@8dac7ae5ce12 /]# yum -y install net-tool
[root@8dac7ae5ce12 /]# ifconfig
eth0: flags=4163<
UP,BROADCAST,RUNNING,MULTICAST>
mtu 1500
inet 172.17.0.2netmask 255.255.0.0broadcast 172.17.255.255
ether 02:42:ac:11:00:02txqueuelen 0(Ethernet)
RX packets 13047bytes 21842754 (20.8 MiB)
RX errors 0dropped 0overruns 0frame 0
TX packets 8534bytes 464490 (453.6 KiB)
TX errors 0dropped 0 overruns 0carrier 0collisions 0
lo: flags=73<
UP,LOOPBACK,RUNNING>
mtu 65536
inet 127.0.0.1netmask 255.0.0.0
looptxqueuelen 1000(Local Loopback)
RX packets 0bytes 0 (0.0 B)
RX errors 0dropped 0overruns 0frame 0
TX packets 0bytes 0 (0.0 B)
TX errors 0dropped 0 overruns 0carrier 0collisions 0
[root@8dac7ae5ce12 /]#
从上面可以看到容器的IP是172.17.0.2,那么我们接下来使用contain方式再启动一个nginx容器:
语法:
docker run -d --net=container:有独立IP地址的容器ID或者名字 镜像名
实例:
[yunweijia@localhost ~]$ sudo docker run -d --net=container:8dac7 nginx
1078238592dcc63307271595ecdddf1b19281b802a57b28edd61b072bb1854c0
[yunweijia@localhost ~]$ sudo docker ps
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
1078238592dcnginx"/docker-entrypoint.…"13 seconds agoUp 12 secondsaffectionate_merkle
8dac7ae5ce12centos:7"/bin/bash -c while…"11 minutes agoUp 11 minutessweet_keller
[yunweijia@localhost ~]$
然后我们curl一下centos的容器IP看下结果:
[yunweijia@localhost ~]$ curl http://172.17.0.2
<
!DOCTYPE html>
<
html>
<
head>
<
title>
Welcome to nginx!<
/title>
<
style>
htmlcolor-scheme: light dark;
bodywidth: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
<
/style>
<
/head>
<
body>
<
h1>
Welcome to nginx!<
/h1>
<
p>
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.<
/p>
<
p>
For online documentation and support please refer to
<
a href="http://nginx.org/">
nginx.org<
/a>
.<
br/>
Commercial support is available at
<
a href="http://nginx.com/">
nginx.com<
/a>
.<
/p>
<
p>
<
em>
Thank you for using nginx.<
/em>
<
/p>
<
/body>
<
/html>
[yunweijia@localhost ~]$
我们访问的centos容器,为什么出来了nginx的界面呢?当然是访问到nginx容器里面的nginx了呀,这个也证明了使用contain方式启动的容器,共享同一个容器IP。
至于为什么不用浏览器访问?那是因为我容器的IP地址只能和宿主机交互啊,如果你要使用浏览器访问,你就给他配置一个你浏览器能访问通的IP地址就行了。
【09-docker系列-docker网络你了解多少(下)】至此,docker网络介绍结束,下面我们将介绍下docker的容器文件共享和特权模式。
推荐阅读
- AWS EKS 详细升级流程
- Linux下玩转nginx系列——nginx配置文件说明
- #yyds干货盘点#spring-cloud-kubernetes背后的三个关键知识点
- 准时下班系列!Excel合集之第6集—如何拆分和统计单据金额
- 带你十天轻松搞定 Go 微服务系列
- #yyds干货盘点#公司规定所有接口都用 POST请求,这是为什么()
- 想说爱你不容易 | 使用最小 WEB API 实现文件上传(Swagger 支持)#yyds干货盘点#
- spring cloud alibaba 组件版本关系 以及 毕业版本依赖关系
- #yyds干活盘点# 3 Css3 的背景