From Docker to Kubernetes(二)- Docker Network

简介: From Docker to Kubernetes(二)- Docker Network

Section 01 - Vagrant

Vagrant is a tool for building and managing virtual machine environments in a single workflow. With an easy-to-use workflow and focus on automation, Vagrant lowers development environment setup time, increases production parity, and makes the "works on my machine" excuse a relic of the past.

Vagrant是一个构建和管理虚拟机的工具,使用Vagrant可以非常方便的构建、启动、关闭或者复制多个相同的虚拟机环境

使用Vagrant + VirtualBox可以非常快速的搭建两台或者多台虚拟机集群

参考Vagrant Getting Started

Vagrant常用命令

vagrant up # 启动当前目录下Vagrantfile中设置的虚拟机
vagrant halt # 关闭虚拟机
vagrant reload # 重启虚拟机
vagrant ssh # 连接虚拟机
vagrant status # 查看虚拟机启动状态
vagrant suspend # 挂起虚拟机
vagrang destroy # 销毁当前虚拟机
vagrant reload --provision # 按照Vagrantfile配置重新启动虚拟机
vagrant up --provision # 按照其他配置启动虚拟机
vagrant init # 初始化
vagrant box list # 查看本地box列表
vagrant box add # 添加到box列表
vagrant box remove # 从boxe列表中移除
复制代码
# 创建两台机器 docker-node1 docker-node2
vagrant up
vagrant status
vagrant ssh docker-node1
# 修改Linux主机名
sudo hostnamectl set-hostname docker-node1
exit
vagrant ssh docker-node1
docker version
exit
vagrant ssh docker-node2
docker veresion
sudo hostnamectl set-hostname docker-node2
exit
vagrant ssh docker-node2
# 互相 ping,查看是否能够ping通
复制代码

Section 02 - Docker网络

相关网络概念

  • Public IP:互联网上的唯一标识,可以访问Internet
  • Private IP:不可以在互联网上使用,仅限内部网络访问

相关网络命令

  • ping:用于验证IP的可达性
  • telnet:验证服务的可用性

Linux的网络命名空间

docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600; done"
# 进入到容器中,fb是Container ID的简写
docker exec -it fb /bin/sh
# 获取网络命名空间
ip a
# 退出容器
exit
# 创建第二个容器
docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600; done"
# 交互式执行命令,查看网路Namespace, 25ea是Container ID的简写
docker exec -it 25ea ip a
复制代码

创建容器时就会创建一个Namespace,这个Namespace跟主机的Namespace是隔离的

这是第一个网络的Namespace

140caf4e7bca409dbcb86f33aec797ff_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

第二个容器的网络命名空间

e75c514962594d428cea79e30a902b90_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

创建和管理Linux 网络的Namespace,并使两个network namespace相通

Docker Network Namespace实践

vagrant up docker-node1
vagratn up docker-node2
vagrant status
vagrant ssh docker-node1
# 查看本机有的network namespace, netns是network namespace的简写
sudo ip netns list
# 删除network namespace
sudo ip netns delete test1
# 添加network namespace
sudo ip netns add test1
sudo ip netns add test2
# 查看network namespace的IP地址
sudo ip netns exec test1 ip a
# 让lo端口up
sudo ip netns exec test1 ip link set dev lo up
sudo ip link add veth-test1 type veth peer name veth-test2
ip link
# 将veth-test1添加到test1
sudo ip link set veth-test1 netns test1
sudo ip netns exec test1 ip link
# 将veth-test2添加到test2
sudo ip link set veth-test2 netns test2
sudo ip netns exec test2 ip link
# 分配 IP 地址
sudo ip netns exec test1 ip addr add 192.168.1.1/24 dev veth-test1
sudo ip netns exec test2 ip addr add 192.168.1.2/24 dev veth-test2
# 查看是否有IP地址
sudo ip netns exec test1 ip link
sudo ip netns exec test2 ip link
# 启动veth
sudo ip netns exec test1 ip link set dev veth-test1 up
sudo ip netns exec test2 ip link set dev veth-test2 up
# 查看是否有IP地址
sudo ip netns exec test1 ip a
sudo ip netns exec test2 ip a
# 执行ping,查看是否有数据传输
sudo ip netns exec test1 ping 192.168.1.2
sudo ip netns exec test2 ping 192.168.1.1
复制代码
sudo ip netns exec test1 ip a
复制代码

9873d6ab2da94b25ac289fb80bd66502_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

