Docker技术剖析--docker网络配置详解(二)

注意:

    

点击打开链接:可以查看Docker技术剖析--docker网络配置(一)

1.我们先用dockerfile来做一个镜像

[root@kang ~]# mkdir /dockerhttp
[root@kang ~]# cd /dockerhttp/
[root@kang dockerhttp]# vim Dockerfile
FROM cf2c3ece5e41
RUN yum install -y httpd  iputils-20160308
RUN sed -i 's/#Servername www.example.com:80/Servername www.yankai.com/g' /etc/httpd/conf/httpd.conf
expose 80
cmd ["/usr/sbin/http"]

[root@kang dockerhttp]# docker build -t="centos:http" . 
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM cf2c3ece5e41
 ---> cf2c3ece5e41
Step 2 : RUN yum install -y httpd  iputils-20160308
 ---> Running in e01f47cbef22

运行过程

运行结束后我们查看image镜像,看看是否有我们创建的http



下面通过配置一个以--net=none启动的容器,使他达到和平常一样具有访问网络的权限。


[root@kang dockerhttp]# docker run -it --net=none docker.io/centos:centos6 /bin/bash
[root@ceff839945d9 /]# ifconfig 



在开启一个终端,查找这个容器的进程id号。然后创建它的命名空间,后面的ip netns会用到的


[root@kang ~]# pid=$(docker inspect -f '{{.State.Pid}}' ceff839945d9)  
[root@kang ~]# echo $pid
30740


我们创建一个/var/run/netns目录。如下:


检查桥接网卡的ip地址和子网掩码


[root@kang ~]# ip addr show docker0
5: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:03:75:42:3d brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:3ff:fe75:423d/64 scope link 
       valid_lft forever preferred_lft forever


这时候我创建一对peer接口A和B,绑定A到网桥并且启用它。如下:


[root@kang ~]# ip link add A type veth peer name B
[root@kang ~]# brctl addif docker0 A
[root@kang ~]# ip link set A up 
[root@kang ~]# ifconfig 


将B放在容器的网络命名空间,命名为eth0,配置一个空闲的ip地址。如下;


[root@kang ~]# ip link set B netns $pid
[root@kang ~]# ip netns exec $pid ip link set dev B name eth0
[root@kang ~]# ip netns exec $pid ip link set eth0 up
[root@kang ~]# ip netns exec $pid ip addr add 172.17.0.100/16 dev eth0
[root@kang ~]# ip netns exec $pid ip route add default via 172.17.0.1


以上红色箭头不要在意,由于手抖导致输错。

配置完成之后我们就可以像平时一样使用网络了,我们查看一下ip地址


注意:当你退出容器后,docker清空容器,容器eth0随网络命名空间一起被摧毁A接口自动从docker0取消注册

所有的东西被全部清除

2、创建一个点对点的连接。简单理解:A到B

(1)首先启动两个容器


[root@kang ~]#  docker run -it --rm --net=none docker.io/centos:centos6 /bin/bash
[root@d84117c21ca9 /]# exit
exit
[root@kang ~]#  docker run -it --rm --net=none centos:http /bin/bash
[root@f1160d08722f /]# exit
exit
[root@kang ~]# 

(2)找到它的进程号,然后创建网络名字空间的跟踪文件。


[root@kang ~]# pid=$(docker inspect -f '{{.State.Pid}}' 107b8b7028a1)
[root@kang ~]# echo $pid
32895
[root@kang ~]# pid=$(docker inspect -f '{{.State.Pid}}' 49ba1eb036c5)  
[root@kang ~]# echo $pid
32955
[root@kang ~]# ln -s /proc/32895/ns/net  /var/run/netns/32895
[root@kang ~]# ln -s /proc/32955/ns/net  /var/run/netns/32955
[root@kang ~]# 


接下来创建一对peer接口,然后配置路由 其实和上边的步骤一样。


[root@kang ~]# ip link  add A type veth peer name B
[root@kang ~]# ip link set A netns 43265
[root@kang ~]# ip netns exec 43265 ip addr add 10.1.1.1/32 dev A
[root@kang ~]# ip netns exec 43265 ip link set A up
[root@kang ~]# ip netns exec 43265 ip route add 10.1.1.2/32 dev A
[root@kang ~]# ip link set B netns 43473
[root@kang ~]# ip netns exec 43473 ip addr add 10.1.1.2/32 dev B
[root@kang ~]# ip netns exec 43473 ip link set B up
[root@kang ~]# ip netns exec 43473 ip route add 10.1.1.1/32 dev B

现在这2个容器就可以相互ping通,并且成功建立连接,点对点链路不需要子网掩码


3、DNS&HOSTNAME自定义

它利用虚拟文件来挂在到容器的相关配置文件,在容器中使用mount命令可以看到挂载信息:


如果想要手动指定容器的配置,可以用-h HOSTNAME or --hostname=HOSTNAME来设定容器的主机名。它会被写到/etc/hostname 和/etc/host。但它在容器的外部是看不到的,不会再docker ps中显示。


[root@kang ~]# docker run -it -h docker.kangserver  --name  docker.kangserver docker.io/centos:centos6 
[root@docker /]# hostname 
docker.kangserver
[root@docker /]# cat /etc/hostname 
docker.kangserver
[root@docker /]# 


容器互联

使用--link参数可以让容器之间安全的进行交互。

下面我们创建一个新的数据库容器


[root@kang ~]# docker run -dit --name dbserver docker.io/centos:centos6 


然后创建一个新的web容器,并且将它连接到db容器


[root@kang ~]# docker run -dit -P --name web --link dbserver:dbserver docker.io/centos:centos6 
00d31c8ffa01d471f65f92f06f0d0b15ddaff81840b0f50ed8531e21e5d65b2e
[root@kang ~]# 


link是标记的格式:Link name:alias,name是我们要链接容器的名称,alias是这个链接的别名。

使用docker ps来查看容器的连接


docker会添加子容器的host信息到父容器的/etc/hosts的文件

下面是父容器web的hosts文件


这里有两个hosts,第一个是web容器用id作为他的主机名,第二个是dbserver容器的ip地址和主机名,可以在web中安装ping命令来跟dbserver容器的链通。


到这里有关Docker技术剖析--docker网络配置就演示完毕了希望对你有所帮助!!!!再见!!!!!再见再见再见











猜你喜欢

转载自blog.csdn.net/kangshuo2471781030/article/details/79355910