Docker学习笔记17

这篇具有很好参考价值的文章主要介绍了Docker学习笔记17。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

跨主机容器间网络:

实现跨主机容器间通信的工具:

1)Pipework

2)Flannel

3)Weave

4)Open V Switch (OVS)

5)Calico

1. Weave:

在每个宿主机上布置一个特殊的route的容器,不同宿主机的route容器连接起来,route拦截所有普通容器的ip请求,并通过udp包发送到其它宿主机上的普通容器。这样在跨机的多个容器端看到的就是同一个扁平网络。

weave解决网络问题,不过部署依然是单机的。在生产环境不建议使用。

2. flannel的思路:

是针对K8s设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一得虚拟IP地址。但是默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配。这样导致的一个问题是,不同节点上容器可能获得相同的内外IP地址。并使这些容器之间能够通过IP地址相互找到,也就是相互ping通。

Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且“不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

Flannel实质上是一种“覆盖网络overlay network”,即表示运行在一个网上的网(应用层网络),并不依靠IP地址来传递消息,而是采用一种映射机制把IP地址和identifiers(标识)做映射来资源定位。也就是将TCP数据包装在另一种网络包(UDP包)里面进行路由转发和通信,目前已支持UDP、VxLAN(隧道协议)、AWS VPC和GCE路由等数据转发方式。

原理:

每个主机配置一个IP段和子网个数。例如:可以配置一个覆盖网络使用10.10.0.0/16段。因此主机A可以接受10.10.1.0/24,主机B可以接受10.10.2.0/24的包。flannel使用etcd来维护分配的子网到实际的IP地址之间的映射。对于数据路径,flannel使用UDP来封装IP数据报,转发到远程主机。选择UDP作为转发协议是因为它能穿透防火墙。

flannel使用etcd存储配置数据和子网分配信息。flannel启动之后,后台进程首先检索配置和正在使用的子网列表,然后选择一个可用的子网,尝试去注册它。

etcd也存储这个每个主机对应的IP。flannel使用etcd的watch机制监视/coreos.com/network/subnets下面所有元素的变化信息,并且根据它来维护一个路由表。

etcd:相当于一个路由数据库。

Flannel默认的节点间数据通信方式是UDP转发。

Flannel工作原理总结:

1)是overlay network,即覆盖性网络;

2)通过etcd保存子网信息及网络分配信息;

3)给每台Docker host主机分配一个网段;

4)通过UDP传输数据包。

应用部署案例:

1)环境:

IP地址 部署软件 节点 功能
192.168.17.10 etcd、flannel、docker node1 主控端(通过etcd)
192.168.17.20 flannel、docker node2 被控端

2)修改配置:

修改主机名:

hostnamectl set-hostname node1
hostnamectl set-hostname node2

修改/etc/hosts文件,添加如下内容:

192.168.17.10 node1
192.168.17.10 etcd
192.168.17.20 node2

然后是Disable SELinux和关闭防火墙。

2)安装软件:

node1:

yum install -y etcd flannel

node2:

yum install -y flannel

3)软件配置:

node1:

etcd的配置:

Docker学习笔记17,Docker容器,docker

说明:

配置文件修改的两个地方的配置:

1)ETCD_LISTEN_CLIENT_URLS 监听客户端地址,0.0.0.0表示的是任何服务器。

2)ETCD_ADVERTISE_CLIENT_URLS: 通知客户端地址,etcd表示的是本地IP地址。

3)如果是集群的时候,ETCD_NAME,我们可能会取,但是这里只是default。

Advertise 英文:广告、通知的意思。

systemctl start etcd

systemctl enable etcd

[root@node1 ~]# ss -anput |grep 2379
tcp    ESTAB      0      0      127.0.0.1:33322              127.0.0.1:2379                users:(("etcd",pid=22429,fd=12))
tcp    LISTEN     0      128    [::]:2379               [::]:*                   users:(("etcd",pid=22429,fd=6))
tcp    ESTAB      0      0        [::ffff:127.0.0.1]:2379                 [::ffff:127.0.0.1]:33322               users:(("etcd",pid=22429,fd=15))
[root@node1 ~]# ss -anput |grep 4001
tcp    ESTAB      0      0      127.0.0.1:46916              127.0.0.1:4001                users:(("etcd",pid=22429,fd=13))
tcp    LISTEN     0      128    [::]:4001               [::]:*                   users:(("etcd",pid=22429,fd=7))
tcp    ESTAB      0      0        [::ffff:127.0.0.1]:4001                 [::ffff:127.0.0.1]:46916               users:(("etcd",pid=22429,fd=14))


