成功最有效的方法就是向有经验的人学习!

Docker技术剖析Docker网络配置

–net=none:告诉docker将容器放在自己的网络中,但是不要配置他的网络

1.我们先用dockerfile来做一个镜像
[root@localhost ~]# mkdir  /dockerhttp
[root@localhost ~]# cd /dockerhttp/

[root@localhost dockerhttp]# vim Dockerfile—-cat 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@localhost 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
运行过程。。

Docker技术剖析Docker网络配置

Docker技术剖析Docker网络配置

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

[root@localhost dockerhttp]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              http                1a3c652de0d3        35 seconds ago      298.8 MB
docker.io/centos    centos6             cf2c3ece5e41        14 months ago       194.6 MB

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

[root@localhost dockerhttp]# docker run -it –net=none docker.io/centos:centos6 /bin/bash
[root@e8c9a7f79c5d /]# 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:1
RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

Docker技术剖析Docker网络配置

Docker技术剖析Docker网络配置

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

[root@localhost ~]# pid=$(docker inspect -f ‘{{.State.Pid}}’ e8c9a7f79c5d)
[root@localhost ~]# echo $pid
7071

Docker技术剖析Docker网络配置

Docker技术剖析Docker网络配置

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

Docker技术剖析Docker网络配置

Docker技术剖析Docker网络配置

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

[root@localhost ~]# ip addr show  docker0
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 02:42:e7:5b:59:d9 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:e7ff:fe5b:59d9/64 scope link
valid_lft forever preferred_lft forever

Docker技术剖析Docker网络配置

Docker技术剖析Docker网络配置

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

[root@localhost ~]# ip link add A type veth peer name B
[root@localhost ~]# brctl addif docker0 A
[root@localhost ~]# ip link set A up
[root@localhost ~]# ifconfig
A: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
ether 5e:4f:81:09:05:a9  txqueuelen 1000  (Ethernet)
RX packets 0  bytes 0 (0.0 B)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 0  bytes 0 (0.0 B)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Docker技术剖析Docker网络配置

Docker技术剖析Docker网络配置

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

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

Docker技术剖析Docker网络配置

Docker技术剖析Docker网络配置

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

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

Docker技术剖析Docker网络配置

Docker技术剖析Docker网络配置

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

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

1)首先启动两个容器

[root@localhost ~]# docker run -it –rm –net=none docker.io/centos:centos6 /bin/bash
[root@0d6f4effa9e4 /]#

[root@localhost ~]# docker run -it –rm –net=none centos:http /bin/bash
[root@bccc80bdb01f /]#
2)找到它的进程号,然后创建网络名字空间的跟踪文件。

[root@localhost ~]# pid=$(docker inspect -f ‘{{.State.Pid}}’ bccc80bdb01f)
[root@localhost ~]# echo $pid
43265
[root@localhost ~]# pid=$(docker inspect -f ‘{{.State.Pid}}’ 0d6f4effa9e4)
[root@localhost ~]# echo $pid
43473

[root@localhost ~]# ln -s /proc/43265/ns/net /var/run/netns/43265
[root@localhost ~]# ln -s /proc/43473/ns/net /var/run/netns/43473

Docker技术剖析Docker网络配置

Docker技术剖析Docker网络配置

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

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

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

Docker技术剖析Docker网络配置

Docker技术剖析Docker网络配置

3、DNS&HOSTNAME自定义

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

Docker技术剖析Docker网络配置

Docker技术剖析Docker网络配置

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

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

Docker技术剖析Docker网络配置

Docker技术剖析Docker网络配置

容器互联

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

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

[root@localhost ~]# docker run -dit –name dbserver docker.io/centos:centos6
68d442dba94449098e99d082dbcfb177cd60bf4ce0d99c582f8a67af4eb0dd18
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS              PORTS               NAMES
68d442dba944        docker.io/centos:centos6   “/bin/bash”         5 seconds ago       Up 3 seconds                            dbserver

Docker技术剖析Docker网络配置

Docker技术剖析Docker网络配置

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

[root@localhost ~]# docker run -dit -P –name web –link dbserver:dbserver docker.io/centos:centos6
90a3de330154f94b9f35575025f7cd1de96a317322543b015ecab6386331d303

Docker技术剖析Docker网络配置

Docker技术剖析Docker网络配置

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

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

Docker技术剖析Docker网络配置

Docker技术剖析Docker网络配置

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

Docker技术剖析Docker网络配置

Docker技术剖析Docker网络配置

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

1 2
赞(0) 打赏
未经允许不得转载:陈桂林博客 » Docker技术剖析Docker网络配置
分享到

大佬们的评论 抢沙发

全新“一站式”建站,高质量、高售后的一条龙服务

微信 抖音 支付宝 百度 头条 快手全平台打通信息流

橙子建站.极速智能建站8折购买虚拟主机

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册