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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值