四、Docker持久化和网络

Docker从入门到实战-Docker数据持久化

卷:Volume

(1) 创建一个mysql数据库的

docker run -d --name mysql01 -e MYSQL_ROOT_PASSWORD=xiaohuoban mysql

(2) 查看volume

docker volume ls

(3) 具体查看该volume

docker volume inspect
48507d0e7936f94eb984adf8177ec50fc6a7ecd8745ea0bc165ef485371589e8

(4) 名字不好看,name太长,修改一下
"-v mysql01_volume:/var/lib/mysql"表示给上述的volume起一个能识别的名字

(5) 查 看 volume

docker volume ls docker volume inspect mysql01_volume

(6) 真的能够持久化保存数据吗?不妨来做个实验


# 进入容器中

docker exec -it mysql01 bash
# 登录mysql服务

mysql -uroot -pxiaohuoban
# 创建测试库

create database db_test
# 退出mysql服务,退出mysql container
# 删除mysql容器

docker rm -f mysql01
# 查看volume docker volume ls
# 发现volume还在

DRIVER VOLUME NAME local mysql01_volume
# 新建一个mysql container,并且指定使用"mysql01_volume" docker run -d --name test-mysql -v mysql01_volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=xiaohuoban mysql
# 进入容器,登录mysql服务,查看数据库

docker exec -it test-mysql bash mysql -uroot -pxiaohuoban show database;
# 可以发现db_test仍然在

| information_schema | | db_test | | mysql |

绑定挂载:Bind Mounting

(1) 创建一个tomcat容器

docker run -d --name tomcat01 -p 9090:8080 -v
/tmp/test:/usr/local/tomcat/webapps/test tomcat

(2)查看两个目录

centos:cd /tmp/test
tomcat容器:cd /usr/local/tomcat/webapps/test

(3)在centos的/tmp/test中新建1.html,并写一些内容

<p style="color:red; font-size:20pt;">docker nx!</p>

(4)进入tomcat01的对应目录查看,发现也有一个1.html,并且也有内容
(5)在centos7上访问该路径:curl localhost:9090/test/1.html
(6)在win浏览器中通过ip访问

Docker网络模型

docker网络官网 https://docs.docker.com/network/

查看网卡[网络接口]

ip link show
ls /sys/class/net
ip a

网卡

ip a解读

状态:UP/DOWN/UNKOWN等

link/ether:MAC 地 址
inet:绑定的IP地址

配置文件

在Linux中网卡对应的其实就是文件,所以找到对应的网卡文件即可
比如:cat /etc/sysconfig/network-scripts/ifcfg-eth0

给网卡添加IP地址

当然,这块可以直接修改ifcfg-*文件,但是我们通过命令添加试试

(1) ip addr add 192.168.0.100/24 dev eth0
(2) 删除IP地址ip addr delete 192.168.0.100/24 dev eth0

网卡启动与关闭

重启网卡 :service network restart / systemctl restart network

启动/关闭某个网卡 :ifup/ifdown eth0 or ip link set eth0 up/down

Network Namespace

在linux上,网络的隔离是通过network namespace来管理的,不同的network namespace是互 相隔离的ip
netns list:查看当前机器上的network namespace
network namespace的管理
ip netns list #查看
ip netns add ns1 #添加
ip netns delete ns1 #删除

namespace实战

(1)创建一个network namespace

ip netns add ns1

(2) 查看该namespace下网卡的情况

ip netns exec ns1 ip a

(3)启动ns1上的lo网卡

ip netns exec ns1 ifup loorip netns exec ns1 ip link set lo up

(4)再次查看
可以发现state变成了UNKOWN

ip netns exec ns1 ip a

(5) 再次创建一个network namespace

ip netns add ns2
在这里插入图片描述

(6) 此时想让两个namespace网络连通起来
veth pair :Virtual Ethernet Pair,是一个成对的端口,可以实现上述功能
在这里插入图片描述

(7)创建一对link,也就是接下来要通过veth pair连接的link

ip link add veth-ns1 type veth peer name veth-ns2

(8) 查看link情况

ip link

(9) 将veth-ns1加入ns1中,将veth-ns2加入ns2中

ip link set veth-ns1 netns ns1 ip link set veth-ns2 netns ns2

(10)查看宿主机和ns1,ns2的link情况

ip link ip netns exec ns1 ip link ip netns exec ns2 ip link

(11) 此时veth-ns1和veth-ns2还没有ip地址,显然通信还缺少点条件

ip netns exec ns1 ip addr add 192.168.0.11/24 dev veth-ns1 ip netns
exec ns2 ip addr add 192.168.0.12/24 dev veth-ns2

(12)再次查看,发现state是DOWN,并且还是没有IP地址

ip netns exec ns1 ip link ip netns exec ns2 ip link

(13)启动veth-ns1和veth-ns2
(14)再次查看,发现state是UP,同时有IP
(15)此时两个network namespace互相ping一下,发现是可以ping通的

