Docker容器二

容器的虚拟化网络;

Docker的四种网络模型:

Docker安装完成后,会自动创建三个网络,可使用“docker network ls”命令查看

QQ截图20180801190328

默认创建的是bridge网桥的方式:

QQ截图20180801201317

 

四种模式:

1 . null 无网卡的无网络模式,容器不需要和外界相连

2 . bridge 桥接式 ,直接桥接到docker0网卡上。(默认使用的方法)

3 .联盟式网络:让各个容器之间关于网络方面的名称空间是共用一个名称空间,然后再桥接到物理网卡上

4 . docker容器都直接共用,物理网卡上。

查看网络信息的命令:

docker network inspect bridge (查看bridge网络的信息)

docker container inspect web2   (查看某个容器的网络信息)

QQ截图20180801203048

docker bridge 网络:

宿主机会自动创建docker0 网段,以后创建的每个容器都是docker0网段的IP地址,他们之间可以相互连接的。宿主机上的docker0就像一个虚拟的交换机,将各个容器相互连接起来。

Docker0为NAT桥,因此容器一般获得的是私有网络地址 。

QQ截图20180801174954

每启动一个docker容器就会生成一对网卡,一个在宿主机上,一个在容器上。如下图:

宿主机生成的网卡:(并将其关连到docker0的网卡上)
QQ截图20180801191557

每个docker容器里生成的网卡及IP地址:

QQ截图20180801191618

每个docker容器里的网卡都可以ping通到宿主机的内网的IP地址,和外网的IP地址。

每创建一个docker容器就会生成一个iptables规则,将容器内的地址做转换,可以访问到外网。

 

docker bridge网络下的容器的几种网络模式:

1 .在同一个宿主机上的不同容器之间的访问:

如果有一个docker容器的nginx的服务,在另一个docker容器里应该是可以访问到nginx容器的nginx的web服务.

2 . 在宿主机上访问nginx容器的nginx的web服务。也是可以的。

3 . 另一台物理机要访问nginx容器的nginx的web服务器。无法直接访问,需要做地址关连,将nginx容器的IP地址关连到本地的内网或者外网的IP地址上去,这样外部的物理机就可以访问容器虚拟机的IP地址了。

暴露端口和地址的四种模式:

例1:

宿主机上有一台提供web服务的容器,现在需要从另一台物理机访问此宿主机上的提供web服务的容器。在创建容器的时候需要将端口号暴露出来。(宿主机不指定端口也不指定IP)

docker run –name tt –rm -it -p 80 magedu/http:1.0   (magedu/http:为本机创建的http的镜像文件)

此时已将web容器的http服务的80端口号暴露出来了,关连到宿主机上了,但关联的宿主机的端口是随便的,所以在宿主机上查看生成的iptables的规则,来看关连到宿主机上的哪个端口上了。

默认是将容器里的IP虚拟地址关连到宿主机上的所有的IP地址上的。

iptables -t nat -vnL

QQ截图20180802200309

此时在另一台物理机上就可以通过宿主机的网卡来访问web容器的http服务了

curl 192.168.60.3:32768

也可以使用此命令docker port tt (在宿主机上查看tt容器暴露的端口)

当容器关掉之后,iptables的规则自动清除,宿主机随机关连的端口号也清除了。

例2:

将容器的IP虚拟地址关连到宿主机上指定的某一个IP上。(在浏览器上输入宿主机的指定的IP地址但端口号是随机的需要查看来获得才可以访问到)宿主机指定IP但不指定端口

docker run –name tt –rm -it -p 192.168.60.20::80 magedu/http:1.0

(192.168.60.20::80   :前面的地址为宿主机上的IP地址;::两个冒号之间为宿主机关连到容器上的端口号没写为随机端口  80为容器上要关连服务的端口号)

QQ截图20180802204433

在宿主机上查看端口是否将容器的IP地址关连到宿主机上指定的IP地址。

例3:

将宿主机上指定的IP和指定的端口关连到虚拟机的IP地址上。(在浏览器上输入宿主机指定的IP和指定的端口号才可以访问到容器上)宿主机指定端口也指定IP

docker run –name tt –rm -it -p 192.168.60.20:80:80 magedu/http:1.0

例4:

不指定宿主机关连到容器的IP地址,但指定宿主机使用的端口号。(在浏览器上访问宿主机的所有IP地址,但端口号必须是指定的80;都可以连接到容器上)宿主机指定端口但不指定IP

docker run –name tt –rm -it -p 80:80 magedu/http:1.0

 

 

 创建网络名称空间,和虚拟网卡,并使其通信

 ip netns add r1

ip netns add r2   (创建两个网络名称空间;在linux界面上执行)

ip link add name veth1.1 type veth peer name veth1.2  (创建两个虚拟网卡对;在linux界面上执行))

QQ截图20180801204651

默认都没有被激活,使用ifconfig是看不见这两个网卡的。使用ip link 来查看。

ip link set dev veth1.2 netns r1  (把一个虚拟网卡移到刚创建的网络名称空间里)

ip netns exec r1 ifconfig -a  (此时查看r1的网络名称空间,发现有了一个虚拟网卡)

QQ截图20180801205153

