docker中的网络与数据卷

前言:

           我们知道在bridge模式下容器没有一个共有的ip,只有宿主机可

以进行直接访问,外部主机是不可见的,但是通过宿主机的NAT规则后

可以实现对外网的访问,本篇博客将深入了解到docker中的网络。

 

正文:

我们以ubuntu镜像作为实验

 

进行镜像的导入

[root@server2 docker镜像]# docker load -i ubuntu.tar    ###进行镜像的导入
[root@server2 docker镜像]# docker images     ###进行镜像的查看

 

进行镜像的查看

 

 

进行docker中容器网络的类型的查看(默认情况下使用的是桥接)

[root@server2 docker镜像]# docker network ls
[root@server2 docker镜像]# ip addr show

 

 

模式一:桥接模式

进行容器的运行

[root@server2 docker镜像]# docker run -it --name vm1 ubuntu   ###进行容器的运行
root@6732c9485d7d:/# ip addr show    ###在容器中进行网络的查看

 

 

进行桥接状态和网络ip的查看

[root@server2 docker镜像]# yum install bridge-utils -y    ###进行工具软件的安装
[root@server2 docker镜像]# brctl show                     ###进行娇怯的查看
[root@server2 docker镜像]# ip addr show                   ###进行网络的查看

 

进行软件的安装

 

进行桥接的查看

 

进行网络的查看

 

 

通过设定使虚拟机可以上网,在容器中进行测试

[root@server2 docker镜像]# ping www.baidu.com      ###进行网络的测试
[root@server2 docker镜像]# docker attach vm1       ###进行容器的进入
root@6732c9485d7d:/# ping www.baidu.com           ###在容器中进行网络的测试

 

进行网络的测试

 

在容器中进行网络的测试

在桥接模式下,通过宿主机的NAT进行容器外网的连接

 

模式二:host模式

host模式下可以让容器共享宿主机网络栈,这样的好

处就是外部主机与容器直接通信,但是容器网络缺少

隔离性。

 

进行容器的建立

[root@server2 docker镜像]# docker run -it --name vm2 --network=host ubuntu  ###进行容器的创建
root@server2:/# ping www.baidu.com       ###进行网络ping接测试
[root@server2 docker镜像]# brctl show    ###进行桥接状态的查看

 

在真机上进行桥接的查看

发现桥接并没有增加

 

在容器中进行网络的ping接

 

 

模式三:none模式指的是禁用网络功能,只有lo接口,该容器禁止与外网进行通信,

可以存储敏感的数据,例如,密码等。

 

进行none模式下容器的创建

[root@server2 docker镜像]# docker run -it --name vm3 --network=none ubuntu  ###进行容器的创建
root@689cb8e4a3e9:/# ip addr show     ###进行网络的查看

 

模式四:Container,处于该模式下的Docker容器会共享一个网络线,

这样两个容器之间可以使用localhost高效快速的进行通信。

 

进行容器的建立

[root@server2 docker镜像]# docker run -it --name vm4 --network=container:vm1 ubuntu  ###进行容器的建立
root@6732c9485d7d:/# ip addr show    ###进行网络的查看

 

在vm1中进行网络的查看

[root@server2 docker镜像]# docker attach vm1
root@6732c9485d7d:/# ip addr show

 

两个容器公用一个网络线实现通信。

 

link 实现两个容器之间使用容器名称可以进行通信

进行容器的建立

[root@server2 docker镜像]# docker run -it --name vm5 --link vm1:db1 ubuntu   ###进行容器的建立
root@f2fd2e3efb5b:/# cat /etc/hosts     ###进行解析的查看

 

进行容器之间互通的测试

root@f2fd2e3efb5b:/# ping vm1
root@f2fd2e3efb5b:/# ping db1

 

 

我们还可以定义自己的网段

 

进行自定义网段的创建

[root@server2 docker镜像]# docker network create my_net1    ###进行网段的创建
[root@server2 docker镜像]# docker network ls     ###进行网络的查看

 

删除之前所有的容器,便于实验测试:

 

 

使用自定义网段进行容器的创建

[root@server2 docker镜像]# docker run -it --name vm1 --network=my_net1 ubuntu
root@0cca8d9e8e48:/# ping vm1   ###进行镜像ping接测试

 

使用该网段进行vm2容器的建立

[root@server2 docker镜像]# docker run -it --name vm2 --network=my_net1 ubuntu  ###进行容器的建立
root@a81740e37c18:/# ping vm1         ###进行网络的ping接测试

 

我们发现,使用同一网段建立的容器可以实现直接通信

 

我们也可以自定义特定的网段

 

进行网段的设定

[root@server2 docker镜像]# docker network create --subnet=172.21.0.0/24 --gateway=172.21.0.1 my_net2     ###进行网段的设定
[root@server2 docker镜像]# docker network ls     ###进行网络的查看

 

使用该网段进行容器的创建

[root@server2 docker镜像]# docker run -it --name vm3 --network=my_net2 --ip=172.21.0.10 ubuntu            ###进行指定ip容器的建立

 

 

那么我们如何进行两个不同网桥之间的通信呢,使用docker network connect

命令为vm1添加一块my_net2的网卡,实现不同网桥之间的通信。

 

对vm3进行网卡的添加

[root@server2 docker镜像]# docker network connect my_net1 vm3   ###进行网卡的添加
[root@server2 docker镜像]# docker attach vm3
root@32c3803f754e:/# ping vm1                 ###进行网络与vm1的ping接

 