Container的NS

按照上面的描述,实际上每个container,都会有自己的network namespace,并且是独立的,我们可
以进入到容器中进行验证

(1)不妨创建两个container看看?

(2)进入到两个容器中,并且查看ip
(3)互相ping一下是可以ping通的

深入分析container网络-Bridge

docker0默认bridge

(1) 查看centos的网络:ip a,可以发现

4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
group defaultlink/ether 02:42:43:7b:1b:bd brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 
brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft 
foreverinet6 fe80::42:43ff:fe7b:1bbd/64 scope linkvalid_lft forever preferred_lft 
forever8: veth3b72761@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc 
noqueue master docker0state UP group defaultlink/ether 22:a3:13:4d:7f:29 brd 
ff:ff:ff:ff:ff:ff link-netnsid 2inet6 fe80::20a3:1

3ff:fe4d:7f29/64 scope
linkvalid_lft forever preferred_lft forever
(2)查看容器tomcat01的网络:docker exec -it tomcat01 ip a,可以发现

[root@bogon ~]# docker exec -it tomcat01 ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 
65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 
00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft 
forever preferred_lft forever7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 
1500 qdisc noqueue state UP group defaultlink/ether 02:42:ac:11:00:02 brd 
ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.2/16 brd 172.17.255.255 scope 
global eth0valid_lft forever preferred_lft forever

(3) 在centos中ping一下tomcat01的网络,发现可以ping通

ping 172.17.0.2[root@bogon ~]# ping 172.17.0.2PING 172.17.0.2 (172.17.0.2) 56(84) 
bytes of data.64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.120 ms64 bytes 
from 172.17.0.2: icmp_seq=2 ttl=64 time=0.060 ms64 bytes from 172.17.0.2: 
icmp_seq=3 ttl=64 time=0.056 ms

(3) 既然可以ping通,而且centos和tomcat1又属于不同的network namespace,是怎么连接的? 很显
然,跟之前的实战是一样的,画个图
在这里插入图片描述

(4)也就是说,在tomcat01中有一个eth0和centos的docker0中有一个veth3是成对的,类似于之前实战中的veth-ns1和veth-ns2,不妨再通过一个命令确认下:brctl

安装一下:yum install bridge-utilsbrctl show

(5) 那为什么tomcat01和tomcat02能ping通呢?不多说,直接上图
在这里插入图片描述

这种网络连接方法我们称之为Bridge,其实也可以通过命令查看docker中的网络模式:docker network
ls bridge也是docker中默认的网络模式

(6) 不妨检查一下bridge:docker network inspect bridge