ip netns exec r1 ip link set dev veth1.2 name eth0  (可以将网卡名改为常用的网卡名称)

QQ截图20180801205443

ifconfig veth1.1 10.0.0.1/24 up  (将宿主机的里刚创建的一个虚拟网卡给个地址并激活)

此时在次查看宿主机上创建的虚拟网卡发现已经有了地址。

ifconfig:

QQ截图20180801205828

ip netns exec r1 ifconfig eth0 10.0.0.2/24 up  (将网络名称r1中的虚拟网卡激活并给个IP地址)

ip netns exec r1 ifconfig  (再次啥看发现已经有IP地址了)

QQ截图20180801210234

此时用宿主机来ping网络空间的虚拟IP地址:ping 10.0.0.2  (可以通的)

 

如果将在宿主机上的虚拟网卡移动到创建的网络名称空间r2里去,r1和r2两个名称空间就可以通信了。

ip link set dev veth1.1 netns r2

ip netns exec r2 ifconfig veth1.1 10.0.0.3/24 up  (将移进到网络名称空间r2的虚拟网卡添加地址并且激活)

ip netns exec r2 ifconfig   (查看网络名称空降r2已经有了地址)

ip netns exec r2 ping 10.0.0.2  (在r2网络名称空间里去pingr1的IP地址)

 

 

创建各种网络模式的容器:

docker run –name f1 -it –rm busybox:latest  (创建一个busybox容器,退出后并删掉)

docker run –name f1 -it –network none –rm busybox:latest  (创建一个null模式的容器)

QQ截图20180801214226

docker run –name f1 -it –network none -h t1.magedu –rm busybox:latest  (创建容器时,指定容器的主机名)

docker run –name f1 -it –network none -h t1.magedu –dns 8.8.8.8 –rm busybox:latest  (创建容器时指定dns服务器的地址)

QQ截图20180801215243

docker run –name f1 -it –network none -h t1.magedu –add-host www.magedu.com:192.168.7.7 –rm busybox:latest   (指定hosts文件的dns解析地址)

 

创建一个使用共同虚拟网卡的两个容器:

docker run –name tt –rm -it magedu/http:1.0 (首先在宿主机上创建一个容器)

查看上面容器的IP地址:

在相同的宿主机上在创建一个和tt共用虚拟地址的容器:

docker run –name tt1 –network container:tt –rm -it magedu/http:1.0

此时在查看tt1的虚拟IP地址,发现和tt的虚拟IP地址是相同的。

此时两个容器共享一个虚拟IP地址,通过本容器的本地地址127.0.0.1可以相互来连接。

创建一个使用共同物理网卡的两个容器:

docker run –name tt1 –network host –rm -it magedu/http:1.0

docker run –name tt –network host –rm -it magedu/http:1.0

以上两个容器直接关连到宿主机上的所有的物理网卡上了。此时在浏览器上就可以直接访问容器里的虚拟机了,因为容器里的虚拟机的IP地址和宿主机的IP地址是相同的。

简单的配置虚拟机的http服务的主页面:

echo "hell" > /tmp/index.html  (创建一个主页面)

httpd -h /tmp/   (启动的时候指定主页面的路径)

此时在浏览器上访问宿主机的IP地址,就能看到容器提供http服务的页面。

 

指定bridge 的IP地址,不使用系统默认172.17.0.0/16的IP地址:

停止docker服务:systemctl stop docker

vim /etc/docker/daemon.json  (编辑添加加速器的配置文件)

QQ截图20180802215219

systemctl start docker

查看新生成的网卡:

QQ截图20180802215157

 

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/104362

(1)
上一篇 2018-08-01 10:07
下一篇 2018-08-01 19:21

相关推荐

  • 基于lamp(源码)搭建blog

    lamp架构搭建blog(源码) 安装环境:2台主机,centos7.5 host1:192.168.67.115   httpd php host2:192.168.67.111   mariadb 安装包: apr-1.6.3.tar.gz apr-util-1.6.1.tar.gz httpd-2.4.33.tar.bz2 php-7.1.18.tar…

    2018-07-02
  • 学习笔记(13)

    学习笔记(13)

    Linux笔记 2018-04-30
  • Linux启动和内核管理

    系统启动和内核管理 Linux组成 Linux:kerne+rootfs(应用程序) kernel:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能 roots:程序和glibc 函数:相当于命令的集合 库:函数集合,function,调用接口(头文件负责描述) 过程调用:procedure,无返回值 函数调用:function 程序:二进制执行文…

    Linux笔记 2018-05-13
  • LVS负载均衡基础

    LVS负载均衡基础

    Linux笔记 2018-05-23
  • yum运用

    随便写写,大佬勿喷

    Linux笔记 2018-04-20
  • 磁盘存储和文件系统

    磁盘存储和文件系统: 磁盘设备的文件命名:/dev/dev_file虚拟磁盘:/dev/vd磁盘标识: /dev/sda,/dev/sdb……磁盘分区:/dev/sda1,/dev/sdb2…… chs 磁盘sector 扇区 512bytestrack 磁道head 磁头cylinder柱面 使用磁盘: 分区创建文件系统:格式化挂载:分配目录名 hexdu…

    Linux笔记 2018-05-20