04c4ed825007455e81b33145326fcad5_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

  Linux container 中用到一个叫做veth的东西,这是一种新的设备,专门为 container 所建。veth 从名字上来看是 Virtual ETHernet 的缩写,它的作用很简单,就是要把从一个 network namespace 发出的数据包转发到另一个 namespace。veth 设备是成对的,一个是 container 之中,另一个在 container 之外,即在真实机器上能看到的。

  VETH设备总是成对出现,送到一端请求发送的数据总是从另一端以请求接受的形式出现。创建并配置正确后,向其一端输入数据,VETH会改变数据的方向并将其送入内核网络子系统,完成数据的注入,而在另一端则能读到此数据。(Namespace,其中往veth设备上任意一端上RX到的数据,都会在另一端上以TX的方式发送出去)veth工作在L2数据链路层,veth-pair设备在转发数据包过程中并不串改数据包内容。

两个namespace之间互相通信

ada0a6d4527c48f2ac7c9185088c1212_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

Docker Bridge

docker start test1
docker start test2
docker exec -it test1 ip a
docker exec -it test2 ip a
# 进入test1
docker exec -it test1 /bin/sh
# ping另外一个容器的ip
ping 172.17.0.2
复制代码

Docker中是通过bridge0代替veth链接两个容器

docker stop test2
docker rm test2
# 列举当前机器上的网络,test1正在运行中
docker network ls
# 查看网络详情
docker network inspect 28af3c328fe0
ip a
# 查看test1容器的网络
docker exec -it test1 ip a
# 验证veth是连到docker0上的
brctl show
# 在创建一个容器test2
docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600; done"
docker network ls
docker network inspect bridge
# 多出了一个veth,用来与test2
brctl show
# docker0 连了两个接口
bridge name bridge id   STP enabled interfaces
docker0   8000.0242f0fecf55 no    vethb22ca59
                          vethd2fffa8
复制代码

feca60def94e41fba0b05698c3b24f43_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

下图说明test1容器连到birdge上

2c313dd6c18d4062b90a1cba9b692b36_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

ip a命令展示

24e89d25fd0d40bdbef89ca93c0c8d92_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

vethd2fffa8@if7 和 eth0@if8是一对

container 通过这一对端口可以连接到主机的网络上面及连接到了docker0上

ee14acbaad8e4162a830daad28956b28_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

验证veth是连接在docker0上的

0bf5e603cd254701aa56fbf71229dc26_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

docker network inspect bridge有两个容器连到了bridge网络

462920b001ae4b5599364e98a71c30f4_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

两个容器之间的连接方式

72a69e36344c45d39e3171298ecce219_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

容器与外网通信

9f6a68a2e02f4d13a3a0f637f9288f8e_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

容器之间的Link

建立link之后,可以直接通过容器名字访问该容器

# 首先删除test2
docker stop test2
doker rm test2
# 再次创建test2,通过添加--link参数, --link test1 
docker run -d --name test2 --link test1 busybox /bin/sh -c "while true; do sleep 3600; done"
# 进入容器中
docker exec -it test2 /bin/sh
# 可以用容器名字代替ip
ping test1
复制代码

192794617248433f9a7e76a52dba1237_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

新建容器的网络使用自定义的网络,不使用bridge

# -d bridge表示使用bridge为驱动,my-bridge为创建的网络的名字
docker network create -d bridge my-bridge
docker network ls
brctl show
# 新建一个容器,并指定使用新创建的网络
docker run -d --name test3 --network my-bridge busybox /bin/sh -c "while true; do sleep 3600; done"
# 查看容器网络
docker inpect test3
brctl show
# 已运行的容器连到具体网络
docker network connect my-bridge test2
docker inpect my-bridge
复制代码

容器之间的端口映射

如果两个容器连接到同一个网络(自定义的网路,系统默认网络不可以)上面,可以通过容器名字ping通,除了通过命令行访问docker部署的应用,还有其他方式,通过暴露端口给外界(不仅仅是在docker宿主机上)提供服务,将端口映射到宿主机的端口上面。

实践,以Nginx为例

docker run -d --name web nginx
docker exec -it web /bin/bash
# 容器默认连接到bridge上,通过查看bridge,确定容器的IP
docker network inspect bridge
# 确定容器的80端口是否可以访问
telnet 172.17.0.4 80
curl http://172.17.0.4
# 删除web容器,重新创建一个 容器 -p 80:80, 第一个80是容器的端口,第二个是宿主机的端口
docker run -d --name web -p 80:80 nginx
# 访问本机的80端口,显示nginx信息
curl 127.0.0.1:80
复制代码

d86fdd6f3593471c810432e022684c7e_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

容器网络之host和none