```puppet
"Containers": 
{"6ad312b32f62b48935f3c95c58ae061df710bfebbd3d721b467507b9516eeb81": {"Name": 
"tomcat02","EndpointID":"aa9c612c79f867e874d0cae1aab45374373b61e9cdbe79925d07ae2
e89a1cca0","MacAddress": "02:42:ac:11:00:03","IPv4Address": 
"172.17.0.3/16","IPv6Address": 
""},"f49fc396d8e04f2b330163d91bb5d1482715202b4e2fd0c7f42833722787742a": {"Name": 
"tomcat01","EndpointID":"c5440b063e8fc0c9c44f3f61bf68f577283417eb23cfa9a361d3797
3d01a8ba5","MacAddress": "02:42:ac:11:00:02","IPv4Address": 
"172.17.0.2/16","IPv6Address": ""}}

(7)在tomcat01容器中是可以访问互联网的,顺便把这张图画一下咯,NAT是通过iptables实现的
在这里插入图片描述

创建自己的network

(1)创建一个network,类型为bridge
(2)查看已有的network:docker network ls
在这里插入图片描述

(3) 查看tomcat-net详情信息:docker network inspect tomcat-net
(4)创建tomcat的容器,并且指定使用tomcat-net

docker run -d --name custom-net-tomcat --network tomcat-net tomcat

(5)查看custom-net-tomcat的网络信息

docker exec -it custom-net-tomcat ip a

(6) 查看网卡信息

ip a

(7)查看网卡接口

brctl showbridge name bridge id STP enabled interfacesbr-3012e3afd264 8000.02429780e75d no vethf223a4bdocker0 8000.0242437b1bbd no veth3b72761veth9d8c470

(8)此时在custom-net-tomcat容器中ping一下tomcat01的ip会如何?发现无法ping通

docker exec -it custom-net-tomcat ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 
56(84) bytes of data.^C--- 172.17.0.2 ping statistics ---4 packets transmitted, 0 

received, 100% packet loss, time 3000ms
(9) 此时如果tomcat01容器能够连接到tomcat-net上应该就可以咯

docker network connect tomcat-net tomcat01

(10)查看tomcat-net网络,可以发现tomcat01这个容器也在其中

(11)此时进入到tomcat01或者custom-net-tomcat中,不仅可以通过ip地址ping通,而且可以通过名字ping到,这时候因为都连接到了用户自定义的tomcat-net bridge上

docker exec -it tomcat01 bashroot@f49fc396d8e0:/usr/local/tomcat# ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.64 bytes from 
172.18.0.2: icmp_seq=1 ttl=64 time=0.048 ms64 bytes from 172.18.0.2: icmp_seq=2 
ttl=64 time=0.040 msroot@f49fc396d8e0:/usr/local/tomcat# ping custom-nettomcatPING
 custom-net-tomcat (172.18.0.2) 56(84) bytes of data.64 bytes from 
custom-net-tomcat.tomcat-net (172.18.0.2): icmp_seq=1 ttl=64 time=0.030 ms64 
bytes from custom-net-tomcat.tomcat-net (172.18.0.2): icmp_seq=2 ttl=64 
time=0.264 ms

但是ping tomcat02是不通的

root@f49fc396d8e0:/usr/local/tomcat# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 
56(84) bytes of data.64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.045 ms64 
bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.066 
msroot@f49fc396d8e0:/usr/local/tomcat# ping tomcat02PING tomcat02 (220.250.64.26) 
56(84) bytes of data.

深入分析Container网络-Host & None

Host

(1) 创建一个tomcat容器,并且指定网络为none

docker run -d --name my-tomcat-host --network host tomcat

(2) 查看ip地址

docker exec -it my-tomcat-host ip a可以发现和centos是一样的

(3) 检查host网络

"Containers": {   
"e1f00d47db344b6688e99c0f5b393e232309fbe1a4d9c3fc3e1ce7c107f3312d": {   "Name": 
"my-tomcat-host",   "EndpointID":   
"f08456d9dca024cf6f911f8d32329ba2587ea89554c96b77c32698ace6998525",   
"MacAddress": "",   "IPv4Address": "",   "IPv6Address": ""   }}
None

(1) 创建一个tomcat容器,并且指定网络为none

docker run -d --name my-tomcat-none --network none tomcat

(2) 查看ip地址

docker exec -it my-tomcat-none ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc 
noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 
00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft 
forever

(3) 检查none网络

"Containers": 
{"bb3f0db4fa76a25b5377da9c3bbf087ac7ef0de0a3f9c37a4ae959983d33105c": {"Name": 
"my-tomcatnone","EndpointID":"26055c08c968f9d6d03d10b3b66dfea004c35f5d2bd4067a2306566973e9
2f9e","MacAddress":
 "","IPv4Address": "","IPv6Address": ""}}

端口映射及折腾

端口映射

(1) 创建一个tomcat容器,名称为port-tomcat

docker run -d --name port-tomcat tomcat

(2) 思考一下要访问该tomcat怎么做?肯定是通过ip:port方式

docker exec -it port-tomcat bashcurl localhost:8080

(3) 那如果要在centos7上访问呢?

docker exec -it port-tomcat ip a ---->得到其ip地址,比如172.17.0.4curl 
172.17.0.4:8080

小结 :之所以能够访问成功,是因为centos上的docker0连接了port-tomcat的network namespace
(4) 那如果要在centos7通过curl localhost方式访问呢?显然就要将port-tomcat的8080端口映射到centos上

docker rm -f port-tomcatdocker run -d --name port-tomcat -p 8090:8080 tomcatcurl localhost:8090

折腾

(1) centos7是运行在win10上的虚拟机,如果想要在win10上通过ip:port方式访问呢?

#此时需要centos和win网络在同一个网段,所以在Vagrantfile文件中#这种方式等同于桥接网络。也可以 给该网络指定使用物理机哪一块网卡,比如#config.vm.network"public_network",:bridge=>'en1:
Wi-Fi (AirPort)'config.vm.network"public_network"centos7: ip a —

192.168.8.118win10:浏览器访问 192.168.8.118:9080

(2) 如果也想把centos7上的8090映射到win10的某个端口呢?然后浏览器访问localhost:port

#此时需要将centos7上的端口和win10上的端口做映射

config.vm.network"forwarded_port",guest:8098,host:8090#记得vagrant
reload生效一下

win10:浏览器访问localhost:8098

画个图强化一下

什么?上面的过程还是觉得有些难理解?不急,画个图展现一下

在这里插入图片描述

多机之间的container通信[放到Docker warm中详细聊]

在同一台centos7机器上,发现无论怎么折腾,我们一定有办法让两个container通信。 那如果是在两台

centos7机器上呢?画个图
在这里插入图片描述

(1)使得两边的eth0能够通信
(2)前提要确保spring-boot-project container和mysql container的 IP地址不一样
(3)将spring-boot-project中的所有信息当成eth0要传输给另外一端的信息
(4)具体通过 vxlan技术实现www.evoila.de/2015/11/06/what-is-vxlan-and-how-it-works
(5)处在vxlan的底层:underlay处在xxlan的上层:overlay

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值