前端技术
HTML
CSS
Javascript
前端框架和UI库
VUE
ReactJS
AngularJS
JQuery
NodeJS
JSON
Element-UI
Bootstrap
Material UI
服务端和客户端
Java
Python
PHP
Golang
Scala
Kotlin
Groovy
Ruby
Lua
.net
c#
c++
后端WEB和工程框架
SpringBoot
SpringCloud
Struts2
MyBatis
Hibernate
Tornado
Beego
Go-Spring
Go Gin
Go Iris
Dubbo
HessianRPC
Maven
Gradle
数据库
MySQL
Oracle
Mongo
中间件与web容器
Redis
MemCache
Etcd
Cassandra
Kafka
RabbitMQ
RocketMQ
ActiveMQ
Nacos
Consul
Tomcat
Nginx
Netty
大数据技术
Hive
Impala
ClickHouse
DorisDB
Greenplum
PostgreSQL
HBase
Kylin
Hadoop
Apache Pig
ZooKeeper
SeaTunnel
Sqoop
Datax
Flink
Spark
Mahout
数据搜索与日志
ElasticSearch
Apache Lucene
Apache Solr
Kibana
Logstash
数据可视化与OLAP
Apache Atlas
Superset
Saiku
Tesseract
系统与容器
Linux
Shell
Docker
Kubernetes
[VLAN标签在Docker网络中的应用 ]的搜索结果
这里是文章列表。热门标签的颜色随机变换,标签颜色没有特殊含义。
点击某个标签可搜索标签相关的文章。
点击某个标签可搜索标签相关的文章。
Docker
Docker与VLAN:探索VLAN与IP地址的区别 一、引言 在容器化技术的世界里,Docker作为最主流的轻量级虚拟化工具之一,为我们构建、部署和管理微服务提供了强大的支持。当我们谈论Docker网络时,经常会涉及到VLAN(Virtual Local Area Network,虚拟局域网)以及IP地址的概念。虽然两者都是网络通讯中的重要元素,但在Docker环境中它们承担的角色却大相径庭。这篇文儿呀,咱们要把它掰开了揉碎了,好好讲讲VLAN和IP地址在Docker这个家伙里头是怎么用的,还有它们俩到底有啥不一样。咱不光说理论,还会手把手地通过实际代码例子,带你一步步走过整个操作流程,保证让你看得明明白白、实实在在的。 二、什么是VLAN 1. VLAN简介 VLAN是一种逻辑上的网络划分方式,它允许我们在物理网络中创建多个独立的广播域,即使这些广播域共享同一物理介质。你知道吗,每个VLAN就像一个小社区,都有自己独立的广播范围。这意味着,如果两个设备身处不同的VLAN里,它们就不能直接“对话”。想要实现通信,就得依靠路由器或者三层交换机这位“信使”,帮忙传递信息才行。VLAN的主要作用是提高网络安全性和资源利用率。 2. Docker与VLAN结合示例 在Docker中,我们可以利用network配置选项启用VLAN网络模式。下面是一个创建带VLAN标签的Docker网络的示例: bash docker network create --driver=vlan \ --subnet=172.16.80.0/24 --gateway=172.16.80.1 \ --opt parent=eth0.10 my_vlan_network 上述命令创建了一个名为my_vlan_network的网络,其基于宿主机的VLAN 10 (parent=eth0.10)划分子网172.16.80.0/24并设置了默认网关。 三、IP地址与Docker容器 1. IP地址基础概念 IP地址(Internet Protocol Address)是互联网协议的核心组成部分,用于唯一标识网络中的设备。根据IPv4协议,IP地址由32位二进制组成,通常被表示为四个十进制数,如192.168.1.1。在Docker这个大家庭里,每个小容器都会被赋予一个独一无二的IP地址,这样一来,它们之间就可以像好朋友一样自由地聊天交流,不仅限于此,它们还能轻松地和它们所在的主机大哥,甚至更远的外部网络世界进行沟通联络。 2. Docker容器IP地址分配 在Docker默认的桥接网络(bridge)模式中,每个容器会获取一个属于172.17.0.0/16范围的私有IP地址。另外,你还可以选择自己动手配置一些个性化的网络设置,像是“host”啦、“overlay”啦,或者之前我们提到的那个“vlan”,这样就能给容器分配特定的一段IP地址,让它们各用各的,互不干扰。 四、VLAN与IP地址在Docker网络中的关系 1. IP地址在VLAN网络中的角色 当Docker容器运行在一个包含VLAN网络中时,它们会继承VLAN网络的IP地址配置,从而在同一VLAN内相互通信。比如,想象一下容器A和容器B这两个家伙,他们都住在VLAN 10这个小区里面,虽然住在不同的单元格,但都能通过各自专属的“门牌号”(也就是VLAN标签)和“电话号码”(IP地址)互相串门聊天,完全不需要经过小区管理员——宿主机的同意或者帮忙。 2. 跨VLAN通信 若想让VLAN网络内的容器能够与宿主机或其他VLAN网络内的容器通信,就需要配置多层路由或者使用VXLAN等隧道技术,使得数据包穿越不同的VLAN标签并在相应的IP地址空间内正确路由。 五、结论 综上所述,VLAN与IP地址在Docker网络场景中各有其核心作用。VLAN这个小家伙,就像是咱们物理网络里的隐形隔离墙和保安队长,它在幕后默默地进行逻辑分割和安全管理工作。而IP地址呢,更像是虚拟化网络环境中的邮差和导航员,主要负责在各个容器间传递信息,同时还能带领外部的访问者找到正确的路径,实现内外的互联互通。当这两者联手一起用的时候,就像是给网络装上了灵动的隔断墙,既能灵活分区,又能巧妙地避开那些可能引发“打架”的冲突风险。这样一来,咱们微服务架构下的网络环境就能稳稳当当地高效运转了,就像一台精密调校过的机器一样。在咱们实际做项目开发这事儿的时候,要想把Docker网络策略设计得合理、实施得妥当,就得真正理解并牢牢掌握这两者之间的关系,这可是相当关键的一环。
2024-02-12 10:50:11
479
追梦人_t
转载文章
... 快速参考 维护者:Docker 社区和 MySQL 团队 从哪里获得帮助:Docker 社区论坛、Docker 社区 Slack 或 Stack Overflow 2.2. 支持的标签和各自的 Dockerfile 链接 8.0.28, 8.0, 8, latest 5.7.37, 5.7, 5 2.3. 快速参考(续) 在哪里提交问题:https://github.com/docker-library/mysql/issues 支持的架构:(更多信息)amd64 发布的镜像工件详情:repo-info repo 的 repos/mysql/ 目录(历史)(镜像元数据、传输大小等) 镜像更新:official-images repo 的 library/mysql 标签 官方图像 repo 的库/mysql 文件(历史) 此描述的来源:docs repo 的 mysql/ 目录(历史) 2.4. 如何使用镜像 2.4.1. 启动一个mysql服务器实例 启动 MySQL 实例很简单: $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag 其中 some-mysql 是您要分配给容器的名称, my-secret-pw 是要为 MySQL root 用户设置的密码,而 tag 是指定您想要的 MySQL 版本的标签。 有关相关标签,请参见上面的列表。 以下是示例(通常要设置时区),注意-v 这里是挂载磁盘,请提前创建目录/var/mysql/data,/var/lib/mysql是容器里的原持久化目录: docker run --name mysql202201 -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai -v /var/mysql/data:/var/lib/mysql -d mysql:5.7 2.4.2. 从 MySQL 命令行客户端连接到 MySQL 以下命令启动另一个 mysql 容器实例并针对您的原始 mysql 容器运行 mysql 命令行客户端,允许您针对您的数据库实例执行 SQL 语句: $ docker run -it --network some-network --rm mysql mysql -hsome-mysql -uexample-user -p 其中 some-mysql 是原始 mysql 容器的名称(连接到 some-network Docker 网络)。 此镜像也可以用作非 Docker 或远程实例的客户端: $ docker run -it --rm mysql mysql -hsome.mysql.host -usome-mysql-user -p 有关 MySQL 命令行客户端的更多信息,请参阅 MySQL 文档。 2.4.3. 容器外访问和查看 MySQL 日志 docker exec 命令允许您在 Docker 容器内运行命令。 以下命令行将为您提供 mysql 容器内的 bash shell: $ docker exec -it some-mysql bash 第一次启动一个MySQL容器后,需要对账户进行授权,否则无法远程访问,请先使用上面的命令进入容器内,然后使用以下命令连接到mysql服务: mysql -uroot -p 输入密码回车,进入mysql命令界面mysql> 接着授权root远程访问权限: mysql> GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '123456'; 然后就可以远程用MySQL客户端连接到MySQL容器了。 日志可通过 Docker 的容器日志获得: $ docker logs some-mysql 2.4.4. 使用自定义 MySQL 配置文件 MySQL 的默认配置可以在 /etc/mysql/my.cnf 中找到,其中可能包含额外的目录,例如 /etc/mysql/conf.d 或 /etc/mysql/mysql.conf.d。 请检查 mysql 映像本身中的相关文件和目录以获取更多详细信息。 如果 /my/custom/config-file.cnf 是你的自定义配置文件的路径和名称,你可以这样启动你的 mysql 容器(注意这个命令只使用了自定义配置文件的目录路径): $ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag 这将启动一个新容器 some-mysql,其中 MySQL 实例使用来自 /etc/mysql/my.cnf 和 /etc/mysql/conf.d/config-file.cnf 的组合启动设置,后者的设置优先 . 没有 cnf 文件的配置 许多配置选项可以作为标志传递给 mysqld。 这将使您可以灵活地自定义容器,而无需 cnf 文件。 例如,如果要将所有表的默认编码和排序规则更改为使用 UTF-8 (utf8mb4),只需运行以下命令: $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 如果您想查看可用选项的完整列表,只需运行: $ docker run -it --rm mysql:tag --verbose --help 2.4.5. 环境变量 启动 mysql 镜像时,可以通过在 docker run 命令行中传递一个或多个环境变量来调整 MySQL 实例的配置。 请注意,如果您使用已包含数据库的数据目录启动容器,则以下任何变量都不会产生任何影响:任何预先存在的数据库在容器启动时将始终保持不变。 另请参阅 https://dev.mysql.com/doc/refman/5.7/en/environment-variables.html 以获取 MySQL 的环境变量的文档(尤其是 MYSQL_HOST 等变量,已知与此镜像一起使用时会导致问题)。 MYSQL_ROOT_PASSWORD 此变量是必需的,并指定将为 MySQL root 超级用户帐户设置的密码。 在上面的示例中,它被设置为 my-secret-pw。 MYSQL_DATABASE 此变量是可选的,允许您指定要在映像启动时创建的数据库的名称。 如果提供了用户/密码(见下文),则该用户将被授予对此数据库的超级用户访问权限(对应于 GRANT ALL)。 MYSQL_USER、MYSQL_PASSWORD 这些变量是可选的,用于创建新用户和设置该用户的密码。 该用户将被授予对 MYSQL_DATABASE 变量指定的数据库的超级用户权限(见上文)。 要创建用户,这两个变量都是必需的。 请注意,不需要使用此机制来创建超级用户超级用户,默认情况下会使用 MYSQL_ROOT_PASSWORD 变量指定的密码创建该用户。 MYSQL_ALLOW_EMPTY_PASSWORD 这是一个可选变量。 设置为非空值,例如 yes,以允许使用 root 用户的空白密码启动容器。 注意:除非您真的知道自己在做什么,否则不建议将此变量设置为 yes,因为这将使您的 MySQL 实例完全不受保护,从而允许任何人获得完全的超级用户访问权限。 MYSQL_RANDOM_ROOT_PASSWORD 这是一个可选变量。 设置为非空值,如 yes,为 root 用户生成随机初始密码(使用 pwgen)。 生成的根密码将打印到标准输出(生成的根密码:…)。 MYSQL_ONETIME_PASSWORD 一旦初始化完成,将 root(不是 MYSQL_USER 中指定的用户!)用户设置为过期,强制在第一次登录时更改密码。 任何非空值都将激活此设置。 注意:此功能仅在 MySQL 5.6+ 上受支持。 在 MySQL 5.5 上使用此选项将在初始化期间引发适当的错误。 MYSQL_INITDB_SKIP_TZINFO 默认情况下,入口点脚本会自动加载 CONVERT_TZ() 函数所需的时区数据。 如果不需要,任何非空值都会禁用时区加载。 2.4.6. Docker Secrets 作为通过环境变量传递敏感信息的替代方法,_FILE 可以附加到先前列出的环境变量中,从而导致初始化脚本从容器中存在的文件中加载这些变量的值。 特别是,这可用于从存储在 /run/secrets/<secret_name> 文件中的 Docker 机密中加载密码。 例如: $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d mysql:tag 目前,这仅支持 MYSQL_ROOT_PASSWORD、MYSQL_ROOT_HOST、MYSQL_DATABASE、MYSQL_USER和 MYSQL_PASSWORD。 2.4.7. 初始化一个新实例 首次启动容器时,将使用提供的配置变量创建并初始化具有指定名称的新数据库。 此外,它将执行 /docker-entrypoint-initdb.d 中的扩展名为 .sh、.sql 和 .sql.gz 的文件。 文件将按字母顺序执行。 您可以通过将 SQL 转储安装到该目录并提供带有贡献数据的自定义镜像来轻松填充您的 mysql 服务。 SQL 文件将默认导入到 MYSQL_DATABASE 变量指定的数据库中。 2.5. 注意事项 2.5.1. 在哪里存储数据 重要提示:有几种方法可以存储在 Docker 容器中运行的应用程序使用的数据。 我们鼓励 mysql 映像的用户熟悉可用的选项,包括: 让 Docker 通过使用自己的内部卷管理将数据库文件写入主机系统上的磁盘来管理数据库数据的存储。 这是默认设置,对用户来说简单且相当透明。 缺点是对于直接在主机系统(即外部容器)上运行的工具和应用程序,可能很难找到这些文件。 在主机系统(容器外部)上创建一个数据目录,并将其挂载到容器内部可见的目录。 这会将数据库文件放置在主机系统上的已知位置,并使主机系统上的工具和应用程序可以轻松访问这些文件。 缺点是用户需要确保目录存在,例如主机系统上的目录权限和其他安全机制设置正确。 Docker 文档是了解不同存储选项和变体的一个很好的起点,并且有多个博客和论坛帖子在该领域讨论和提供建议。 我们将在这里简单地展示上面后一个选项的基本过程: 在主机系统上的合适卷上创建数据目录,例如 /my/own/datadir。 像这样启动你的 mysql 容器: $ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag 命令的 -v /my/own/datadir:/var/lib/mysql 部分将底层主机系统中的 /my/own/datadir 目录挂载为容器内的 /var/lib/mysql ,默认情况下 MySQL 将 写入其数据文件。 2.5.2. 在 MySQL 初始化完成之前没有连接 如果容器启动时没有初始化数据库,则会创建一个默认数据库。 虽然这是预期的行为,但这意味着在初始化完成之前它不会接受传入的连接。 在使用同时启动多个容器的自动化工具(例如 docker-compose)时,这可能会导致问题。 如果您尝试连接到 MySQL 的应用程序没有处理 MySQL 停机时间或等待 MySQL 正常启动,那么在服务启动之前放置一个连接重试循环可能是必要的。 有关官方图像中此类实现的示例,请参阅 WordPress 或 Bonita。 2.5.3. 针对现有数据库的使用 如果您使用已经包含数据库的数据目录(特别是 mysql 子目录)启动 mysql 容器实例,则应该从运行命令行中省略 $MYSQL_ROOT_PASSWORD 变量; 在任何情况下都将被忽略,并且不会以任何方式更改预先存在的数据库。 2.5.4. 以任意用户身份运行 如果你知道你的目录的权限已经被适当地设置了(例如对一个现有的数据库运行,如上所述)或者你需要使用特定的 UID/GID 运行 mysqld,那么可以使用 --user 调用这个镜像设置为任何值(root/0 除外)以实现所需的访问/配置: $ mkdir data$ ls -lnd datadrwxr-xr-x 2 1000 1000 4096 Aug 27 15:54 data$ docker run -v "$PWD/data":/var/lib/mysql --user 1000:1000 --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag 2.5.5. 创建数据库转储 大多数普通工具都可以工作,尽管在某些情况下它们的使用可能有点复杂,以确保它们可以访问 mysqld 服务器。 确保这一点的一种简单方法是使用 docker exec 并从同一容器运行该工具,类似于以下内容: $ docker exec some-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql 2.5.6. 从转储文件恢复数据 用于恢复数据。 您可以使用带有 -i 标志的 docker exec 命令,类似于以下内容: $ docker exec -i some-mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql 备注 docker安装完MySQL,后面就是MySQL容器在跑,基本上就是当MySQL服务去操作,以前MySQL怎么做现在还是一样怎么做,只是个别操作因为docker包了一层,麻烦一点。 有需要的话,我们也可以基于MySQL官方镜像去定制我们自己的镜像,就比如主从镜像之类的。 本篇文章为转载内容。原文链接:https://blog.csdn.net/muluo7fen/article/details/122731852。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-05-29 17:31:06
101
转载
Docker
...管理工具,特别是结合Docker使用后,简直是如虎添翼! 所以今天,咱们就来聊聊这些工具,看看它们能不能成为你心目中的“神器”。 --- 2. Docker 让一切都变得简单 首先,我们得谈谈Docker。Docker是什么?简单来说,它是一种容器化技术,可以让你的应用程序及其依赖项打包成一个独立的“容器”,然后轻松地运行在任何支持Docker的环境中。 举个例子吧,假如你想在一个全新的服务器上安装WordPress,传统方法可能是手动下载PHP、MySQL、Nginx等一堆软件,再逐一配置。而如果你用Docker,只需要一条命令就能搞定: bash docker run --name wordpress -d -p 80:80 \ -v /path/to/wordpress:/var/www/html \ -e WORDPRESS_DB_HOST=db \ -e WORDPRESS_DB_USER=root \ -e WORDPRESS_DB_PASSWORD=yourpassword \ wordpress 这段代码的意思是:启动一个名为wordpress的容器,并将本地目录/path/to/wordpress挂载到容器内的/var/www/html路径下,同时设置数据库连接信息。是不是比传统的安装方式简洁多了? 不过,单独使用Docker虽然强大,但对于不熟悉命令行的人来说还是有点门槛。这时候就需要一些辅助工具来帮助我们更好地管理和调度容器了。 --- 3. Portainer 可视化管理Docker的好帮手 Portainer绝对是我最近发现的一颗“宝藏”。它的界面非常直观,几乎不需要学习成本。不管是想看看现有的容器啥情况,还是想启动新的容器,甚至连网络和卷的管理,都只需要动动鼠标拖一拖、点一点就行啦! 比如,如果你想快速创建一个新的MySQL容器,只需要打开Portainer的Web界面,点击“Add Container”,然后填写几个基本信息即可: yaml image: mysql:5.7 name: my-mysql ports: - "3306:3306" volumes: - /data/mysql:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: rootpassword 这段YAML配置文件描述了一个MySQL容器的基本参数。Portainer会自动帮你解析并生成对应的Docker命令。是不是超方便? 另外,Portainer还有一个特别棒的功能——实时监控。你打开页面就能看到每个“小房子”(就是容器)里用掉的CPU和内存情况,而且还能像穿越空间一样,去访问别的机器上跑着的那些“小房子”(Docker实例)。这种功能对于运维人员来说简直是福音! --- 4. Rancher 企业级的容器编排利器 如果你是一个团队协作的开发者,或者正在运营一个大规模的服务集群,那么Rancher可能是你的最佳选择。它不仅仅是一个Docker管理工具,更是一个完整的容器编排平台。 Rancher的核心优势在于它的“多集群管理”能力。想象一下,你的公司有好几台服务器,分别放在地球上的不同角落,有的在美国,有的在欧洲,还有的在中国。每台服务器上都跑着各种各样的服务,比如网站、数据库啥的。这时候,Rancher就派上用场了!它就像一个超级贴心的小管家,让你不用到处切换界面,在一个地方就能轻松搞定所有服务器和服务的管理工作,省时又省力! 举个例子,如果你想在Rancher中添加一个新的节点,只需要几步操作即可完成: 1. 登录Rancher控制台。 2. 点击“Add Cluster”按钮。 3. 输入目标节点的信息(IP地址、SSH密钥等)。 4. 等待几分钟,Rancher会自动为你安装必要的组件。 一旦节点加入成功,你就可以直接在这个界面上部署应用了。比如,用Kubernetes部署一个Redis集群: bash kubectl create deployment redis --image=redis:alpine kubectl expose deployment redis --type=LoadBalancer --port=6379 虽然这条命令看起来很简单,但它背后实际上涉及到了复杂的调度逻辑和网络配置。而Rancher把这些复杂的事情封装得很好,让我们可以专注于业务本身。 --- 5. Traefik 反向代理与负载均衡的最佳拍档 最后要介绍的是Traefik,这是一个轻量级的反向代理工具,专门用来处理HTTP请求的转发和负载均衡。它最厉害的地方啊,就是能跟Docker完美地融为一体,还能根据容器上的标签,自动调整路由规则呢! 比如说,你有两个服务分别监听在8080和8081端口,现在想通过一个域名访问它们。只需要给这两个容器加上相应的标签: yaml labels: - "traefik.enable=true" - "traefik.http.routers.service1.rule=Host(service1.example.com)" - "traefik.http.services.service1.loadbalancer.server.port=8080" - "traefik.http.routers.service2.rule=Host(service2.example.com)" - "traefik.http.services.service2.loadbalancer.server.port=8081" 这样一来,当用户访问service1.example.com时,Traefik会自动将请求转发到监听8080端口的容器;而访问service2.example.com则会指向8081端口。这种方式不仅高效,还极大地减少了配置的工作量。 --- 6. 总结 找到最适合自己的工具 好了,到这里咱们已经聊了不少关于服务器管理工具的话题。从Docker到Portainer,再到Rancher和Traefik,每一种工具都有其独特的优势和适用场景。 我的建议是,先根据自己的需求确定重点。要是你只想弄个小玩意儿,图个省事儿快点搞起来,那用Docker配个Portainer就完全够用了。但要是你们团队一起干活儿,或者要做大范围的部署,那Rancher这种专业的“老司机工具”就得安排上啦! 当然啦,技术的世界永远没有绝对的答案。其实啊,很多时候你会发现,最适合你的工具不一定是最火的那个,而是那个最合你心意、用起来最顺手的。就像穿鞋一样,别人觉得好看的根本不合脚,而那双不起眼的小众款却让你走得又稳又舒服!所以啊,在用这些工具的时候,别光顾着看,得多动手试试,边用边记下自己的感受和想法,这样你才能真的搞懂它们到底有啥门道! 好了,今天的分享就到这里啦!如果你还有什么问题或者想法,欢迎随时留言交流哦~咱们下次再见啦!
2025-04-16 16:05:13
97
月影清风_
Docker
Docker , Docker 是一种开源的应用容器引擎,它通过将应用程序及其依赖项打包到一个可移植的容器中,实现了软件的标准化、组件化和便捷部署。在本文语境下,Docker 用于创建和管理独立运行的容器实例,每个容器拥有自己独立的文件系统、网络配置以及进程空间,从而实现资源隔离和环境一致性。 端口映射 , 端口映射是计算机网络技术中的一个概念,在 Docker 中具体表现为将主机(物理机或虚拟机)上的某个端口与容器内部服务监听的端口进行关联绑定。通过端口映射,外部客户端可以通过访问主机的 IP 地址及指定端口号,间接访问到容器内运行的服务,实现了容器内外网络通信的桥梁作用。 docker run , docker run 是 Docker 容器生命周期管理中的一个重要命令,用于启动一个新的容器实例。该命令可以一次性完成拉取镜像、创建容器并启动容器等一系列操作。在本文中,docker run -p 参数组合被用来执行端口映射,即将主机端口与容器端口对应起来,使得外部可以直接访问主机IP和指定端口来连接到容器内部的服务。 NetworkSettings.Networks , 在 Docker 容器的 inspect 输出信息中,NetworkSettings.Networks 表示容器在网络配置方面的详细信息,包括容器加入的所有网络及其对应的网络接口设置。在本文中,通过 docker inspect 命令结合 --format 参数和特定模板语法查询容器的 IPAddress,获取的是当前容器在某一网络下的内部 IP 地址,这对于需要直接基于容器内部 IP 访问其服务的场景尤为关键。
2023-09-21 17:15:59
837
电脑达人
Docker
Docker 打JAR包(Docker 运行JAR包) 一、引言 随着云计算的飞速发展,容器技术逐渐成为了开发者的新宠儿。而在这众多的容器技术中,Docker无疑是最受关注的一款。这个小东西提供了一个超级轻便的隔离空间,让咱们开发、测试、部署这些环节变得轻轻松松,效率嗖嗖地提升。就像在自家后院种菜一样简单快捷,不用再为复杂的环境困扰啦! 在本文中,我们将重点介绍如何使用Docker来打包并运行Java应用的JAR包。 二、Docker 的基本概念 首先,我们需要了解一些基础的概念。 2.1 Docker镜像 Docker镜像是一个只读的数据层,包含了一切在构建容器时需要的东西,如操作系统、库文件、配置文件等。 2.2 Docker容器 Docker容器是镜像的一个实例,它可以从镜像创建出来,并且可以在宿主机上运行。 2.3 Dockerfile Dockerfile是一个文本文件,用于定义镜像的构建步骤。它可以被用来自动构建一个新的镜像。 三、Dockerfile 实践 下面,我们通过一个简单的示例来展示如何编写和使用Dockerfile来构建一个基于Alpine Linux的Java应用的Docker镜像。 Dockerfile 使用官方的Alpine Java镜像作为父镜像 FROM openjdk:8-jdk-alpine 将当前目录下的文件复制到容器的 /app 目录下 COPY . /app 定义环境变量 ENV JAVA_APP_JAR app.jar 指定容器启动时执行的命令 CMD ["java","-jar", "$JAVA_APP_JAR"] 上述Dockerfile中的COPY . /app命令将当前目录下的所有文件复制到容器的/app目录下。在设置环境变量时,我们敲下ENV JAVA_APP_JAR app.jar这个命令,这就意味着我们创建了一个名为JAVA_APP_JAR的小家伙,并给它赋予了app.jar这个值。就像是给一个储物箱贴上了标签,上面写着'JAVA_APP_JAR',而储物箱里装的就是'app.jar'这个宝贝。最后,你瞧,“CMD ["java","-jar", "$JAVA_APP_JAR"]”这串代码是给容器启动时定下的行动指南,简单来说,就是告诉容器:“嘿,启动的时候记得运行咱们的‘app.jar’这个小家伙!” 四、Docker Compose 使用 有了Dockerfile后,我们就可以通过Docker Compose来构建、运行我们的Java应用了。 以下是一个简单的Docker Compose文件的例子: yaml version: '3' services: web: build: . ports: - "8080:8080" 上述Docker Compose文件定义了一个名为web的服务,该服务从本地的.目录构建镜像,并将宿主机的8080端口映射到容器的8080端口。 五、结论 总的来说,使用Docker来打包并运行Java应用的JAR包,不仅可以大大简化开发流程,还可以提高应用的可移植性和可靠性。嘿,你知道吗?Docker Compose的横空出世,那可真是让咱部署应用变得超级省事儿,前所未有的便捷快速啊!就像搭积木一样简单,嗖嗖几下就搞定了。 在未来,我相信Docker将会继续发挥着它的重要作用,推动着容器技术的发展,为我们的开发工作带来更多的便利和可能。
2023-05-01 20:23:48
246
桃李春风一杯酒-t
Docker
Docker , Docker是一种开源的应用容器引擎,它允许开发人员将应用程序及其所有依赖项打包到一个标准化的、轻量级的镜像文件中。这个镜像可以在任何支持Docker的环境中运行,确保在不同操作系统和配置上的一致性表现。通过Docker,开发团队可以简化部署流程,实现快速构建、测试与发布应用,并且有效地解决因环境差异带来的问题,显著提升开发效率和资源利用率。 Dockerfile , Dockerfile是用于定义Docker镜像内容和构建步骤的一个文本文件。它包含了创建新镜像所需的命令集合,如指定基础镜像、安装软件包、复制文件以及设置环境变量等操作。在Dockerfile中编写好这些指令后,通过执行docker build命令就能自动化地根据Dockerfile的内容生成一个新的Docker镜像。 镜像名称冲突 , 在Docker环境中,每个镜像都有唯一的标识符,包括名称和标签(例如,ubuntu:latest)。镜像名称冲突是指在同一系统或网络环境下,存在两个或多个Docker容器尝试使用相同名称和标签的镜像进行启动或访问的情况。这可能导致某些容器无法正确识别并使用相应的镜像资源,从而影响其正常运行。为避免这种情况,开发者应确保为每个容器指定独一无二的镜像名称和标签。
2023-04-14 21:52:33
1259
星河万里_t
Struts2
...:iterator标签处理集合数据的灵活性之后,进一步了解现代Web开发框架如何优化数据处理和展示方式至关重要。近期,Spring Framework 5.3版本引入了全新的“Thymeleaf”模板引擎增强功能,它提供了更为简洁直观的语法来遍历和操作集合数据,比如使用th:each标签进行迭代,结合表达式计算能力,能够实现更复杂的数据绑定和条件渲染。 此外,随着前端技术的飞速发展,诸如React、Vue等现代化JavaScript框架也逐渐成为处理后端传递集合数据的主流选择。它们通过组件化的设计模式以及虚拟DOM的高效更新机制,使得开发者可以便捷地对集合数据进行动态渲染与交互,如Vue.js中的v-for指令便能轻松实现列表遍历与状态管理。 不仅如此,对于大数据量的场景,为提升用户体验,分页技术和懒加载策略的应用也越来越普遍。例如,Apache Struts2已支持与众多第三方分页插件集成,而新兴的GraphQL查询语言则从API层面对数据获取进行了革新,允许客户端精确指定需要的数据字段及数量,从而有效减少网络传输负载并提高性能。 总之,无论是在传统Java Web开发框架还是现代前端技术领域,处理集合数据的方式正持续演进,开发者应关注最新技术动态,结合实际需求灵活运用各种工具与方案,以提升开发效率和用户体验。
2023-01-03 18:14:02
44
追梦人
Kubernetes
...功能是在每个符合特定标签选择器的节点上确保运行一个Pod副本。这意味着无论新加入或离开集群的节点,只要满足条件,DaemonSet都会自动调度并管理这些Pod,确保集群内所有节点的服务一致性。 Kubernetes节点 , 在Kubernetes集群中,节点是一个工作机器,可以是物理机或虚拟机,它负责运行容器化应用。节点由Master组件管理,并通过kubelet代理与Master通信。节点包含运行Pod所需的环境和服务,如Docker、kube-proxy和kubelet等。 Taint 和 Label , 在Kubernetes中,Label是用于对对象(如节点、Pods、服务等)进行分类和组织的关键字/值对,使得用户可以根据标签来选择和操作资源。而Taint则是节点的一个属性,带有特定taint的节点只能调度接受相应toleration(即能容忍该taint)的Pod,用以实现节点的亲和性和反亲和性策略。 Pod , 在Kubernetes中,Pod是最小的部署单元,它是容器的逻辑分组,代表集群上运行的一个进程及其存储资源。一个Pod中可以包含一个或多个紧密相关的容器,这些容器共享网络命名空间、IP地址以及存储卷,从而形成一个协同工作的应用程序单元。 kubectl , kubectl是Kubernetes提供的命令行工具,用于与集群进行交互,执行各种操作,例如创建、修改、删除资源对象,检查集群状态,以及获取日志和监控信息等。在处理Pod不在预期节点上运行的问题时,运维人员会频繁使用kubectl执行诸如查看节点状态、编辑DaemonSet配置、调整Pod数量等相关操作。
2023-04-13 21:58:20
207
夜色朦胧-t
Tomcat
...件设计和开发模式,将应用程序分解为一组小的服务,每个服务运行在其独立的进程中,可以独立部署、扩展和升级。在文章中,它与Tomcat的远程管理结合,意味着服务化和API化的管理方式,使得单个Tomcat实例可以与其他服务协同工作,提高系统的灵活性和可维护性。 Kubernetes , 一个开源的容器编排系统,用于自动化部署、扩展和管理容器化的应用。在云原生环境中,Kubernetes被用来部署和管理包括Tomcat在内的多个服务,通过Service Account和RBAC进行权限控制,保证了远程管理的安全性。 Role-Based Access Control (RBAC) , 一种基于角色的访问控制模型,通过赋予用户不同的角色,来决定他们可以访问哪些系统资源。在Kubernetes中,RBAC用于管理对Tomcat等服务的访问权限,确保只有授权的用户能够进行远程操作。 Docker , 一个开源的应用容器引擎,使得开发人员可以打包他们的应用和依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,无需关心底层环境差异。在文中,Docker用于实现Tomcat的容器化部署,简化了跨环境的部署和管理。 Spring Cloud Gateway , Spring Cloud的一部分,是一个API网关,用于路由、过滤和增强微服务架构中的API请求。在远程管理Tomcat时,Spring Cloud Gateway提供统一的API入口,使得对多个服务的管理更加集中和便捷。 Service Account , Kubernetes中的一种内置身份,为每个Pod提供一个匿名的、与Pod关联的账户,用于访问Kubernetes API和其他服务。在远程管理Tomcat时,Service Account用于身份验证和资源访问控制。 TLS Termination , 在HTTPS流量管理中,指在客户端和负载均衡器之间终止SSL/TLS连接的过程,然后由负载均衡器负责将非加密的HTTP流量转发给后端服务器。在云环境中,这有助于简化安全配置并提高性能。
2024-06-17 11:00:56
264
翡翠梦境
Kubernetes
...原生是一种构建和运行应用程序的方法论,旨在充分利用云计算的弹性和可扩展性。云原生应用设计时考虑到了分布式、微服务、容器化、自动化部署、持续集成/持续部署(CI/CD)以及基础设施即代码(IaC)等特性,以实现高度灵活、快速迭代和成本效益高的应用开发和运营。 名词 , Kubernetes。 解释 , Kubernetes,简称K8s,是一款开源的容器编排系统,由Google开发并于2014年开源。Kubernetes提供了一套自动化的机制来部署、扩展和管理容器化应用,支持跨多个物理或虚拟服务器的部署,同时提供了资源调度、自动重启、滚动更新、服务发现等功能。它通过抽象出一组API和工具,使得开发者能够集中精力编写应用代码,而不是管理底层的基础设施。 名词 , 微服务。 解释 , 微服务是一种架构风格,将单一应用程序分解为一组小的、独立部署的服务,每个服务专注于特定的业务功能。这种架构允许各个服务独立开发、部署和扩展,提高了系统的可维护性和可扩展性。微服务通常通过API进行通信,可以运行在不同的服务器上,甚至可以运行在不同的数据中心或云环境中,支持快速迭代和独立发布。在云原生背景下,微服务与容器技术(如Docker)、Kubernetes等结合,形成了灵活、高效、可伸缩的应用部署方式。
2024-09-05 16:21:55
60
昨夜星辰昨夜风
转载文章
...ader的一个EFI应用 - GRUB镜像组成:GRUB.MBR(boot.img), 硬盘扇区offset 1 到offset 62放置GRUB的core.img,/boot分区的boot/grub/grub.cfg 1.3 创建USB-FDD或者USB-ZIP格式U盘步骤 1)Android上:dd if=/dev/zero of=/dev/block/sda bs=512 count=4 2)Windows上:快速格式化该U盘,这个U盘就只有PBR扇区而没有MBR扇区 2 Windows安装 2.1 BIOS设置 进入BIOS设置,一般有Del、Enter、Esc等键。 2.2 Windows ISO刻录方法 Windows上的Universal USB Installer工具软件:刻录操作系统ISO文件到U盘 Linux下将操作系统ISO文件刻录到U盘:dd if=xxx.iso of=/dev/sda 注意使用的是整个磁盘,所以用的是sda而不是sda1 2.3 Windows GHO镜像安装方法 - 比较常见 1) 制作PE启动U盘 2) 下载Windows ISO镜像后(番茄花园),解压出来,里面包含GHO文件,拷贝到PE启动U盘的GHO文件夹(或者提前将文件.gho拷贝入待装系统的电脑D盘根目录)。 3) 插入PE启动U盘到电脑USB 2.0口,选择从U盘启动,启动到PE界面后,选ghost方式安装,ghost镜像的后缀名.gho。 2.4 Printer 1)HP LaserJet M1005 MFP 2)Nantian PR9 并口-OKI仿真驱动 2.5 Disable Driver Signature bcdedit /set testsigning on bcdedit /set testsigning off 3 Windows网络 3.1 CMD方式配置IP地址 :: netsh: Network Shell @echo off if [%1] == [] ( echo "Usage:" echo "WIN_IP.bat static" echo "WIN_IP.bat dhcp" echo "WIN_IP.bat speed" goto :EOF ) if %1 == static ( call :static_ip ) else if %1 == dhcp ( call :dhcp_ip ) else if %1 == speed ( call :nic_speed ) goto :EOF :: get interface name, use the following command :: getmac /V /FO LIST :static_ip set name="Ethernet" set ip=192.168.0.100 set mask=255.255.255.0 :: gwmetric=1 echo "setting static ip address..." netsh interface ipv4 set address %name% static %ip% %mask% none 1 :: netsh interface ipv4 set dns %name% static 114.114.114.114 :: netsh interface ipv4 add dns %name% 8.8.8.8 goto :EOF :dhcp_ip set name="Ethernet" echo "setting dhcp..." netsh interface ipv4 set address %name% dhcp netsh interface ipv4 set dns %name% dhcp goto :EOF :nic_speed wmic NIC where NetEnabled=true get Name, Speed 3.2 DNS查询流程 1) 现有的DNS缓存 ipconfig /displaydns 2) 查询hosts文件 C:\Windows\System32\drivers\etc\hosts 3) 请求发往DNS服务器 ipconfig /all 3.3 firewall appwiz.cpl msconfig wf.msc Inbound Rules and Outbound Rules Enable 4 File and Printer Sharing (Echo Request - ICMPv4-Out) netsh advfirewall firewall add rule name="UDP ports" protocol=UDP dir=in localport=8080 action=allow https://github.com/DynamoRIO/drmemory/wiki/Downloads 3.4 Multicast - Windows组播client需要使用setsockopt()设置IP_ADD_MEMBERSHIP(加入指定的组播组)才能接收组播server发送的数据。 - 组播MAC地址是指第一个字节的最低位是1的MAC地址。 - 组播MAC地址的前3个字节固定为01:00:5e,后3个字节使用组播IP的后23位。例如239.192.255.251的MAC地址为01:00:5e:40:ff:fb。 - Windows 10 Wireshark要抓取SOME/IP组播报文,需要使用SocketTool工具监听239.192.255.251:30490,然后Wireshark才会显示组播报文,否则不显示(Windows netmon不需要任何设置,就可以抓到全部报文)。 netsh interface ip show joins Win 10 PowerShell: Get-NetAdapter | Format-List -Property ifAlias,PromiscuousMode In Linux, map IP addr to multicast MAC is function ip_eth_mc_map(), kernel eventually calls driver ndo_set_rx_mode() to set multicast MAC to NIC RX MAC filter table. 3.5 NAT 查看当前机器的NAT端口代理表: netsh interface portproxy show all 1) 第三方软件PortTunnel。 2) ICS(Internet Connection Sharing)是NAT的简化版。 3) showcase: USB Reverse Tethering 3.6 route命令用法 route [-f] [-p] [command [destination] [mask netmask] [gateway] [metric metric] [if interface]] route print ::增加一条到192.168.0.10/24网络的路由,网关是192.168.0.1,最后一个if参数是数字,可以使用route print查询,类似于Android的NetId。 route add 192.168.0.0 mask 255.255.255.0 192.168.0.1 metric 1 if 11 ::删除192.168.0.10这条路由 route delete 192.168.0.0 3.7 VLAN PowerShell Get-NetAdapter PowerShell Set-NetAdapterAdvancedProperty -Name \"Ethernet 3\" -DisplayName \"VLAN ID\" -DisplayValue 24 PowerShell Reset-NetAdapterAdvancedProperty -Name \"Ethernet 3\" -DisplayName \"VLAN ID\" 3.8 WiFi AP 1) get password netsh wlan show profiles netsh wlan show profiles name="FAST_ABCD" key=clear 2) enable Soft AP netsh wlan show drivers ::netsh wlan set hostednetwork mode=allow netsh wlan set hostednetwork mode=allow ssid=myWIFI key=12345678 netsh wlan start hostednetwork ::netsh wlan stop hostednetwork 3.9 Malicious software Task Manager Find process name, open file location, remove xxx.exe, rename empty xxx.txt to xxx.exe 4 Office 4.1 Excel Insert Symbol More Symbols Wingdings 2 4.2 Outlook 4.2.1 邮箱清理 点击 自己的邮件名字 Data File Properties(数据文件属性) Folder Size(文件夹大小) Server Data(服务器数据) 从左下角“导航选项”中切换到“日历” View(视图) Change View(更改视图) List(列表) 删除“日历”中过期的项目。 Calendar (Left Bottom) - View (Change View to Calendar) - Choose Menu Month 4.2.2 TCAM filter rule Home - ... - Rules - Create Rule (Manage Rules & Alerts) - Title 4.3 Powerpoint画图 插入 - > 形状 Insert - > Shapes 4.4 Word 升级目录 [References][Update Table] 5 Sprax EA 5.1 Basic Design - Toolbox Message/Argument/Return Value Publish - Save - Save to Clipboard 5.2 Advanced Copy/Paste - Copy to Clipboard - Full Structure for Duplication Copy/Paste - Paste Package from Clipboard 6 USB Win7 CMD: wmic path Win32_PnPSignedDriver | find "Android" wmic path Win32_PnPSignedDriver | find "USB" :: similar to Linux lsusb wmic path Win32_USBControllerDevice get Dependent 7 Abbreviations CAB: Capacity Approval Board NPcap: Nmap Packet Capture wmic: Windows Management Instrumentation Command-line 本篇文章为转载内容。原文链接:https://blog.csdn.net/zoosenpin/article/details/118596813。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-09-10 16:27:10
270
转载
转载文章
...手机助手的搜索模块中应用了简单的学习算法。采用了用户协同,标签相似,点击反馈等方法将手机助手的搜索转化率提升了数个百分点。 除了用技术提升业务以外,我还结合工作中的问题进行了很多的深度技术思考。 如有一次我们自己维护了一个线上的redis(当时工程部还没有redis平台,redis服务要业务自己维护)。为了优化性能,我把后端的请求由短连接改成了长连接。虽然看效果性能确实是优化了,但是我的思考并没有停止。我们所有的后端机都会连接这个redis。这样在这个redis实例上可能得有6000多条并发连接存在。我就开始疑惑,Linux 最多能有多少个TCP连接呢,我这 6000 条长连接会不会把这个服务器玩坏? 再比如,我们组的服务器遭遇过几次连接相关的线上问题。其中一次是因为端口紧张而导致 CPU 消耗飙升。后来我又深入研究了一下。 最近,由于 Docker 的广泛应用。底层的网络工作方式已经在悄悄地发生变化了。所以我又开辟了一个网络虚拟化的坑,来一点一点地填。 现在我们的「开发内功修炼」公众号和 Github 就是在作为一个我和大家分享我的技术思考的一个窗口。 04 重回腾讯 时隔 7 年,我又以一种奇特的方式变回了腾讯人的身份。 腾讯再一次收购了搜狗的股份,这一次不再是控股,而是全资。 在离开腾讯的这 7 年多的时间里,腾讯的内部技术工作方式已经发生了翻天覆地的变化。 所以在刚转回腾讯的这一段时间里,我花了大量的精力来熟悉腾讯基于 tRPC 的各种技术生态。除了工作日,也投入了不少周末的精力。 05 再叨叨几句 最后,水文里挤干货,通过我今天的文章我想给大家分享这么几点经验。 第一,是要学会抬头看路,选择一个好的赛道进去。我非常庆幸我当年从广电赛道切换到了互联网,获得了更大的舞台。不过其实我自己在这点上做的也不是特别好,2013年底入职搜狗前拒绝了字节大把期权的offer,要不然我我早就财务自由了。 第二,不要光被动接收领导的指令干活。要主动积极思考项目中哪些地方是待改进的,想到了你就去做。领导都非常喜欢积极主动的员工。我自己也是喜欢招一些能主动思考,积极推进的同学。这些人能创造意外的价值。 第三,工作中除了业务以外还要主动技术的深度思考。毕竟技术仍然是开发的立命之本。在晋升考核的时候,业务数据做的再好也代替不了技术实力的核心位置。把工作中的技术点总结一下,在公司内分享出来。不涉及机密的话在外网分享一下更好。对你自己,对你的团队,都是好事。 技术交流群 最近有很多人问,有没有读者交流群,想知道怎么加入。 最近我创建了一些群,大家可以加入。交流群都是免费的,只需要大家加入之后不要随便发广告,多多交流技术就好了。 目前创建了多个交流群,全国交流群、北上广杭深等各地区交流群、面试交流群、资源共享群等。 有兴趣入群的同学,可长按扫描下方二维码,一定要备注:全国 Or 城市 Or 面试 Or 资源,根据格式备注,可更快被通过且邀请进群。 ▲长按扫描 往期推荐 武大94年博士年薪201万入职华为!学霸日程表曝光,简直降维打击! 腾讯三面:40亿个QQ号码如何去重? 我被开除了。。只因为看了骂公司的帖子 如果你喜欢本文, 请长按二维码,关注 Hollis. 转发至朋友圈,是对我最大的支持。 点个 在看 喜欢是一种感觉 在看是一种支持 ↘↘↘ 本篇文章为转载内容。原文链接:https://blog.csdn.net/hollis_chuang/article/details/121738393。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-02-06 11:38:24
232
转载
转载文章
... br-int 创建网络 openstack network create --share --external --provider-physical-network provider --provider-network-type flat provider $ openstack subnet create --network provider \ --allocation-pool start=192.168.56.100,end=192.168.56.200 \ --dns-nameserver 8.8.8.8 --gateway 192.168.56.1 \ --subnet-range 192.168.56.0/24 provider openstack network create selfservice $ openstack subnet create --network selfservice \ --dns-nameserver 8.8.8.8 --gateway 192.168.1.1 \ --subnet-range 192.168.1.0/24 selfservice openstack router create router openstack router add subnet router selfservice openstack router set router --external-gateway provider openstack port list --router router +--------------------------------------+------+-------------------+-------------------------------------------------------------------------------+--------+ | ID | Name | MAC Address | Fixed IP Addresses | Status | +--------------------------------------+------+-------------------+-------------------------------------------------------------------------------+--------+ | bff6605d-824c-41f9-b744-21d128fc86e1 | | fa:16:3e:2f:34:9b | ip_address='172.16.1.1', subnet_id='3482f524-8bff-4871-80d4-5774c2730728' | ACTIVE | | d6fe98db-ae01-42b0-a860-37b1661f5950 | | fa:16:3e:e8:c1:41 | ip_address='203.0.113.102', subnet_id='5cc70da8-4ee7-4565-be53-b9c011fca011' | ACTIVE | +--------------------------------------+------+-------------------+-------------------------------------------------------------------------------+--------+ $ ping -c 4 203.0.113.102 创建虚机 openstack keypair list $ ssh-keygen -q -N "" $ openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey openstack flavor list openstack image list openstack network list openstack server create --flavor tiny --image cirros --nic net-id=27616098-0374-4ab4-95a8-b5bf4839dcf8 --key-name mykey provider-instance 网络配置 python /usr/lib/python2.7/site-packages/networking_odl/cmd/set_ovs_hostconfigs.py --ovs_hostconfigs='{ "ODL L2": { "allowed_network_types": [ "flat", "vlan", "vxlan" ], "bridge_mappings": { "provider": "br-int" }, "supported_vnic_types": [ { "vnic_type": "normal", "vif_type": "ovs", "vif_details": {} } ] }, "ODL L3": {} }' ovs-vsctl list open . [2019/1/16 19:09] 高正伟: ovs-vsctl set Open_vSwitch . other_config:local_ip=hostip ovs-vsctl set Open_vSwitch . other_config:local_ip=192.168.56.122 ovs-vsctl set Open_vSwitch . other_config:remote_ip=192.168.56.122 ovs-vsctl remove interface tunca7b782f232 options remote_ip ovs-vsctl set Open_vSwitch . other_config:provider_mappings=provider:br-ex ovs-vsctl set Open_vSwitch . external_ids:provider_mappings="{\"provider\": \"br-ex\"}" 清空 ovs-vsctl clear Open_vSwitch . external_ids ovs-vsctl set-manager tcp:10.13.80.34:6640 ovs-vsctl set-controller br-ex tcp:10.13.80.34:6640 ovs-vsctl del-controller br-ex sudo neutron-odl-ovs-hostconfig ovs-vsctl show ovs-vsctl add-port <bridge name> <port name> ovs-vsctl add-port br-ex enp0s10 ovs-vsctl del-port br-ex phy-br-ex ovs-vsctl del-port br-ex tun2ad7e9e91e4 重启odl后 systemctl restart openvswitch.service systemctl restart neutron-server.service systemctl stop neutron-server.service 创建虚机 openstack network create --share --external --provider-physical-network provider --provider-network-type flat provider openstack subnet create --network provider --allocation-pool start=192.168.56.2,end=192.168.56.100 --dns-nameserver 8.8.8.8 --gateway 192.168.56.1 --subnet-range 192.168.56.0/24 provider nova boot --image cirros --flavor tiny --nic net-id= --availability-zone nova:rcontroller01 vm-01 openstack server create --flavor tiny --image cirros --nic net-id= --key-name mykey test nova boot --image cirros --flavor tiny --nic net-id=0fe983c2-8178-403b-a00e-e8561580b210 --availability-zone nova:rcontroller01 vm-01 虚机可以学习到mac但是ping不通 抓包,先在虚机网卡上抓包, 然后在br-int上抓包 发现虚拟网卡上是发送了icmp请求报文的,但是br-int上没有 查看报文情况 [root@rcontroller01 ~] ovs-appctl dpif/dump-flows br-int recirc_id(0),tunnel(tun_id=0x0,src=192.168.56.102,dst=192.168.56.122,flags(-df-csum+key)),in_port(4),eth(),eth_type(0x0800),ipv4(proto=17,frag=no),udp(dst=3784), packets:266436, bytes:17584776, used:0.591s, actions:userspace(pid=4294962063,slow_path(bfd)) recirc_id(0xa0),in_port(5),ct_state(+new-est-rel-inv+trk),ct_mark(0/0x1),eth(),eth_type(0x0800),ipv4(frag=no), packets:148165, bytes:14520170, used:0.566s, actions:drop recirc_id(0),in_port(3),eth(),eth_type(0x0806), packets:1, bytes:60, used:5.228s, actions:drop recirc_id(0),tunnel(tun_id=0xb,src=192.168.56.102,dst=192.168.56.122,flags(-df-csum+key)),in_port(4),eth(dst=fa:16:3e:ab:ba:7e),eth_type(0x0806), packets:0, bytes:0, used:never, actions:5 recirc_id(0),in_port(5),eth(src=fa:16:3e:ab:ba:7e),eth_type(0x0800),ipv4(src=192.168.0.16,proto=1,frag=no), packets:148165, bytes:14520170, used:0.566s, actions:ct(zone=5004),recirc(0xa0) recirc_id(0),in_port(3),eth(),eth_type(0x0800),ipv4(frag=no), packets:886646, bytes:316947183, used:0.210s, flags:SFPR., actions:drop recirc_id(0),in_port(5),eth(src=fa:16:3e:ab:ba:7e,dst=fa:16:3e:7d:95:75),eth_type(0x0806),arp(sip=192.168.0.16,tip=192.168.0.5,op=1/0xff,sha=fa:16:3e:ab:ba:7e), packets:0, bytes:0, used:never, actions:userspace(pid=4294961925,controller(reason=4,dont_send=0,continuation=0,recirc_id=4618,rule_cookie=0x822002d,controller_id=0,max_len=65535)),set(tunnel(tun_id=0xb,src=192.168.56.122,dst=192.168.56.102,ttl=64,tp_dst=4789,flags(df|key))),4 安全组设置 openstack security group rule create --proto tcp 2e19a748-9086-49f8-9498-01abc1a964fe openstack security group rule create --proto tcp 6095293d-c2cd-433d-8a8f-e77ecb03609e openstack security group rule create --proto udp 2e19a748-9086-49f8-9498-01abc1a964fe openstack security group rule create --proto udp 6095293d-c2cd-433d-8a8f-e77ecb03609e ovs-vsctl add-port br-ex "ex-patch-int" ovs-vsctl set interface "ex-patch-int" type=patch ovs-vsctl set interface "ex-patch-int" options:peer=int-patch-ex ovs-vsctl add-port br-int "int-patch-ex" ovs-vsctl set interface "int-patch-ex" type=patch ovs-vsctl set interface "int-patch-ex" options:peer=ex-patch-int ovs-vsctl del-port br-ex "ex-patch-int" ovs-vsctl del-port br-int "int-patch-ex" ovs-vsctl del-port br-ex enp0s9 ovs-vsctl add-port br-int enp0s9 ovs-appctl ofproto/trace 重要命令 sudo ovs-ofctl -O OpenFlow13 show br-int sudo ovs-appctl ofproto/trace br-int "in_port=5,ip,nw_src=192.168.0.16,nw_dst=192.168.0.5" ovs-appctl dpctl/dump-conntrack 11.查看接口id等 ovs-appctl dpif/show 12.查看接口统计 ovs-ofctl dump-ports br-int 查看接口 sudo ovs-ofctl show br-int -O OpenFlow13 ovs常用命令 控制管理类 1.查看网桥和端口 ovs-vsctl show 1 2.创建一个网桥 ovs-vsctl add-br br0 ovs-vsctl set bridge br0 datapath_type=netdev 1 2 3.添加/删除一个端口 for system interfaces ovs-vsctl add-port br0 eth1 ovs-vsctl del-port br0 eth1 for DPDK ovs-vsctl add-port br0 dpdk1 -- set interface dpdk1 type=dpdk options:dpdk-devargs=0000:01:00.0 for DPDK bonds ovs-vsctl add-bond br0 dpdkbond0 dpdk1 dpdk2 \ -- set interface dpdk1 type=dpdk options:dpdk-devargs=0000:01:00.0 \ -- set interface dpdk2 type=dpdk options:dpdk-devargs=0000:02:00.0 1 2 3 4 5 6 7 8 9 4.设置/清除网桥的openflow协议版本 ovs-vsctl set bridge br0 protocols=OpenFlow13 ovs-vsctl clear bridge br0 protocols 1 2 5.查看某网桥当前流表 ovs-ofctl dump-flows br0 ovs-ofctl -O OpenFlow13 dump-flows br0 ovs-appctl bridge/dump-flows br0 1 2 3 6.设置/删除控制器 ovs-vsctl set-controller br0 tcp:1.2.3.4:6633 ovs-vsctl del-controller br0 1 2 7.查看控制器列表 ovs-vsctl list controller 1 8.设置/删除被动连接控制器 ovs-vsctl set-manager tcp:1.2.3.4:6640 ovs-vsctl get-manager ovs-vsctl del-manager 1 2 3 9.设置/移除可选选项 ovs-vsctl set Interface eth0 options:link_speed=1G ovs-vsctl remove Interface eth0 options link_speed 1 2 10.设置fail模式,支持standalone或者secure standalone(default):清除所有控制器下发的流表,ovs自己接管 secure:按照原来流表继续转发 ovs-vsctl del-fail-mode br0 ovs-vsctl set-fail-mode br0 secure ovs-vsctl get-fail-mode br0 1 2 3 11.查看接口id等 ovs-appctl dpif/show 1 12.查看接口统计 ovs-ofctl dump-ports br0 1 流表类 流表操作 1.添加普通流表 ovs-ofctl add-flow br0 in_port=1,actions=output:2 1 2.删除所有流表 ovs-ofctl del-flows br0 1 3.按匹配项来删除流表 ovs-ofctl del-flows br0 "in_port=1" 1 匹配项 1.匹配vlan tag,范围为0-4095 ovs-ofctl add-flow br0 priority=401,in_port=1,dl_vlan=777,actions=output:2 1 2.匹配vlan pcp,范围为0-7 ovs-ofctl add-flow br0 priority=401,in_port=1,dl_vlan_pcp=7,actions=output:2 1 3.匹配源/目的MAC ovs-ofctl add-flow br0 in_port=1,dl_src=00:00:00:00:00:01/00:00:00:00:00:01,actions=output:2 ovs-ofctl add-flow br0 in_port=1,dl_dst=00:00:00:00:00:01/00:00:00:00:00:01,actions=output:2 1 2 4.匹配以太网类型,范围为0-65535 ovs-ofctl add-flow br0 in_port=1,dl_type=0x0806,actions=output:2 1 5.匹配源/目的IP 条件:指定dl_type=0x0800,或者ip/tcp ovs-ofctl add-flow br0 ip,in_port=1,nw_src=10.10.0.0/16,actions=output:2 ovs-ofctl add-flow br0 ip,in_port=1,nw_dst=10.20.0.0/16,actions=output:2 1 2 6.匹配协议号,范围为0-255 条件:指定dl_type=0x0800或者ip ICMP ovs-ofctl add-flow br0 ip,in_port=1,nw_proto=1,actions=output:2 7.匹配IP ToS/DSCP,tos范围为0-255,DSCP范围为0-63 条件:指定dl_type=0x0800/0x86dd,并且ToS低2位会被忽略(DSCP值为ToS的高6位,并且低2位为预留位) ovs-ofctl add-flow br0 ip,in_port=1,nw_tos=68,actions=output:2 ovs-ofctl add-flow br0 ip,in_port=1,ip_dscp=62,actions=output:2 8.匹配IP ecn位,范围为0-3 条件:指定dl_type=0x0800/0x86dd ovs-ofctl add-flow br0 ip,in_port=1,ip_ecn=2,actions=output:2 9.匹配IP TTL,范围为0-255 ovs-ofctl add-flow br0 ip,in_port=1,nw_ttl=128,actions=output:2 10.匹配tcp/udp,源/目的端口,范围为0-65535 匹配源tcp端口179 ovs-ofctl add-flow br0 tcp,tcp_src=179/0xfff0,actions=output:2 匹配目的tcp端口179 ovs-ofctl add-flow br0 tcp,tcp_dst=179/0xfff0,actions=output:2 匹配源udp端口1234 ovs-ofctl add-flow br0 udp,udp_src=1234/0xfff0,actions=output:2 匹配目的udp端口1234 ovs-ofctl add-flow br0 udp,udp_dst=1234/0xfff0,actions=output:2 11.匹配tcp flags tcp flags=fin,syn,rst,psh,ack,urg,ece,cwr,ns ovs-ofctl add-flow br0 tcp,tcp_flags=ack,actions=output:2 12.匹配icmp code,范围为0-255 条件:指定icmp ovs-ofctl add-flow br0 icmp,icmp_code=2,actions=output:2 13.匹配vlan TCI TCI低12位为vlan id,高3位为priority,例如tci=0xf123则vlan_id为0x123和vlan_pcp=7 ovs-ofctl add-flow br0 in_port=1,vlan_tci=0xf123,actions=output:2 14.匹配mpls label 条件:指定dl_type=0x8847/0x8848 ovs-ofctl add-flow br0 mpls,in_port=1,mpls_label=7,actions=output:2 15.匹配mpls tc,范围为0-7 条件:指定dl_type=0x8847/0x8848 ovs-ofctl add-flow br0 mpls,in_port=1,mpls_tc=7,actions=output:2 1 16.匹配tunnel id,源/目的IP 匹配tunnel id ovs-ofctl add-flow br0 in_port=1,tun_id=0x7/0xf,actions=output:2 匹配tunnel源IP ovs-ofctl add-flow br0 in_port=1,tun_src=192.168.1.0/255.255.255.0,actions=output:2 匹配tunnel目的IP ovs-ofctl add-flow br0 in_port=1,tun_dst=192.168.1.0/255.255.255.0,actions=output:2 一些匹配项的速记符 速记符 匹配项 ip dl_type=0x800 ipv6 dl_type=0x86dd icmp dl_type=0x0800,nw_proto=1 icmp6 dl_type=0x86dd,nw_proto=58 tcp dl_type=0x0800,nw_proto=6 tcp6 dl_type=0x86dd,nw_proto=6 udp dl_type=0x0800,nw_proto=17 udp6 dl_type=0x86dd,nw_proto=17 sctp dl_type=0x0800,nw_proto=132 sctp6 dl_type=0x86dd,nw_proto=132 arp dl_type=0x0806 rarp dl_type=0x8035 mpls dl_type=0x8847 mplsm dl_type=0x8848 指令动作 1.动作为出接口 从指定接口转发出去 ovs-ofctl add-flow br0 in_port=1,actions=output:2 1 2.动作为指定group group id为已创建的group table ovs-ofctl add-flow br0 in_port=1,actions=group:666 1 3.动作为normal 转为L2/L3处理流程 ovs-ofctl add-flow br0 in_port=1,actions=normal 1 4.动作为flood 从所有物理接口转发出去,除了入接口和已关闭flooding的接口 ovs-ofctl add-flow br0 in_port=1,actions=flood 1 5.动作为all 从所有物理接口转发出去,除了入接口 ovs-ofctl add-flow br0 in_port=1,actions=all 1 6.动作为local 一般是转发给本地网桥 ovs-ofctl add-flow br0 in_port=1,actions=local 1 7.动作为in_port 从入接口转发回去 ovs-ofctl add-flow br0 in_port=1,actions=in_port 1 8.动作为controller 以packet-in消息上送给控制器 ovs-ofctl add-flow br0 in_port=1,actions=controller 1 9.动作为drop 丢弃数据包操作 ovs-ofctl add-flow br0 in_port=1,actions=drop 1 10.动作为mod_vlan_vid 修改报文的vlan id,该选项会使vlan_pcp置为0 ovs-ofctl add-flow br0 in_port=1,actions=mod_vlan_vid:8,output:2 1 11.动作为mod_vlan_pcp 修改报文的vlan优先级,该选项会使vlan_id置为0 ovs-ofctl add-flow br0 in_port=1,actions=mod_vlan_pcp:7,output:2 1 12.动作为strip_vlan 剥掉报文内外层vlan tag ovs-ofctl add-flow br0 in_port=1,actions=strip_vlan,output:2 1 13.动作为push_vlan 在报文外层压入一层vlan tag,需要使用openflow1.1以上版本兼容 ovs-ofctl add-flow -O OpenFlow13 br0 in_port=1,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:2 1 ps: set field值为4096+vlan_id,并且vlan优先级为0,即4096-8191,对应的vlan_id为0-4095 14.动作为push_mpls 修改报文的ethertype,并且压入一个MPLS LSE ovs-ofctl add-flow br0 in_port=1,actions=push_mpls:0x8847,set_field:10-\>mpls_label,output:2 1 15.动作为pop_mpls 剥掉最外层mpls标签,并且修改ethertype为非mpls类型 ovs-ofctl add-flow br0 mpls,in_port=1,mpls_label=20,actions=pop_mpls:0x0800,output:2 1 16.动作为修改源/目的MAC,修改源/目的IP 修改源MAC ovs-ofctl add-flow br0 in_port=1,actions=mod_dl_src:00:00:00:00:00:01,output:2 修改目的MAC ovs-ofctl add-flow br0 in_port=1,actions=mod_dl_dst:00:00:00:00:00:01,output:2 修改源IP ovs-ofctl add-flow br0 in_port=1,actions=mod_nw_src:192.168.1.1,output:2 修改目的IP ovs-ofctl add-flow br0 in_port=1,actions=mod_nw_dst:192.168.1.1,output:2 17.动作为修改TCP/UDP/SCTP源目的端口 修改TCP源端口 ovs-ofctl add-flow br0 tcp,in_port=1,actions=mod_tp_src:67,output:2 修改TCP目的端口 ovs-ofctl add-flow br0 tcp,in_port=1,actions=mod_tp_dst:68,output:2 修改UDP源端口 ovs-ofctl add-flow br0 udp,in_port=1,actions=mod_tp_src:67,output:2 修改UDP目的端口 ovs-ofctl add-flow br0 udp,in_port=1,actions=mod_tp_dst:68,output:2 18.动作为mod_nw_tos 条件:指定dl_type=0x0800 修改ToS字段的高6位,范围为0-255,值必须为4的倍数,并且不会去修改ToS低2位ecn值 ovs-ofctl add-flow br0 ip,in_port=1,actions=mod_nw_tos:68,output:2 1 19.动作为mod_nw_ecn 条件:指定dl_type=0x0800,需要使用openflow1.1以上版本兼容 修改ToS字段的低2位,范围为0-3,并且不会去修改ToS高6位的DSCP值 ovs-ofctl add-flow br0 ip,in_port=1,actions=mod_nw_ecn:2,output:2 1 20.动作为mod_nw_ttl 修改IP报文ttl值,需要使用openflow1.1以上版本兼容 ovs-ofctl add-flow -O OpenFlow13 br0 in_port=1,actions=mod_nw_ttl:6,output:2 1 21.动作为dec_ttl 对IP报文进行ttl自减操作 ovs-ofctl add-flow br0 in_port=1,actions=dec_ttl,output:2 1 22.动作为set_mpls_label 对报文最外层mpls标签进行修改,范围为20bit值 ovs-ofctl add-flow br0 in_port=1,actions=set_mpls_label:666,output:2 1 23.动作为set_mpls_tc 对报文最外层mpls tc进行修改,范围为0-7 ovs-ofctl add-flow br0 in_port=1,actions=set_mpls_tc:7,output:2 1 24.动作为set_mpls_ttl 对报文最外层mpls ttl进行修改,范围为0-255 ovs-ofctl add-flow br0 in_port=1,actions=set_mpls_ttl:255,output:2 1 25.动作为dec_mpls_ttl 对报文最外层mpls ttl进行自减操作 ovs-ofctl add-flow br0 in_port=1,actions=dec_mpls_ttl,output:2 1 26.动作为move NXM字段 使用move参数对NXM字段进行操作 将报文源MAC复制到目的MAC字段,并且将源MAC改为00:00:00:00:00:01 ovs-ofctl add-flow br0 in_port=1,actions=move:NXM_OF_ETH_SRC[]-\>NXM_OF_ETH_DST[],mod_dl_src:00:00:00:00:00:01,output:2 1 2 ps: 常用NXM字段参照表 NXM字段 报文字段 NXM_OF_ETH_SRC 源MAC NXM_OF_ETH_DST 目的MAC NXM_OF_ETH_TYPE 以太网类型 NXM_OF_VLAN_TCI vid NXM_OF_IP_PROTO IP协议号 NXM_OF_IP_TOS IP ToS值 NXM_NX_IP_ECN IP ToS ECN NXM_OF_IP_SRC 源IP NXM_OF_IP_DST 目的IP NXM_OF_TCP_SRC TCP源端口 NXM_OF_TCP_DST TCP目的端口 NXM_OF_UDP_SRC UDP源端口 NXM_OF_UDP_DST UDP目的端口 NXM_OF_SCTP_SRC SCTP源端口 NXM_OF_SCTP_DST SCTP目的端口 27.动作为load NXM字段 使用load参数对NXM字段进行赋值操作 push mpls label,并且把10(0xa)赋值给mpls label ovs-ofctl add-flow br0 in_port=1,actions=push_mpls:0x8847,load:0xa-\>OXM_OF_MPLS_LABEL[],output:2 对目的MAC进行赋值 ovs-ofctl add-flow br0 in_port=1,actions=load:0x001122334455-\>OXM_OF_ETH_DST[],output:2 1 2 3 4 28.动作为pop_vlan 弹出报文最外层vlan tag ovs-ofctl add-flow br0 in_port=1,dl_type=0x8100,dl_vlan=777,actions=pop_vlan,output:2 1 meter表 常用操作 由于meter表是openflow1.3版本以后才支持,所以所有命令需要指定OpenFlow1.3版本以上 ps: 在openvswitch-v2.8之前的版本中,还不支持meter 在v2.8版本之后已经实现,要正常使用的话,需要注意的是datapath类型要指定为netdev,band type暂时只支持drop,还不支持DSCP REMARK 1.查看当前设备对meter的支持 ovs-ofctl -O OpenFlow13 meter-features br0 2.查看meter表 ovs-ofctl -O OpenFlow13 dump-meters br0 3.查看meter统计 ovs-ofctl -O OpenFlow13 meter-stats br0 4.创建meter表 限速类型以kbps(kilobits per second)计算,超过20kb/s则丢弃 ovs-ofctl -O OpenFlow13 add-meter br0 meter=1,kbps,band=type=drop,rate=20 同上,增加burst size参数 ovs-ofctl -O OpenFlow13 add-meter br0 meter=2,kbps,band=type=drop,rate=20,burst_size=256 同上,增加stats参数,对meter进行计数统计 ovs-ofctl -O OpenFlow13 add-meter br0 meter=3,kbps,stats,band=type=drop,rate=20,burst_size=256 限速类型以pktps(packets per second)计算,超过1000pkt/s则丢弃 ovs-ofctl -O OpenFlow13 add-meter br0 meter=4,pktps,band=type=drop,rate=1000 5.删除meter表 删除全部meter表 ovs-ofctl -O OpenFlow13 del-meters br0 删除meter id=1 ovs-ofctl -O OpenFlow13 del-meter br0 meter=1 6.创建流表 ovs-ofctl -O OpenFlow13 add-flow br0 in_port=1,actions=meter:1,output:2 group表 由于group表是openflow1.1版本以后才支持,所以所有命令需要指定OpenFlow1.1版本以上 常用操作 group table支持4种类型 all:所有buckets都执行一遍 select: 每次选择其中一个bucket执行,常用于负载均衡应用 ff(FAST FAILOVER):快速故障修复,用于检测解决接口等故障 indirect:间接执行,类似于一个函数方法,被另一个group来调用 1.查看当前设备对group的支持 ovs-ofctl -O OpenFlow13 dump-group-features br0 2.查看group表 ovs-ofctl -O OpenFlow13 dump-groups br0 3.创建group表 类型为all ovs-ofctl -O OpenFlow13 add-group br0 group_id=1,type=all,bucket=output:1,bucket=output:2,bucket=output:3 类型为select ovs-ofctl -O OpenFlow13 add-group br0 group_id=2,type=select,bucket=output:1,bucket=output:2,bucket=output:3 类型为select,指定hash方法(5元组,OpenFlow1.5+) ovs-ofctl -O OpenFlow15 add-group br0 group_id=3,type=select,selection_method=hash,fields=ip_src,bucket=output:2,bucket=output:3 4.删除group表 ovs-ofctl -O OpenFlow13 del-groups br0 group_id=2 5.创建流表 ovs-ofctl -O OpenFlow13 add-flow br0 in_port=1,actions=group:2 goto table配置 数据流先从table0开始匹配,如actions有goto_table,再进行后续table的匹配,实现多级流水线,如需使用goto table,则创建流表时,指定table id,范围为0-255,不指定则默认为table0 1.在table0中添加一条流表条目 ovs-ofctl add-flow br0 table=0,in_port=1,actions=goto_table=1 2.在table1中添加一条流表条目 ovs-ofctl add-flow br0 table=1,ip,nw_dst=10.10.0.0/16,actions=output:2 tunnel配置 如需配置tunnel,必需确保当前系统对各tunnel的remote ip网络可达 gre 1.创建一个gre接口,并且指定端口id=1001 ovs-vsctl add-port br0 gre1 -- set Interface gre1 type=gre options:remote_ip=1.1.1.1 ofport_request=1001 2.可选选项 将tos或者ttl在隧道上继承,并将tunnel id设置成123 ovs-vsctl set Interface gre1 options:tos=inherit options:ttl=inherit options:key=123 3.创建关于gre流表 封装gre转发 ovs-ofctl add-flow br0 ip,in_port=1,nw_dst=10.10.0.0/16,actions=output:1001 解封gre转发 ovs-ofctl add-flow br0 in_port=1001,actions=output:1 vxlan 1.创建一个vxlan接口,并且指定端口id=2001 ovs-vsctl add-port br0 vxlan1 -- set Interface vxlan1 type=vxlan options:remote_ip=1.1.1.1 ofport_request=2001 2.可选选项 将tos或者ttl在隧道上继承,将vni设置成123,UDP目的端为设置成8472(默认为4789) ovs-vsctl set Interface vxlan1 options:tos=inherit options:ttl=inherit options:key=123 options:dst_port=8472 3.创建关于vxlan流表 封装vxlan转发 ovs-ofctl add-flow br0 ip,in_port=1,nw_dst=10.10.0.0/16,actions=output:2001 解封vxlan转发 ovs-ofctl add-flow br0 in_port=2001,actions=output:1 sflow配置 1.对网桥br0进行sflow监控 agent: 与collector通信所在的网口名,通常为管理口 target: collector监听的IP地址和端口,端口默认为6343 header: sFlow在采样时截取报文头的长度 polling: 采样时间间隔,单位为秒 ovs-vsctl -- --id=@sflow create sflow agent=eth0 target=\"10.0.0.1:6343\" header=128 sampling=64 polling=10 -- set bridge br0 sflow=@sflow 2.查看创建的sflow ovs-vsctl list sflow 3.删除对应的网桥sflow配置,参数为sFlow UUID ovs-vsctl remove bridge br0 sflow 7b9b962e-fe09-407c-b224-5d37d9c1f2b3 4.删除网桥下所有sflow配置 ovs-vsctl -- clear bridge br0 sflow 1 QoS配置 ingress policing 1.配置ingress policing,对接口eth0入流限速10Mbps ovs-vsctl set interface eth0 ingress_policing_rate=10000 ovs-vsctl set interface eth0 ingress_policing_burst=8000 2.清除相应接口的ingress policer配置 ovs-vsctl set interface eth0 ingress_policing_rate=0 ovs-vsctl set interface eth0 ingress_policing_burst=0 3.查看接口ingress policer配置 ovs-vsctl list interface eth0 4.查看网桥支持的Qos类型 ovs-appctl qos/show-types br0 端口镜像配置 1.配置eth0收到/发送的数据包镜像到eth1 ovs-vsctl -- set bridge br0 mirrors=@m \ -- --id=@eth0 get port eth0 \ -- --id=@eth1 get port eth1 \ -- --id=@m create mirror name=mymirror select-dst-port=@eth0 select-src-port=@eth0 output-port=@eth1 2.删除端口镜像配置 ovs-vsctl -- --id=@m get mirror mymirror -- remove bridge br0 mirrors @m 3.清除网桥下所有端口镜像配置 ovs-vsctl clear bridge br0 mirrors 4.查看端口镜像配置 ovs-vsctl get bridge br0 mirrors Open vSwitch中有多个命令,分别有不同的作用,大致如下: ovs-vsctl用于控制ovs db ovs-ofctl用于管理OpenFlow switch 的 flow ovs-dpctl用于管理ovs的datapath ovs-appctl用于查询和管理ovs daemon 转载于:https://www.cnblogs.com/liuhongru/p/10336849.html 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_30876945/article/details/99916308。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-06-08 17:13:19
294
转载
Docker
...lt; p >Docker是一款流行的集装箱应用程序引擎,它允许用户将应用程序打包,以便它们可以在任何地方运行。但是,当用户不再需要Docker时,他们需要卸载和挂载它。以下是一些指导如何卸载和挂载Docker的步骤。< /p >< pre >1. 卸载Docker - 首先,从终端运行以下命令以删除Docker: sudo apt-get purge docker - 停止Docker服务: sudo systemctl stop docker - 删除Docker图像、容器、卷和网络: sudo rm -rf /var/lib/docker - 最后,从系统中删除Docker: sudo apt-get remove docker-engine< /pre >< pre >2. 挂载Docker - 如果您需要重新安装Docker,您可以使用以下命令从官方Docker存储库安装: sudo apt-get install docker.io - 或者,您可以从Docker安装脚本中安装,使用以下命令: curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh - 验证您的Docker安装是否成功: sudo docker run hello-world< /pre >< p >总之,Docker是一个强大的工具,它使应用程序很容易打包和移植。但是,当用户需要卸载和挂载Docker时,他们可以使用上述指导来成功完成这些任务。< /p >
2023-03-16 09:08:54
561
编程狂人
Docker
...是一种软件技术,它将应用程序及其依赖项打包在轻量级、可移植的独立单元中(称为容器),确保应用在不同环境下的运行一致性。Docker就是一种流行的容器化引擎,通过提供标准化的方式创建、部署和管理容器,简化了应用程序的生命周期管理。 Docker Compose , Docker Compose是Docker生态系统中的一个工具,用于定义和运行多容器Docker应用程序。通过编写docker-compose.yml文件,用户可以声明式地定义一组相关联的服务、网络以及数据卷等组件,实现对整个分布式应用的快速搭建、配置及启动,方便地进行复杂微服务架构的开发与测试。 Docker API , Docker API是一套RESTful接口,允许程序以编程方式与Docker守护进程交互,执行包括容器创建、启动、停止、删除以及获取容器日志等各种操作。开发者可以通过HTTP请求访问这些API来自动化或扩展Docker的功能,例如在本文中提到的,通过Docker API可以直接获取指定容器的日志流。 标准输出(stdout)和错误输出(stderr) , 在计算机程序中,标准输出和错误输出是两种常见的输出流。标准输出通常用于程序正常运行时产生的信息,而错误输出则用于记录程序运行时出现的错误信息或警告信息。在Docker环境中,容器的标准输出和错误输出会被捕获并作为日志存储,以便于用户通过docker logs命令或其他方式查看和分析容器内部的运行状态和问题排查。
2023-09-05 21:33:01
333
代码侠
Docker
Docker , Docker是一种开源的应用容器引擎,它通过将应用程序及其依赖项打包在轻量级可执行容器中,实现应用的便捷部署、运行和迁移。在本文上下文中,Docker被用于为团队搭建统一且易于管理的开发环境,以及部署和运行应用程序。通过创建Docker镜像和容器,团队成员可以快速复现一致的开发环境,并简化部署流程,从而提高协作效率和软件交付质量。 Dockerfile , Dockerfile是一个文本文件,包含了一系列用于构建Docker镜像的指令集合。在文章的具体示例中,Dockerfile定义了基于Node.js 14-alpine镜像的基础环境,设置了工作目录,复制并安装项目所需的package.json文件及依赖,然后将项目源代码复制到镜像中,并暴露3000端口以供服务访问,最后指定启动命令为npm start。通过执行docker build命令,Docker会根据Dockerfile中的指令逐行构建出一个定制化的Docker镜像。 Docker Compose , Docker Compose是Docker提供的一款工具,用于对多个Docker容器进行定义和编排,实现容器化应用的生命周期管理。在团队协作场景下,Docker Compose通过配置文件(如docker-compose.yml)来描述多容器应用程序的服务、网络和数据卷等组件间的依赖关系。用户只需通过一条简单的docker-compose up命令,即可一次性启动、停止或重启所有相关的服务容器,极大地简化了复杂微服务架构下的环境搭建和维护工作,增强了团队开发与协作的便利性。
2023-08-21 13:49:56
559
编程狂人
Docker
Docker , Docker是一种开源的应用容器引擎,它通过将应用程序及其依赖打包到可移植的容器中,实现了软件的标准化部署和运行。在本文语境下,用户使用Docker来拉取、管理和运行官方提供的镜像,但在国内网络环境下遇到了访问不稳定的问题。 镜像(Image) , 在Docker环境下,镜像是一个轻量级、可执行的独立软件包,包含运行某个软件所需的所有内容,包括代码、运行时环境、系统工具库等。当用户执行docker pull命令拉取镜像时,实际上是下载这个包含了应用运行环境及应用本身的文件集合。 国内镜像源 , 由于网络原因,直接从国外的Docker Hub获取镜像可能会遇到速度慢或无法连接的问题。国内镜像源是针对这一问题提供的一种解决方案,它通常是托管在国内服务器上的Docker Registry服务,用于同步或缓存Docker Hub上的官方镜像。用户通过配置Docker以使用这些国内镜像源,可以提高镜像拉取的速度和稳定性。 daemon.json , 在Docker中,daemon.json是一个重要的配置文件,用于存储Docker守护进程的全局配置选项。当需要更改Docker的默认行为,如添加镜像加速器(registry mirror)、设置日志级别等时,就需要编辑这个文件。在本文中,作者通过修改daemon.json文件中的\ registry-mirrors\ 字段,指定使用国内的镜像源。 systemctl , systemctl是Systemd系统和服务管理器的一部分,用于管理系统级别的服务,例如启动、停止、重启服务以及查看服务状态等。在本文中,作者使用systemctl命令来重新加载Docker服务的配置并重启Docker服务,以便新的镜像源配置生效。
2024-03-06 16:10:51
401
程序媛
Docker
...容器技术也得到了普遍应用。Docker作为容器技术的典型,已经成为了构建和部署应用程序的常用手段之一。它可以提供一种轻量级的解决办法,将应用和它们的依赖项封装到一个可移动的容器中,并在不同的环境下执行。这篇文章将介绍如何运用Docker整合应用程序。 第一步是装置Docker。在Linux或Mac系统上执行以下命令: curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh 在Windows上,需要从官网下载装置包并进行装置。装置完成后,可以执行以下命令查看版本: docker version 接下来,需要将应用程序封装为Docker镜像。Docker镜像是一个只读的文件,它包括了执行应用程序所需要的所有文件及设定。可以运用Dockerfile来规定镜像构建步骤。在文件系统中新建一个Dockerfile文件,然后编写以下内容: FROM ubuntu:latest RUN apt-get update RUN apt-get install -y python3 RUN apt-get install -y python3-pip WORKDIR /app COPY requirements.txt /app RUN pip3 install -r requirements.txt COPY . /app CMD ["python3", "app.py"] 这个Dockerfile的作用是:运用最新版本的Ubuntu作为基础镜像,然后装置Python3和pip包管理器。我们的程序源码位于/app目录下,所以我们将运行目录设置为/app。接下来,我们将应用程序的依赖项列表存储于requirements.txt文件中,并装置这些依赖项。最后,我们拷贝整个程序源码到/app目录下,并规定了应用程序的启动指令。 当我们构建这个Docker镜像时,会执行上述Dockerfile中的指令,生成包括应用程序及其依赖项的镜像。运用以下命令来创建镜像: docker build -t myapp . 其中,“myapp”是我们为此镜像赋予的名字,点号表示运用当前目录中的Dockerfile文件。 现在,我们可以在Docker容器中执行我们的应用程序了。运用以下命令来启动容器: docker run -d -p 5000:5000 myapp 其中,“-d”选项表示在后台执行容器,“-p”选项是将容器的5000端口连接至主机的5000端口。这意味着我们可以在本地浏览器中打开http://localhost:5000来访问应用程序了。 这就是运用Docker整合应用程序的基本过程,它可以简化应用程序的构建和部署过程,提高开发效率。
2023-05-14 18:00:01
553
软件工程师
Docker
...在多个环境中部署你的应用而花费大量时间?如果答案是肯定的,那么我想告诉你一个好消息:Docker可以解决这些问题。 Docker是一个开源的应用容器引擎,它允许开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。让我们一起开始学习如何安装和使用Docker吧! 二、Docker的基本概念 在我们深入学习Docker之前,我们需要先理解一些基本的概念。首先,Docker镜像可不得了,它超级轻巧、灵活便携,而且是个全能自给自足的小型运行环境容器。这些镜像,你可以随意选择从仓库直接下载,或者更 DIY 一点,通过 Dockerfile 自己动手打造! 接下来,我们来了解下Dockerfile是什么。Dockerfile,你可把它想象成一本菜谱,里面密密麻麻记录了一连串神奇的指令。这些指令啊,就像是做一道道工序,一步步告诉你如何从零开始,精心打造出一个完整的Docker镜像。当你准备动手构建一个新的Docker镜像时,完全可以告诉Docker那个藏着构建秘籍的Dockerfile在哪儿,然后Docker就会超级听话地根据这个文件一步步自动搭建出你的新镜像来。 最后,我们要知道Docker容器。Docker容器是在宿主机(主机)上运行的独立的进程空间。每个容器都有自己的文件系统,网络,端口映射等特性。 三、Docker的安装步骤 1. 更新操作系统的软件源列表 在Ubuntu上,可以通过以下命令更新软件源列表: bash sudo apt-get update 2. 安装Docker Ubuntu用户可以在终端中输入以下命令安装Docker: bash sudo apt-get install docker-ce docker-ce-cli containerd.io 3. 启动Docker服务并设置开机启动 在Ubuntu上,可以执行以下命令启动Docker服务,并设置为开机启动: bash sudo systemctl start docker sudo systemctl enable docker 4. 验证Docker的安装 你可以使用以下命令验证Docker的安装: bash docker run hello-world 5. 设置Docker加速器 如果你在中国,为了提高Docker镜像下载速度,可以设置Docker加速器。首先,需要在Docker官网注册账号,然后复制加速器的地址。在终端中,输入以下命令添加加速器: bash docker pull --registry-username= --registry-password= registry.cn-shanghai.aliyuncs.com/: 将、、和替换为你自己的信息。 四、使用Docker的基本命令 现在,我们已经完成了Docker的安装,接下来让我们一起学习一些基本的Docker命令吧! 1. 查看Docker版本 bash docker version 2. 显示正在运行的容器 bash docker ps 3. 列出所有的镜像 bash docker images 4. 创建一个新的Docker镜像 bash docker build -t . 5. 运行一个Docker容器 bash docker run -it 6. 查看所有容器的日志 bash docker logs 五、总结 总的来说,Docker是一个非常强大的工具,可以帮助我们更高效地管理我们的应用程序。通过本篇文章的学习,我相信你对Docker已经有了初步的理解。希望你以后不论是上班摸鱼,还是下班享受生活,都能更溜地用上Docker这个神器,让效率嗖嗖往上升。
2023-02-21 20:40:21
477
星河万里-t
Docker
Docker是一种流行的虚拟容器化技术,它允许开发者们将应用和所有其依赖封装在一起,并在运行时以虚拟容器的形式发布它们。在Docker中,虚拟容器是一种小巧的虚拟环境,它可以迅速启动并与其他虚拟容器和主机进行交互。 当您在Docker中运行虚拟容器时,您可能需要从虚拟容器外部接入应用。这可能涉及到与虚拟容器的网络链接、端口转发、虚拟容器的网络地址等问题。下面是一些接入Docker虚拟容器的方法: docker run -p 8080:80 nginx 上述命令将Nginx虚拟容器的80端口转发到主机的8080端口。现在,您可以通过接入主机的http://localhost:8080地址来接入Nginx服务器。 docker inspect container_name 如果您需要知道Docker虚拟容器的网络地址,可以使用上面的命令。它会输出一个JSON格式的数据,包括虚拟容器的网络配置信息和其他详细信息。 如果您正在使用Docker Compose,可以在docker-compose.yml文件中使用ports关键字来映射端口。例如: ports: - "8080:80" 此配置将将Nginx虚拟容器的80端口转发到主机的8080端口。 除了上述方法,还有其他方式可以从Docker虚拟容器外部接入应用。如果您想深入了解Docker虚拟容器网络和端口转发的更多细节,请查看Docker官方文档。
2023-06-15 13:54:04
280
编程狂人
Docker
Docker , Docker是一款开源的应用容器引擎,它使用容器化技术将应用程序及其依赖项打包在一起,形成一个可移植、自包含的软件单元。在不同的操作系统和环境下,Docker容器可以确保应用的一致性运行,极大地提高了开发、测试和部署的效率与灵活性。 Docker镜像 , Docker镜像是创建Docker容器的基础,是一个只读模板,包含了运行某个软件服务所需的所有文件系统结构、环境变量以及配置信息。在本文中,“liumiaocn/thunder-linux”就是一个迅雷的Docker镜像,通过docker pull命令从Docker Hub仓库下载到本地,然后基于此镜像启动迅雷的Docker容器。 数据卷挂载(-v 参数) , 在Docker中,数据卷是宿主机和容器之间共享数据的一种方式。通过 -v 参数可以在启动容器时指定宿主机目录与容器内部目录的映射关系,使得容器内产生的数据能够持久化存储在宿主机上。在本文的具体场景下,使用 -v $ HOME /Downloads:/root/Downloads 将主机用户的下载目录挂载到容器的根用户下载目录,这样迅雷在容器内下载的文件就可以直接保存在主机的 ~/Downloads 目录下,方便用户在宿主机层面访问和管理这些文件。 X11服务器 (DISPLAY) , X11是一个用于Unix和类Unix系统图形界面显示的网络协议。在Docker容器中运行需要图形界面的应用程序时,通常需要将容器连接到宿主机的X11服务器,以便在宿主机上显示应用程序窗口。在文章中,通过 -e DISPLAY=$DISPLAY 和 -v /tmp/.X11-unix:/tmp/.X11-unix 参数设置,实现了迅雷这个图形界面应用在Docker容器内运行时,其界面能正确显示在宿主机桌面上的功能。
2023-01-28 13:49:08
526
程序媛
Docker
Docker , Docker是一个开源的应用容器引擎,它通过容器化技术将应用程序及其依赖环境打包成一个可移植、自包含的镜像,能够在不同的Linux操作系统上以一致的方式运行。在本文中,用户通过手动输入Docker命令来管理(如创建、启动、停止和进入容器)这些容器。 Docker Hub , Docker Hub是Docker官方提供的镜像仓库服务,类似于软件应用商店,其中包含了大量由社区和官方发布的预构建Docker镜像。用户可以通过docker pull命令从Docker Hub下载所需的镜像,以便快速部署和运行各种应用程序或服务。 容器 , 在Docker环境下,容器是一种轻量级、独立运行的一组进程,它们与主机和其他容器共享内核,但每个容器拥有自己独立的文件系统、网络配置和资源限制。容器提供了隔离且一致的运行环境,使得应用程序可以在不同环境中实现无缝迁移和快速部署。 端口映射 , 端口映射是在Docker容器与宿主机之间建立的一种网络通信机制,通过-p选项在docker run命令中指定。例如,-p 80:80表示将宿主机的80端口与容器内部的80端口进行映射,这样外部客户端可以通过访问宿主机的80端口来与容器内的服务进行通信。 Docker Compose , 尽管文章没有直接提到,但它是Docker生态中的一个重要工具,用于定义和运行多容器应用程序。通过编写一个YAML格式的docker-compose.yml文件,可以轻松地定义一组相关联的服务以及它们之间的依赖关系,然后使用一条命令来启动和协调所有容器的生命周期。 Kubernetes(简称K8s) , 虽然在给出的文章摘要中未详细阐述,但在现代云原生架构中,Kubernetes是一个流行的开源容器编排系统,它可以自动化容器应用的部署、扩展和管理。在文中提及的新版Docker优化了与Kubernetes的集成体验,意味着用户能够更加便捷地将基于Docker的容器部署到Kubernetes集群中,实现大规模容器集群的高效管理和调度。
2023-03-26 21:05:17
324
软件工程师
站内搜索
用于搜索本网站内部文章,支持栏目切换。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
pkill -9 process_name
- 强制终止指定进程。
推荐内容
推荐本栏目内的其它文章,看看还有哪些文章让你感兴趣。
2023-04-28
2023-08-09
2023-06-18
2023-04-14
2023-02-18
2023-04-17
2024-01-11
2023-10-03
2023-09-09
2023-06-13
2023-08-07
2023-03-11
历史内容
快速导航到对应月份的历史文章列表。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"