两个不同网桥之间的容器实现了连通

 

跨主机网络解决方案macvlan网络方案的实现

我们选用server1和server2上创建的容器,使它们完成通信

 

在server1上进行网卡的添加

 

进行网络配置文件的编辑

[root@server1 docker镜像]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
BOOTPROTO=none
DEVICE=eth1
ONBOOT=yes

 

进行网卡混杂模式的开启

[root@server1 network-scripts]# ip link set eth1 promisc on

 

在server2上进行网卡的添加

 

进行网络配置文件的编辑

[root@server2 network-scripts]# vim /etc/sysconfig/network-scripts/ifcfg-eth1 
BOOTPROTO=none
DEVICE=eth1
ONBOOT=yes

进行网络混杂模式的开启

[root@server2 network-scripts]# ip link set eth1 promisc on

 

 

在server2上进行网络的创建

[root@server2 network-scripts]# docker  network create -d macvlan --subnet=172.22.0.0/24 --gateway=172.22.0.1 -o parent=eth1 macvlan1   ###进行自定义网络的设定
[root@server2 network-scripts]# docker network ls

 

使用该设定的网段进行容器的创建

[root@server2 network-scripts]# docker run -it --name vm1 --network=macvlan1 --ip=172.22.0.10 ubuntu

 

在server1上进行镜像的导入

[root@server1 docker镜像]# docker load -i ubuntu.tar    ###进行镜像的导入

 

进行网段的设定

[root@server1 network-scripts]# docker network  create -d macvlan --subnet=172.22.0.0/24 --gateway=172.22.0.1 -o parent=eth1 macvlan1

 

使用该网段进行容器的建立并进行与server容器的ping接测试

[root@server1 docker镜像]# docker run -it --name vm3 --network=macvlan1 --ip=172.22.0.12 ubuntu
root@e902e2ccc97e:/# ping 172.22.0.11

 

 

Docker数据卷

docker数据卷

   数据卷是目录或文件,不是块设备。

   容器可以读写volume中的数据

   volume数据可以持久化保存

 

docker提供了两种卷

 bind mount

 docker mananged volume

 

bind mount

   是将主机上的目录或文件mount到容器中

    便于理解

    使用 -v 选项指定路径,

 

使用bind mount模式进行容器的建立

[root@server2 ~]# cd /opt/data/
[root@server2 data]# pwd
/opt/data
[root@server2 data]# echo www.redhat.com > index.html
[root@server2 data]# docker run -d --name vm1 -p 80:80 -v /opt/data/:/usr/share/nginx/html nginx     ###进行容器的运行,并进行挂载源的指定和端口的设定
[root@server2 data]# curl localhost
[root@server2 data]# echo www.linux.com >> index.html 
[root@server2 data]# curl localhost
[root@server2 data]# docker inspect vm1     ###进行该容器信息的查看

 

进行该容器信息的查看

 

bind mount 默认权限是读写rw,可以在挂载时候指定只读ro.

-v 选项指定的路径,如果不存在,挂载时会自动创建。

 

[root@server2 data]# docker run -it --name vm2 -v /opt/data/index.html:/data/index.html:ro ubuntu      ###进行容器的运行,并且指定挂载目录
root@cb0a8f9a7342:/data# echo hellworld >> index.html    ###进行文件内容的添加

 

 

docker managed volume模式:

在bind mount模式下,必须指定host文件系统路径,限制了移植性。

docker managed volume 不需要指定mount源.

 

在不指定源挂载目录的情况下进行容器的生成

[root@server2 data]# docker  run -d --name vm1 -p 80:80 -v /usr/share/nginx/html nginx
[root@server2 data]# docker inspect vm1

 

在没有设定挂载的源目录时,系统会自动挂载在指定位置,如果挂载时指向已有

的目录,原有的数据会被复制到volume中

 

在系统默认挂载目录下进行测定

[root@server2 data]# cd /var/lib/docker/volumes/3797778a33d1f7d77625c911978ac0485f849083b79966b0a6fca6f32c6f9d7b/_data
[root@server2 _data]# ls
[root@server2 _data]# curl localhost
[root@server2 _data]# echo westos.com > index.html
[root@server2 _data]# curl localhost

 

 

进行数据卷的创建,使用指定的数据卷进行挂载

[root@server2 ~]# docker volume create vol1   ###进行数据卷进行创建
[root@server2 volumes]# docker run -it --name vm2 -v vol1:/data ubuntu
root@94f11599408c:/# cd /data/
root@94f11599408c:/data# touch files

 

使用该数据卷进行容器的创建,我们设定为只读

[root@server2 volumes]# docker run -it --name vm2 -v vol1:/data:ro ubuntu
root@9b4d554e4956:/# cd /data/
root@9b4d554e4956:/data# ls
root@9b4d554e4956:/data# rm -f files 

 

bind mount 与docker  managed volume的对比

相同点: 两者都是host文件系统中的某个路径

不同点:

                   bind mount docker managed volume
   volume位置          可以任意指定/var/lib/docker/volumes/..
对已有mount point影响       隐藏并替换为volume 原有数据复制到volume
是否支持单个文件                支持  不支持,只能是目录
  权限控制       可设置为只读,默认为读写权限 可以设置为只读
移植性移植性。与host path绑定移植性强,无需指定host目录

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值