Docker--数据管理与网络通信
一、Docker网络模式
1.Docker容器的虚拟网关
- loopback:回环网卡、TCP/IP网卡是否生效
- virtual bridge: linux
自身继承了一个虚拟化功能(kvm架构),是原生架构的一个虚拟化平台,安装了一个虚拟化平台之后就会系统就会自动安装虚拟网卡
(示例:安装workstation ( 虚拟化平台)之后,会在网络适配器中会多出VMnet1、VMnet8、VMnet0) - docker 0:容器的网关,绑定物理网卡,负责做NAT地址转换、端口映射;docker0本身也是一种容器
- veth对:一组虚拟设备,用户连接两个不同的名称空间;宿主机内就是veth
2.Docker的四种网络模式
网络模式 | 配置 | 说明 |
---|---|---|
host | -net=host | 容器与宿主机共享一个网络名称空间和网络协议栈 |
container | -net=container:NAME or ID | 多个容器之间共享一个网络名称空间 |
none | -net=none | 容器有独立的网络名称空间,但并没有对其进行任何网络设置,如分配veth pair和网桥连接,配置IP等。 |
bridge | -net=bridge | 默认模式 |
3.Docker自定义网络
1.查看网络列表
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
61f9a3e2fe20 bridge bridge local
ee12ee86017c host host local
4b1fadbec794 none null local
2. 自定义网络
语法:
docker network create --subnet 指定的子网网段 子网网段名称
[root@localhost ~]# docker network create --subnet 172.100.0.1/16 subnet01
557f7e1b4e7eeb0b5b4e7ca3c553357311a12362d77da642763b459f984443f8
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
61f9a3e2fe20 bridge bridge local
ee12ee86017c host host local
4b1fadbec794 none null local
557f7e1b4e7e subnet01 bridge local
[root@localhost ~]# ifconfig
br-557f7e1b4e7e: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.100.0.1 netmask 255.255.0.0 broadcast 172.100.255.255
ether 02:42:3d:05:5d:c8 txqueuelen 0 (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
3.创建容器时指定固定的IP
语法:
docker run -[ i ,t ,d] --name 容器名称 --net 指定的网络名称 --ip 指定的网络名称的子网IP 需要运行的镜像 [运行环境:/bin/bash /bin/sh /bin/init]
[root@localhost ~]# docker run -itd --name centos01 --net subnet01 --ip 172.100.0.2 centos:7 /bin/bash
649ad109b1df291bf69713c1c0e3cd3bd3745c1544e61b48fd13a5db1e0d653d
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
649ad109b1df centos:7 "/bin/bash" 17 seconds ago Up 16 seconds centos01
查看IP:
[root@localhost ~]# docker inspect centos01 | grep "IPAdd"
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.100.0.2",
4. 暴露端口
语法:
docker run -d --name 容器名称 -P 镜像:标签 // -P 表示随机暴露一个端口个宿主机(范围49153-65535)
[root@localhost ~]# docker run -d --name nginx_01 -P nginx:new
e688ca6256d3f636e472b91a9e5e503b0e66965c4824f4aca796d7e797ee5669
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e688ca6256d3 nginx:new "/bin/sh -c nginx" 7 seconds ago Up 6 seconds 0.0.0.0:49154->80/tcp, :::49154->80/tcp nginx_01
649ad109b1df centos:7 "/bin/bash" 3 minutes ago Up 3 minutes centos01
访问网页:
5.容器互联
容器互联是通过容器的名称在容器间建立一条专门网络通信隧道,从而实现容器得互联。简单的说就是在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息
在运行docker run 时使用 --link 选项可以实现容器之间得互联。
格式为 --link name:alias
其中 name 是需要连接得容器名称 alias 是这个连接得别名
注意点:容器互联是通过容器名称来实现的,–name可以给容器创建一个名称(唯一),如果已经命名了一个相同名称的容器,当要再次使用这个容器名称的时候,需要先删除之前创建的同名的容器。
1.创建源容器
[root@localhost ~]# docker run -d -P --name web1 httpd:latest
2f1172193ea1ac14624954e08ffd8bf703bd593b51c24419afdc362b0468e8af
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f1172193ea1 httpd:latest "httpd-foreground" About a minute ago Up About a minute 0.0.0.0:49155->80/tcp, :::49155->80/tcp web1
649ad109b1df centos:7 "/bin/bash" 3 hours ago Up 3 hours centos01
2.创建接收容器
[root@localhost ~]# docker run -d -P --name web2 --link web1:web1 httpd:latest
9d185936a4ce752b83fbec1293b628569d10bcd756b7489f6ba6dbaee4621a5d
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d185936a4ce httpd:latest "httpd-foreground" 19 seconds ago Up 18 seconds 0.0.0.0:49156->80/tcp, :::49156->80/tcp web2
2f1172193ea1 httpd:latest "httpd-foreground" 6 minutes ago Up 6 minutes 0.0.0.0:49155->80/tcp, :::49155->80/tcp web1
649ad109b1df centos:7 "/bin/bash" 3 hours ago Up 3 hours centos01
3.测试容器互联
[root@localhost ~]# docker exec -it web2 /bin/bash
root@9d185936a4ce:/usr/local/apache2# ping web1
bash: ping: command not found //提示没有ping命令
root@9d185936a4ce:/usr/local/apache2# apt-get update && apt-get install iputils-ping //下载ping命令
root@9d185936a4ce:/usr/local/apache2# ping web1
PING web1 (172.17.0.2) 56(84) bytes of data.
64 bytes from web1 (172.17.0.2): icmp_seq=1 ttl=64 time=0.073 ms
64 bytes from web1 (172.17.0.2): icmp_seq=2 ttl=64 time=0.063 ms
64 bytes from web1 (172.17.0.2): icmp_seq=3 ttl=64 time=0.055 ms
64 bytes from web1 (172.17.0.2): icmp_seq=4 ttl=64 time=0.068 ms
二、数据卷和数据卷容器
在Docker中,为了方便查看容器内产生的数据或者将多个容器中的数据实现共享,就涉及到容器的数据管理操作。
管理Docker容器中数据主要有两种方式:数据卷和数据卷容器。
1.数据卷
简介:
数据卷是一个供容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于Linux下对目录进行的mount操作。
1.创建数据卷
语法:
docker run -v [name1] -v [name2] … --name 容器名称 镜像名称:标签
-v 可以在容器中创建数据卷,多个 -v 可以创建多个
下面使用centos镜像创建一个名为centos01的容器,并且创建两个数据卷分别挂载到/data1和/data2目录上。:
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker run -itd -v /data1 -v /data2 --name centos01 centos:7 /bin/bash
8de223442fe8e0798f3ed42b596fe7f3685346c9804e86965253ea31c000c0db
进入容器
[root@localhost ~]# docker exec -it centos01 /bin/bash
[root@8de223442fe8 /]# ll
total 12
-rw-r--r--. 1 root root 12114 Nov 13 2020 anaconda-post.log
lrwxrwxrwx. 1 root root 7 Nov 13 2020 bin -> usr/bin
drwxr-xr-x. 2 root root 6 Sep 7 16:45 data1
drwxr-xr-x. 2 root root 6 Sep 7 16:45 data2
2.挂载主机目录作为数据卷
语法:
docker run -v /宿主机目录1:/容器目录1 -v /宿主机目录2:/容器目录2 … --name 容器名称 镜像名称:标签
-v 可以在容器中创建数据卷,多个 -v 可以创建多个
注意:挂载的宿主机本地目录必须是绝对路径,如果宿主机没有,会自动的创建改目录,容器中也是一样
创建容器centos02 并将宿主机的 /data1 /data2 目录挂载到容器的 /data1 /data2 的目录上
[root@localhost ~]# docker run -itd -v /data1:/data1 -v /data2:/data2 --name centos02 centos:7
8bb35eeebcddc08ae33923567f1587aae849cef08854cf7ad068c09dfb42dc9c
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8bb35eeebcdd centos:7 "/bin/bash" 4 minutes ago Up 4 minutes centos02
8de223442fe8 centos:7 "/bin/bash" 11 minutes ago Up 11 minutes centos01
宿主机查看是否创建了挂载目录
[root@localhost ~]# cd /
[root@localhost /]# ls
bin data data2 etc lib media opt root sbin sys usr
boot data1 dev home lib64 mnt proc run srv tmp var
在宿主机挂载的目录中创建文件并追加内容
[root@localhost /]# cd data1
[root@localhost data1]# ls
[root@localhost data1]# echo "hello" >> 1.txt
[root@localhost data1]# cd ../data2
[root@localhost data2]# echo "world" >> 1.txt
进入容器查看是否同步
[root@localhost data1]# docker exec -it centos02 /bin/bash
[root@8bb35eeebcdd /]# ls
anaconda-post.log data1 dev home lib64 mnt proc run srv tmp var
bin data2 etc lib media opt root sbin sys usr
[root@8bb35eeebcdd /]# cd data1
[root@8bb35eeebcdd data1]# cat 1.txt
hello
[root@8bb35eeebcdd data1]# cat /data2/1.txt
world
2.数据卷容器
如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器就是一个普通的容器,专门提供数据卷给其他容器挂载使用。
方法如下:
先创建一个容器作为数据卷容器,之后在其他容器创建时用–volumes-from挂载数据卷容器中的数据卷使用。
使用之前创好的centos02作为数据卷容器。创建centos03
[root@localhost data1]# docker run -itd --volumes-from centos02 --name centos03 centos:7 /bin/bash
19b4903b7797820c009da0296427a5591f658a44563d4a54fe3f4f4f26fcf142
进入容器centos03 查看文件是否同步
[root@localhost data1]# docker exec -it centos03 /bin/bash
[root@19b4903b7797 /]# ls
anaconda-post.log data1 dev home lib64 mnt proc run srv tmp var
bin data2 etc lib media opt root sbin sys usr
[root@19b4903b7797 /]# cd data1
[root@19b4903b7797 data1]# ls
1.txt
[root@19b4903b7797 data1]# cat 1.txt
hello
[root@19b4903b7797 data1]# cat ../data2/1.txt
world