您的位置:首页 > 运维架构 > Docker

docker持久化和网络

2018-01-04 16:08 405 查看

docker持久化和网络

实验环境

操作系统:CentOS Linux release 7.3.1611 (Core)

docker版本:17.11.0-ce


容器持久化

可以使用docker的数据卷功能,绕过ufs,提供给容器一个特殊的目录。类似于Linux系统中对目录进行挂载操作。

可将主机的目录挂载至容器中:

下面将主机的/docker-volume目录挂载至容器的/opt目录:

[root@localhost /]# docker run -it -v /docker-volume:/opt  --name dba_test  ubuntu bash


尝试在容器的/opt目录下创建测试文件目录mytest,发现同步到了主机的/docker-volume目录下:

root@af44a62ac873:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@af44a62ac873:/# mkdir -p /opt/mytest
root@af44a62ac873:/# exit
exit
[root@localhost /]# ls /docker-volume/
mytest


同样的尝试在主机的/docker-volume目录下创建测试文件目录mytest2,发现也同步到了容器的/opt目录下:

[root@localhost /]# mkdir /docker-volume/mytest2
[root@localhost /]# docker exec -it dba_test bash
Error response from daemon: Container af44a62ac873424f69ed43ee0e2b4e2222dd1f86aeac4a404e8a0c93b7e4392b is not running
[root@localhost /]# docker start dba_test
dba_test
[root@localhost /]# docker exec -it dba_test bash
root@af44a62ac873:/# ls /opt
mytest  mytest2


docker网络

Docker 的网络实现其实就是利用了 Linux 上的网络命名空间和虚拟网络设备(特别是 veth pair)。

Docker 中的网络接口默认都是虚拟的接口。虚拟接口的优势之一是转发效率较高。 Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发,发送接口的发送缓存中的数据包被直接复制到接收接口的接收缓存中。对于本地系统和容器内系统看来就像是一个正常的以太网卡,只是它不需要真正同外部网络设备通信,速度要快很多。

Docker 创建一个容器的时候,会执行如下操作:

1.创建一对虚拟接口,分别放到本地主机和新容器中;

2.本地主机一端桥接到默认的 docker0 或指定网桥上,并具有一个唯一的名字,如 veth76264c9;

3.容器一端放到新容器中,并修改名字作为 eth0,这个接口只在容器的命名空间可见;

4.从网桥可用地址段中获取一个空闲地址分配给容器的 eth0,并配置默认路由到桥接网卡 veth76264c9。

完成这些之后,容器就可以使用 eth0 虚拟网卡来连接其他容器和其他网络

可以在 docker run 的时候通过 –net 参数来指定容器的网络配置,有4个可

选值:

–net=bridge 这个是默认值,连接到默认的网桥。

–net=host 告诉 Docker 不要将容器网络放到隔离的命名空间中,即不要容器化容器内的网络。此时容器使用本地主机的网络,它拥有完全的本地主机接口访问权限。容器进程可以跟主机其它 root 进程一样可以打开低范围的端口,可以访问本地网络服务比如 D-bus,还可以让容器做一些影响整个主机系统的事情,比如重启主机。因此使用这个选项的时候要非常小心。如果进一步的使用 –privileged=true ,容器会被允许直接配置主机的网络堆栈。

–net=container:NAME_or_ID 让 Docker 将新建容器的进程放到一个已存在容器的网络栈中,新容器进程有自己的文件系统、进程列表和资源限制,但会和已存在的容器共享 IP 地址和端口等网络资源,两者进程可以直接通过lo 环回接口通信。

–net=none 让 Docker 将新容器放到隔离的网络栈中,但是不进行网络配置。之后,用户可以自己进行配置

以桥接为例

创建测试容器,默认使用桥接模式。查看其网络状况:

[root@localhost ~]# docker run -it --name net_test1  mysql /bin/bash
root@378c5ef501bf:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever


观察到容器内创建了eth0@if11,尝试在容器内ping主机:

root@378c5ef501bf:/# ping 192.168.58.133
PING 192.168.58.133 (192.168.58.133): 56 data bytes
64 bytes from 192.168.58.133: icmp_seq=0 ttl=64 time=0.199 ms
64 bytes from 192.168.58.133: icmp_seq=1 ttl=64 time=0.068 ms
^C--- 192.168.58.133 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.068/0.134/0.199/0.066 ms


容器可以ping到主机端,退出并启动容器,查看主机端网络情况:

root@378c5ef501bf:/# exit
exit
[root@localhost ~]# docker start net_test1
net_test1

[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:b3:82:40 brd ff:ff:ff:ff:ff:ff
inet 192.168.58.133/24 brd 192.168.58.255 scope global dynamic ens33
valid_lft 1201sec preferred_lft 1201sec
inet6 fe80::92:a88e:49d:6dd2/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
link/ether 52:54:00:f2:06:76 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
link/ether 52:54:00:f2:06:76 brd ff:ff:ff:ff:ff:ff
5: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:31:55:af:13 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:31ff:fe55:af13/64 scope link
valid_lft forever preferred_lft forever
13: veth76264c9@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether 26:4c:91:7d:93:89 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::244c:91ff:fe7d:9389/64 scope link
valid_lft forever preferred_lft forever


发现多了个veth76264c9@if12,这个就是主机端的虚拟端口,查看其详细信息:

[root@localhost ~]# ethtool -S veth76264c9
NIC statistics:
peer_ifindex: 12
[root@localhost ~]# brctl  show
bridge name bridge id       STP enabled interfaces
docker0     8000.02423155af13   no      veth76264c9
virbr0      8000.525400f20676   yes     virbr0-nic
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  docker