docker network ls 查看使用了哪些网络
[root@centos8-nat-168-182-152 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
c0184302f6a8 bridge bridge local
420492e04276 host host local
fc5e9b954735 none null local
[root@centos8-nat-168-182-152 ~]# docker network inspect bridge(网络名称)
我们在使用 docker run 创建 Docker 容器时,可以用 –net 选项指定容器的网络模式,Docker 可以有以下 4 种网络模式:
bridge 模式:使用 --net=bridge 指定,默认设置。
host 模式:使用 --net=host 指定。
none 模式:使用 --net=none 指定。
container 模式:使用 --net=container:NAME_or_ID 指定。
| 网络模式 | 含义 |
|---|---|
| Bridge(默认模式) | 此模式会为每一个容器分配,设置IP等,并将容器连接到一 docker0 虚拟网桥,通过 docker0网桥以及Iptables nat表配置与宿主机通信。 |
| Host | 容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的IP和端口 |
| Container | 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享 IP,端口范围。 |
| None | 该模式关闭了容器的网络功能,与宿主机,与其他容器都不连通的. |
Bridge模式是启动容器时的默认模式,当Docker server 启动时,会在主机上创建一个名为 docker0 的虚拟网桥
网桥模式不太适用于生产环境,因为网桥背后涉及很多底层工作,会导致相当大的开销
--icc=false表示把容器之间的通信关闭,--iptables=true --icc=false已连接的容器才能通信
docker inspect jenkins
docker inspect --format='{{.NetworkSettings.NewtWork.IPAddress}}' jenkins
主机网络

容器内部网络

Host:容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的IP和端口
不涉及网桥模式中底层开销,因此速度与常规的主机网络一样快,面向外部网络流量大的容器(例如代理和缓存)可以使用主机模式,而其他容器则使用内部网络模式
$ docker inspect jenkins
对比一下宿主机 / etc/hosts,一模一样
$ docker execjenkins cat /etc/hosts
$ cat /etc/hosts
container创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享 IP,端口范围
# 创建容器
$ docker run --name=busybox_jenkins --net=container:bridge -td jenkins
# 查看新创建容器的IP,上面这种方式查不出来
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' jenkins
# 通过ifconfig查询ip
$ docker exec busybox_jenkins ifconfig
$ docker run -dt --net=none --name busybox_jenkins jenkins
# 查看它的网络状态, 验证它仅有 lo 接口,不能与容器外通信
$ docker exec busybox_jenkins ip a
ip_forward: linux内核中用于开关内核的报文转发功能,只有这个开关被打开时,内核才会执行报文的转发
默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器
# 临时修改
$ echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久修改
$ echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
$ sysctl -p
查看默认路由
$ route -n
# 或者
$ ip route
添加路由映射
$ ip route add <container_ip_address> via <host_ip_address> dev <network_interface>
创建网络
# mysite1-network是局域网的名字,可以自定义。默认bridge模式。
docker network create mysite-network
# 利用--driver或-d指定使用bridge驱动,创建mysite2-network网络
docker network create -driver bridge mysite2-network
docker network create -d bridge --gateway 172.200.0.1 -subnet 172.200.0.0/16
# 查看已创建的network列表
docker network ls
# 查看网络详情
docker network inspect mysite2-network
连接网络
# 运行新的容器,并加入到mysite1-network网络中
# --network 表示这个容器要连接到的网络
# --network-alias 表示这个容器在此网络中的名称,也可以使用--ip来指定容器的ip
docker run -d -network mysite1-network --network-alias mysite1-network-name1 dockerw-web-image
# 将已经在运行的容器加入网络使用以下命令, 容器名为docker-web,别名为we
docker network connect --alias=web --network=mysite-network docker-web
#连接网络时为docker-web容器指定ip地址
docker network connect -ip=192.168.19.2 --network=mysite-network docker-web
# 断开 docker-web容器与mysite1-network的连接
docker network disconnect mysite1-network docker-web
删除网络
#删除mysite1-network网络
docker network rm mysite1-network
brctl
brctl是Linux中用于配置和管理网桥(bridge)的命令行工具,brctl命令可以用来创建,删除,修改和显示网桥,以及向网桥中添加或移除物理接口
#安装brctl
yum install -y bridge-utils
#查看bridge信息
brctl show
#创建网桥
brctl addr mydocker0
ip netns命令
ip netns是Linux中用于管理网络命名空间(network namespace)的命令行工具,它可以用来创建,删除,列出,进入网络命名空间等操作
#添加网络命名空间
ip netns add 空间名
#在名为<name>的网络命名空间中执行<command>命令
ip netns exec ns1 ip addr add 172.16.1.1/16 dev eth00-ns1
ip netns exec ns1 ip link set eth00-ns1 up
ip link命令
ip link是Linux中用于管理网络接口(network interface)的命令行工具,它可以用来配置和管理物理接口,虚拟接口,桥接接口等。
#ip link add <dev> type <type>:添加一个名为<dev>的新网络接口,并指定类型为<type>(如veth、bridge、vlan等)
#该命令的含义是创建一对虚拟以太网接口,分别命名为veth-ns1和eth00-ns1,并将它们成对地连接起来,以便在不同的网络命名空间中使用
ip link add veth-ns1 type veth peer name eth00-ns1
# ip link set <dev> netns <ns>:将名为<dev>的网络接口移动到名为<ns>的网络命名空间中
ip link set eth00-ns1 netns ns1
#ip link set <dev> up/down:将名为<dev>的网络接口启用或禁用 把veth-ns1这个bridge up起来
ip link set veth-ns1 up
iptable
iptables是Linux系统中用于配置和管理防火墙规则的命令行工具,它可以用来控制网络数据包的流动和传输,以实现网络安全和访问控制
#用于列出当前系统中nat表中的所有规则
#-t用于指定要操作的表,nat表示要操作的是nat
# --list用于列出指定表中的所有规则,包括链名、匹配规则、动作等详细信息
iptables --list -t nat
#-t nat:指定要操作的表为nat表,
#-n:不进行DNS解析,直接显示IP地址,
#-v:显示规则的统计信息,包括匹配的数据包数和字节数
# -x:将数据包和字节数以更易读的格式进行显示
#iptables -t nat -nvxl命令需要在root权限下运行
iptables -t nat -nvxl
子网掩码
网关
定义:网关实质上是一个网络通向其他网络的IP地址
举例:网络A的IP地址范围为“192.168.1.1192.168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1192.168.2.254”,子网掩码为255.255.255.0,根据子网掩码判定两个网络中的主机处在不同的网络里,而要实现这两个网络之间的通信,则必须通过网关
当浏览器输入一个网址并敲回车,整个过程都发生了什么
DNS解析:浏览器首先会检查自己的缓存中是否存在该域名对应的IP地址,如果没有,则向本地DNS服务器发起请求
TCP连接:浏览器通过DNS解析获得了服务器的IP地址后,会向该IP地址发送TCP连接请求进行三次握手
发送HTTP请求:
TCP断开连接:页面渲染完成后,浏览器与服务器进行四次挥手,相互之间断开连接
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl
我经常迷上ruby的一件事是递归模式。例如,假设我有一个数组,它可能包含无限深度的数组作为元素。所以,例如:my_array=[1,[2,3,[4,5,[6,7]]]]我想创建一个方法,可以将数组展平为[1,2,3,4,5,6,7]。我知道.flatten可以完成这项工作,但这个问题是作为我经常遇到的递归问题的一个例子-因此我试图找到一个更可重用的解决方案。简而言之-我猜这种事情有一个标准模式,但我想不出任何特别优雅的东西。任何想法表示赞赏 最佳答案 递归是一种方法,它不依赖于语言。您在编写算法时要考虑两种情况:再次调用函数的情
这应该是一个简单的问题,但我找不到任何相关信息。给定一个Ruby中的正则表达式,对于每个匹配项,我需要检索匹配的模式$1、$2,但我还需要匹配位置。我知道=~运算符为我提供了第一个匹配项的位置,而string.scan(/regex/)为我提供了所有匹配模式。如果可能,我需要在同一步骤中获得两个结果。 最佳答案 MatchDatastring.scan(regex)do$1#Patternatfirstposition$2#Patternatsecondposition$~.offset(1)#Startingandendingpo