没有独立的network namespace,与主机共享network namespace,可能会出现端口冲突

docker run -d --name test2 --network host busybox /bin/sh -c "while true; do sleep 3600; done"
docker network inspect host
docker exec -it test2 /bin/bash
ip a
复制代码

none网络是一个孤立的网络,只能通过docker exec -it 访问容器,用来存储密码等敏感信息

# 创建一个容器,使用none网络
docker run -d --name test1 --network none busybox /bin/sh -c "while true; do sleep 3600; done"
docker network inspect none
docker exec -it test1 /bin/bash
ip a


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
运维 Kubernetes 监控
构建高效自动化运维体系:基于Docker和Kubernetes的实践指南
【2月更文挑战第30天】 在当今快速发展的云计算时代,传统的IT运维模式已难以满足业务的敏捷性和稳定性需求。本文深入探讨了如何通过Docker容器化技术和Kubernetes集群管理工具构建一个高效、可靠的自动化运维体系。文章首先概述了容器化技术和微服务架构的基本概念,随后详细阐述了基于Docker的应用打包、部署流程,以及Kubernetes在自动化部署、扩展和管理容器化应用中的关键作用。最后,文中通过案例分析,展示了如何在实际场景中利用这些技术优化运维流程,提高系统的整体效率和可靠性。
|
1月前
|
开发者 Docker Python
深入浅出:使用Docker容器化部署Python Web应用
在当今快速发展的软件开发领域,Docker作为一个开放平台,为开发者提供了将应用打包在轻量级、可移植的容器中的能力,从而简化了部署和管理应用程序的复杂性。本文将通过一个简单的Python Web应用示例,引导读者理解Docker的基本概念、容器化的优势以及如何使用Docker来容器化部署Python Web应用。我们将从零开始,逐步探索创建Dockerfile、构建镜像、运行容器等关键步骤,旨在为读者提供一个清晰、易于理解的指南,帮助他们掌握使用Docker容器化部署应用的技能。
|
25天前
|
运维 Kubernetes 持续交付
构建高效自动化运维体系:基于Docker和Kubernetes的最佳实践
在现代云计算环境中,自动化运维成为保障系统稳定性与提升效率的关键。本文深入探讨了如何利用Docker容器化技术和Kubernetes容器编排工具构建一个高效、可靠的自动化运维体系。文中不仅介绍了相关的技术原理,还结合具体案例分析了实施过程中的常见问题及解决方案,为读者提供了一套行之有效的最佳实践指南。
|
1月前
|
Kubernetes 开发者 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【2月更文挑战第29天】在当今快速发展的软件开发领域,微服务架构已成为提高系统可维护性、扩展性和敏捷性的关键解决方案。本文将深入探讨如何利用Docker容器化技术和Kubernetes集群管理工具,共同构建一个既高效又可靠的微服务环境。我们将分析Docker和Kubernetes的核心功能,并展示它们如何协同工作以简化部署流程、增强服务发现机制以及实现无缝的服务伸缩。通过实际案例分析,本文旨在为开发者提供一套实用的微服务架构设计和实施指南。
|
1月前
|
Kubernetes API Docker
Docker+K8s基础(重要知识点总结)
Docker+K8s基础(重要知识点总结)
64 0
|
1月前
|
Ubuntu Shell 开发者
Docker容器管理
Docker容器管理
35 0
|
1月前
|
Kubernetes 云计算 开发者
云计算中的容器化技术:Docker与Kubernetes的实践
云计算中的容器化技术:Docker与Kubernetes的实践
95 0
|
2月前
|
存储 监控 测试技术
【Docker管理工具】安装Oxker容器管理工具
【2月更文挑战第4天】安装Oxker容器管理工具
79 2
|
1月前
|
Prometheus 监控 Kubernetes
Kubernetes 集群监控与日志管理实践
【2月更文挑战第29天】 在微服务架构日益普及的当下,Kubernetes 已成为容器编排的事实标准。然而,随着集群规模的扩大和业务复杂度的提升,有效的监控和日志管理变得至关重要。本文将探讨构建高效 Kubernetes 集群监控系统的策略,以及实施日志聚合和分析的最佳实践。通过引入如 Prometheus 和 Fluentd 等开源工具,我们旨在为运维专家提供一套完整的解决方案,以保障系统的稳定性和可靠性。
|
21天前
|
数据库 存储 监控
什么是 SAP HANA 内存数据库 的 Delta Storage
什么是 SAP HANA 内存数据库 的 Delta Storage
16 0
什么是 SAP HANA 内存数据库 的 Delta Storage