或者:
ps -ef |grep etcd

lsof -i:2379
lsof -i:4001

测试etcd能否存取数据:

[root@node1 ~]# etcdctl set testdir/testkey0 0
0
[root@node1 ~]# etcdctl get testdir/testkey0
0

说明:给testdir目录下的testkey0这个键设置一个值为0,然后获取这个键值,get获取到值,就说明成功了。

集群健康检查:

[root@node1 ~]# etcdctl -C http://etcd:4001 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379
cluster is healthy
[root@node1 ~]# etcdctl -C http://etcd:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379
cluster is healthy

说明etcd集群可用。

flannel配置:

vim /etc/sysconfig/flanneld


# Flanneld configuration options

# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://etcd:2379"

# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="/atomic.io/network"

# Any additional options that you want to pass
#FLANNEL_OPTIONS=""

说明:

1)只要修改FLANNEL_ETCD_ENDPOINTS: http://etcd:2379

2)记得默认前缀/atomic.io/network

注意:

配置etcd中关于flannel的key(这个只是在安装了etcd的服务器上操作。)flannel使用etcd进行配置,来保证多个flannel实例之间的配置一致性,所以需要在etcd上进行如下配置('/atomic.io/network/config’ 这个key与上文/etc/sysconfig/flanneld中的配置项FLANNEL_ETCD_PREFIX是相对应的,错误的话,启动就会出错。)

[root@node1 ~]# etcdctl mk /atomic.io/network/config '{ "Network": "172.20.0.0/16" }'
{ "Network": "172.20.0.0/16" }

[root@node1 ~]# etcdctl get /atomic.io/network/config
{ "Network": "172.20.0.0/16" }

mk是创建的意思。

键值对,花括号,前面有空格,后面有空格,保证格式正确。

我已经把我的网络存储到etcd数据库中了。

 

上面flanneld设置的IP网段可以任意设定,随便设定一个网段都可以。容器的IP就是根据这个网段进行自动分配的,IP分配后,容器一般是可以对外联网的(网桥模式,只要宿主机能上网就可以。)

systemctl enable flanneld
systemctl start flanneld

[root@node1 ~]# ps -ef |grep flannel
root      33524      1  0 22:59 ?        00:00:00 /usr/bin/flanneld -etcd-endpoints=http://etcd:2379 -etcd-prefix=/atomic.io/network
root      33568  22392  0 22:59 pts/0    00:00:00 grep --color=auto flannel
systemctl restart docker

启动flannel后,一定要记得重启下docker,这样flannel配置分配的IP地址才能生效,即docker0虚拟网卡的IP会变成上面flannel设定的IP段。

[root@node1 ~]# ip a s

4: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none
    inet 172.20.77.0/16 scope global flannel0
       valid_lft forever preferred_lft forever
    inet6 fe80::cce6:6c20:e949:808b/64 scope link flags 800
       valid_lft forever preferred_lft forever
[root@node1 ~]#

这台机器分配的IP地址:172.20.77.0/16网段。

实现flannel和docker进行结合:

第一步:找子网subnet信息:

[root@node1 ~]# cat /run/flannel/subnet.env
FLANNEL_NETWORK=172.20.0.0/16
FLANNEL_SUBNET=172.20.77.1/24   # 使用
FLANNEL_MTU=1472                # 使用
FLANNEL_IPMASQ=false
[root@node1 ~]#

 说明:flannel总的网络:172.20.0.0/16, flannel_subnet:172.20.77.1/24对应的子网。给这个docker主机分配的。

flannel_mtu: 1472 ,网络最大传输单元。以太网最大传输1500个字节。

flannel网卡。

第二步:配置Docker  daemon:

vim /etc/docker/daemon.json

{
    "registry-mirrors": ["https://dmshd3ad.mirror.aliyuncs.com"],
    "bip": "172.20.77.1/24",
    "mtu": 1472
}

字符串加引号。

第三步:重启docker:

systemctl restart docker

第四步:验证容器网络:

[root@node1 ~]# ip a

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:36:76:9d:4c brd ff:ff:ff:ff:ff:ff
    inet 172.20.77.1/24 brd 172.20.77.255 scope global docker0
       valid_lft forever preferred_lft forever
4: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none
    inet 172.20.77.0/16 scope global flannel0
       valid_lft forever preferred_lft forever
    inet6 fe80::cce6:6c20:e949:808b/64 scope link flags 800
       valid_lft forever preferred_lft forever

我们可以看到docker0的网络IP地址发生了变化,变成了172.20.77.1/24。因为我们更改了daemon.json。

第五步:启动容器来验证:

docker run -it centos:latest /bin/bash

然后可以通过docker inspect命令检查容器的IP地址,可以看到ip地址发生了变化。

node2:

配置flannel:

vim /etc/sysconfig/flanneld

# Flanneld configuration options

# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://etcd:2379"

# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="/atomic.io/network"

# Any additional options that you want to pass
#FLANNEL_OPTIONS=""

重启flannel:

[root@node2 ~]# systemctl enable flanneld
Created symlink from /etc/systemd/system/multi-user.target.wants/flanneld.service to /usr/lib/systemd/system/flanneld.service.
Created symlink from /etc/systemd/system/docker.service.wants/flanneld.service to /usr/lib/systemd/system/flanneld.service.
[root@node2 ~]# systemctl start flanneld

看下flannel的地址:

[root@node2 ~]# ip a

4: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none
    inet 172.20.15.0/16 scope global flannel0
       valid_lft forever preferred_lft forever
    inet6 fe80::fd82:3b17:2e11:647f/64 scope link flags 800
       valid_lft forever preferred_lft forever
[root@node2 ~]#

随机分配的IP地址,没有规律。

配置flannel与docker结合:

第一步:获取flannel的subnet的子网信息:

[root@node2 ~]# cat /run/flannel/subnet.env
FLANNEL_NETWORK=172.20.0.0/16
FLANNEL_SUBNET=172.20.15.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false

第二步:配置Docker daemon

[root@node2 ~]# cat /etc/docker/daemon.json
{
    "registry-mirrors": ["https://dmshd3ad.mirror.aliyuncs.com"],
    "bip": "172.20.15.1/24",
    "mtu": 1472
}

第三步:重启docker:

systemctl restart docker

第四步:验证ip地址:

[root@node2 ~]# ip a

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:15:70:f3:1b brd ff:ff:ff:ff:ff:ff
    inet 172.20.15.1/24 brd 172.20.15.255 scope global docker0
       valid_lft forever preferred_lft forever
4: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none
    inet 172.20.15.0/16 scope global flannel0
       valid_lft forever preferred_lft forever
    inet6 fe80::fd82:3b17:2e11:647f/64 scope link flags 800
       valid_lft forever preferred_lft forever
[root@node2 ~]#
[root@node2 ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED          STATUS          PORTS     NAMES
2770a33acb5d   centos:latest   "/bin/bash"   35 seconds ago   Up 33 seconds             hardcore_cohen
[root@node2 ~]# docker inspect 2770
[
    {
        "Id": "2770a33acb5d52a98423918edc85701bb0cb330a674b08e75d52f67171e439ab",
        "Created": "2023-07-05T16:01:49.534350157Z",
        "Path": "/bin/bash",

可以看到docker的IP地址是172.20.15.2IP地址。

第五步:验证

分别在node1和node2创建容器,观察容器的IP地址情况。

[root@node1 ~]# docker exec c0055 ping -c 4 172.20.15.2
PING 172.20.15.2 (172.20.15.2) 56(84) bytes of data.

--- 172.20.15.2 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3001ms

[root@node1 ~]#

注意事项:

 

如果发现各容器内分配的IP地址相互ping不通,可能由于防火墙问题引起的,执行下面操作。

iptables -nL

iptables -P FORWARD ACCEPT
iptables -P INPUT ACCEPT

iptables -F

iptables -nL

说firewalld工具关闭了,iptables没有进行规则清空,防火墙其实是关闭不掉的,是内核中的netfilter是无法关闭的。我们把两个工具惊醒关闭或者清空处理即可。

修改防火墙规则之后,可以看到立即就ping通了。文章来源地址https://www.toymoban.com/news/detail-524898.html

[root@node1 ~]# docker exec c0055 ping -c 4 172.20.15.2
PING 172.20.15.2 (172.20.15.2) 56(84) bytes of data.
64 bytes from 172.20.15.2: icmp_seq=1 ttl=60 time=0.841 ms
64 bytes from 172.20.15.2: icmp_seq=2 ttl=60 time=0.474 ms
64 bytes from 172.20.15.2: icmp_seq=3 ttl=60 time=0.876 ms
64 bytes from 172.20.15.2: icmp_seq=4 ttl=60 time=3.21 ms

--- 172.20.15.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 0.474/1.349/3.206/1.083 ms
[root@node1 ~]#
[root@node2 ~]# docker exec 2770 ping -c 4 172.20.77.2
PING 172.20.77.2 (172.20.77.2) 56(84) bytes of data.
64 bytes from 172.20.77.2: icmp_seq=1 ttl=60 time=0.654 ms
64 bytes from 172.20.77.2: icmp_seq=2 ttl=60 time=1.20 ms
64 bytes from 172.20.77.2: icmp_seq=3 ttl=60 time=0.808 ms
64 bytes from 172.20.77.2: icmp_seq=4 ttl=60 time=1.44 ms

--- 172.20.77.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 0.654/1.025/1.443/0.314 ms
[root@node2 ~]#

到了这里,关于Docker学习笔记17的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ubantu docker学习笔记(九)容器监控 自带的监控+sysdig+scope+cAdvisor+prometheus

    监控,这一个词对于我们开发人员已经习以为常,我们通过对于内存、IO、CPU等性能的监控去判断当前运行状态的情况,容器作为一个已经打包好的虚拟环境亦是如此,特别是多个容器运行,需要收集docker各容器的运行状态和运行信息,本章将进行容器监控,第三方容器监控

    2024年02月06日
    浏览(58)
  • 【docker笔记】Docker容器数据卷

    卷就是目录或者文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除是删除其挂载的数据卷

    2024年02月02日
    浏览(43)
  • docker笔记9:Docker-compose容器编排

    目录 1.是什么? 2. 能干嘛? 3.去哪下? 4.安装步骤  ​编辑 5.卸载步骤   6.Compose核心概念  6.1概念 6.2 Compose常用命令   7.Compose编排微服务 7.1改造升级微服务工程docker_boot 7.2不用Compose 7.2.1 单独的mysql容器实例 7.3 swagger测试 7.4上面成功了,有哪些问题? 7.5 使用Compose  7.5.1

    2024年02月09日
    浏览(49)
  • 尚硅谷Docker实战教程-笔记06【Docker容器数据卷】

    尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】 视频地址:尚硅谷Docker实战教程(docker教程天花板)_哔哩哔哩_bilibili 尚硅谷Docker实战教程-笔记01【理念简介、官网介绍、平台入门图解、平台架构图解】 尚硅谷Docker实战教程-笔记02【安装docker、镜像加速器配置

    2024年02月16日
    浏览(49)
  • Docker笔记 容器的数据卷

    大家好 我是积极向上的湘锅锅💪💪💪 思考: Docker容器删除后,在容器中产生的数据还在吗? 答案是不在了,数据存放在容器中,如果将容器删除,数据也会被一并删除 Docker容器和外部机器可以直接交换文件吗? 答案是不行,因为外部机器与docker内部之间是不互通的,但

    2024年02月15日
    浏览(40)
  • Docker容器常用命令笔记分享

    Docker是一个开源的应用容器引擎,可以让开发者将应用程序及其依赖打包成一个可移植的容器,然后发布到任何支持Docker的机器上,实现应用程序在不同环境中的一致性运行。相比传统的虚拟化技术,Docker具有更轻量级、更快速、更高效的特点。使用Docker可以方便地创建、部

    2024年03月17日
    浏览(50)
  • docker学习:docker容器管理

    Docker 是一种开源的容器化平台,可以帮助开发人员和系统管理员更轻松地创建、部署和运行应用程序。它利用 Linux容器技术,将应用程序及其依赖项打包成一个可移植的容器,以便在不同的环境中运行,从而实现应用程序的快速部署和可移植性。 1、直接拉取别人构建好的官

    2024年02月11日
    浏览(36)
  • docker学习16-Docker 容器设置时区

    最近遇到一个问题,在本机部署操作时,获取本机当前时间存到mysql数据库,时间是当前北京时间没问题。 但是用Docker 容器部署项目,发现时间少了8个小时,于是想到是docker容器的内部时区问题。 docker 容器一般是debian系统,默认是UTC标准时间 或者先删除localtime 再给软链接

    2024年02月13日
    浏览(46)
  • (docker)mysql镜像拉取-创建容器-容器的使用【个人笔记】

    容器的第一次创建,需要先下载镜像,从 0、可以搜索镜像的版本 1、先拉取MySQL的镜像,默认拉取最新版,使用下面的命令拉取mysql镜像 也可以指定mysql的版本(我这里指定的是5.6版本) 2、在~(/root)目录下创建一个mysql的文件夹,用于保存mysql产生的数据,并进入mysql文件 在/

    2024年02月13日
    浏览(47)
  • 尚硅谷Docker-笔记12:Compose容器编排

    Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器。 docker建议我们每一个容器中只运行一个服务,因为docker容

    2024年01月18日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包