1、使用的
镜像sudo docker pull networkboot/dhcpd2、测试的局域网拓扑结构如下:h为 DHCP
服务器,ovs交换机s1、s2、s3各连着一台等待分配ip地址的主机。3、h DHCP服务器通过一对暴露于root namespace 的veth pair相连,具体操作如下 3.1、生成交换机s1、s2、s3sudo ovs-vsctl add-br s1sudo ovs-vsctl add-br s2sudo ovs-vsctl add-br s3 3.2、创建veth pair 即 v1-v2sudo ip link add v1 type veth peer name v23.3、**upsudo ip link set dev v1 upsudo ip link set dev v2 up 3.4、给v1配置ip及子网掩码sudo ifconfig v1 192.168.1.254 netmask 255.255.255.0 3.5、生成DHCP服务器,监听v1 ,挂载本地data文件夹,data里面中只有dhcpd.conf文件 sudo docker run -it \--rm --net host \--init \--name=dhcpServer1 \-v ~/emxbook/docker-dhcpd/data:/data \networkboot/dhcpd v1 dhcpd.confsubnet 192.168.1.0 netmask 255.255.255.0 {option routers 192.168.1.1option subnet-mask 255.255.255.0option domain-name "emx.local"option domain-name-servers 8.8.8.8range 192.168.1.2 192.168.1.100} 3.5、将v2连接到交换机上sudo ovs-vsctl add-port s1 v2 3.6、交换机s1、s2、s3彼此相连sudo ovs-vsctl add-port s1 s1p1sudo ovs-vsctl set Interface s1p1 type=patchsudo ovs-vsctl set Interface s1p1 options:peer=s2p1sudo ovs-vsctl add-port s2 s2p1sudo ovs-vsctl set Interface s2p1 type=patchsudo ovs-vsctl set Interface s2p1 options:peer=s1p1sudo ovs-vsctl add-port s1 s1p2sudo ovs-vsctl set Interface s1p2 type=patchsudo ovs-vsctl set Interface s1p2 options:peer=s3p1sudo ovs-vsctl add-port s3 s3p1sudo ovs-vsctl set Interface s3p1 type=patchsudo ovs-vsctl set Interface s3p1 options:peer=s1p2 3.7、创建主机h1、h2、h3,并将其连接到交换机上,其中ubunut:5是添加了基本net-tools、isc-dhcp-client,创建的时候记得使用 --cap-add=NET_ADMINsudo docker run -itd --network=none --name=h1 --cap-add=NET_ADMIN ubuntu:5sudo docker run -itd --network=none --name=h2 --cap-add=NET_ADMIN ubuntu:5sudo docker run -itd --network=none --name=h3 --cap-add=NET_ADMIN ubuntu:5sudo ovs-docker add-port s1 eth1 h1sudo ovs-docker add-port s2 eth1 h2sudo ovs-docker add-port s3 eth1 h3 3.8、可以使用floot-light控制交换机s1、s2、s3交换机(选择)sudo ovs-vsctl set-controller s1 tcp:127.0.0.1:6653sudo ovs-vsctl set-controller s2 tcp:127.0.0.1:6653sudo ovs-vsctl set-controller s3 tcp:127.0.0.1:66534、使用dhclient eht1 向DHCP服务器申请 4.1、申请ip之前4.2、申请ip(服务器端界面)4.3申请ip之后,h1(192.168.1.38):同理,h2(192.168.1.39):h3(192.168.1.40): 5、测试 5.1、h1 ping h2(192.168.1.39): 5.2、h2 ping h3(192.168.1.40): 6、最后拓扑结构图,ip分配之后的拓扑结构:DHCP服务器(192.168.1.6)、h1(192.168.1.38)、h2(192.168.1.39)、h3(192.168.1.40) 7、代码汇总参考sudo ovs-vsctl add-br s1sudo ovs-vsctl add-br s2sudo ovs-vsctl add-br s3sudo ip link add v1 type veth peer name v2sudo ip link set dev v1 upsudo ip link set dev v2 upsudo ifconfig v1 192.168.1.6 netmask 255.255.255.0sudo docker run -it \--rm --net host \--init \--name=dhcpServer \-v ~/emxbook/docker-dhcpd/data:/data \networkboot/dhcpd v1sudo ovs-vsctl add-port s1 v2sudo ovs-vsctl add-port s1 s1p1sudo ovs-vsctl set Interface s1p1 type=patchsudo ovs-vsctl set Interface s1p1 options:peer=s2p1sudo ovs-vsctl add-port s2 s2p1sudo ovs-vsctl set Interface s2p1 type=patchsudo ovs-vsctl set Interface s2p1 options:peer=s1p1sudo ovs-vsctl add-port s1 s1p2sudo ovs-vsctl set Interface s1p2 type=patchsudo ovs-vsctl set Interface s1p2 options:peer=s3p1sudo ovs-vsctl add-port s3 s3p1sudo ovs-vsctl set Interface s3p1 type=patchsudo ovs-vsctl set Interface s3p1 options:peer=s1p2sudo docker run -itd --network=none --name=h1 --cap-add=NET_ADMIN ubuntu:5sudo docker run -itd --network=none --name=h2 --cap-add=NET_ADMIN ubuntu:5sudo docker run -itd --network=none --name=h3 --cap-add=NET_ADMIN ubuntu:5sudo ovs-docker add-port s1 eth1 h1sudo ovs-docker add-port s2 eth1 h2sudo ovs-docker add-port s3 eth1 h3sudo ovs-vsctl set-controller s1 tcp:127.0.0.1:6653sudo ovs-vsctl set-controller s2 tcp:127.0.0.1:6653sudo ovs-vsctl set-controller s3 tcp:127.0.0.1:6653
Docker 是一个开源的 应用容器引擎 ,让 开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化 。容器是完全使用沙箱机制,相互之间不会有任何接口。
由于本地开发好的程序往往都需要部署到服务器上进行运行,这就导致了程序需要运行在不同的环境上,这通常是一个令人头痛的事情。在过去,开发团队需要清楚的告诉运维部署团队,其所使用的全部配置文件+所有软件环境。不过,即便如此,仍然常常发生部署失败的状况。
于是乎, 虚拟化 技术应运而生。开发团队将开发好的程序在虚拟机上运行,这样就能解决运维的问题。但是由于虚拟机技术过重的特性导致了其 资源占用多、冗余步骤多以及启动慢的缺陷 。而这个时候 一种新的虚拟化技术搭配上容器化的思想 的产品便出现了,而它就是Docker。
下图是虚拟机技术和容器化技术架构的对比。我们可以得出以下总结:
[图片上传失败...(image-efadd2-1643314980201)]
]( https://upload-images.jianshu.io/upload_images/646931-4b1431b77887632f.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
于是乎相比于虚拟机技术,容器化技术具有以下 优势:
相关网站
如下图所示,Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。服务器端分为Docker daemon, Image和Container三个部分。此外还有Docker Registry。
下面首先来介绍一下Docker中的主要概念
Docker的运行原理如下:客户端可以将docker命令发送到服务器端的Docker daemon上,再由Docker damon根据指令创建、选择或者从Docker仓库中拉取(pull)镜像。接着客户端可以通过镜像创建容器。当我们需要使用程序时,运行相应的容器即可。
小结
需要正确的理解仓储/镜像/容器这几个概念 :
在外面使用容器的时候,我们不希望容器中的数据在容器被删除后也一并删除了,这时候我们就可以 通过使用容器数据卷,将数据储存在本地并用Docker将其挂载到容器中,这样我们即使删除了容器,数据也依旧存在服务器中,也就实现了数据持久化。
特点
容器数据卷挂载命令(-v)
Dockerfile 挂载容器数据卷
我们除了可以从仓库中拉取镜像以外,我们也可以 自己创建镜像 ,这就要用到Docerfile。
dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本 。
构建步骤:
基础知识:
流程:
说明:
在实际场景中,我们会遇到 多个Container之间通讯 的问题。而Docker网络就是用于解决此问题的技术。docker会给每个容器都分配一个ip,且容器和容器之间是可以互相访问的。
Docker网络原理
每一个安装了Docker的linux主机都有一个docker0的虚拟网卡。这是个桥接网卡,使用了 veth-pair 技术 。Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据 Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网 关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
Docker容器网络就很好的利用了Linux虚拟网络技术,在本地主机和容器内分别创建一个虚拟接口,并 让他们彼此联通(这样一对接口叫veth pair);
Docker中的网络接口默认都是虚拟的接口。虚拟接口的优势就是转发效率极高(因为Linux是在内核中 进行数据的复制来实现虚拟接口之间的数据转发,无需通过外部的网络设备交换),对于本地系统和容 器系统来说,虚拟接口跟一个正常的以太网卡相比并没有区别,只是他的速度快很多。
[图片上传中...(image-41d42a-1642627027452-2)]
Docker Compose是一个用于定义并运行多容器应用的工具 。
Docker Compose的 步骤如下 :
NOTE: Compose :重要的概念。
docker-compose.yml编写
Note: docker-compose会自动为多容器之间创建网络,保证通讯。
Docker Swarm 是Docker 的集群管理工具。 它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。
Docker 是一个开源的 应用容器引擎 ,它的出现大大简化了运维的难度,提高了运维效率。过去我们需要在服务器上安装程序所需要的所有依赖,而如今我们只需要编写好docker-compose和Dockefile的脚本,就可以使程序一键跑通。在企业级的应用中,我们必然会惊颤使用到Docker和容器化技术。
狂神说
默认的情况下,docker启动的容器经过日积月累,会产生很多的大文件,大到足以撑满服务器的磁盘空间。这个时候该怎么办呢?答案当然是扩容了。
这里给一个常规的解决思路,给云服务器增加一块大磁盘,然后将docker的文件全部移到新挂载的磁盘里,再为docker创建一个软链接即可。
示例中的磁盘并不是另外加的一块,而且之前就存在的磁盘,但是有一大部分空间未分配。但实际上这跟新加的磁盘处理方案是一样的,下面就以此为例做个简单介绍。
查看磁盘情况
可以看到xvda磁盘有200G的空间,但是只挂载了50G左右的,剩下的都在空闲状态,现在需要将剩下的150G左右的空间给利用上
执行以下命令,建立分区
按提示输入 m 可查看命令帮助
输入 p 查看当前磁柱请情况
输入 n 新建分区,并按提示选择分区类型,及起始和结束扇区
然后输入 w 保存
最后再用 reboot 重启服务器
重启服务器之后,为刚刚建立的分区格式化
可以用以下命令查看下挂载后的结果
之前这台服务器的根目录使用100%的磁盘,经过这个方法处理之后,降到45%了。
评论列表(0条)