
😜即日起,更新云原生相关知识,喜欢的小伙伴可以给我点个三连喔
😜收录至专栏 云原生
😜【云原生Docker系列第一篇】Docker镜像管理
😜【云原生Docker系列第二篇】Docker容器管理
文章目录
docker 使用linux 桥接,在宿主机虚拟一个docker 容器网桥(docker0) ,docker 启动一个容器时会根据docker 网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker 网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP 直接通信.
docker 网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主机(端口映射),即docker run 创建容器时候,通过 -p 或者 -P 参数来启用。访问容器的时候,就通过 [宿主机IP]:[容器端口]访问容器
方法一:
随机映射端口(从32768开始)docker run -d --name 为容器指定名称 -P 镜像
方法二:
指定映射端口docker run -d --name 为容器指定名称 -p 宿主机端口:容器内端口 镜像
#使用nginx镜像创建容器,名称为web1 ,随机映射端口
[root@localhost ~]# docker run -d --name web1 -P stevelugyq/nginx
f4e83d54c76efac3ae28674dc748841fd1c6410e70b337cc5695ac010ac6053d
#使用nginx镜像创建容器,名称为web2,将容器内的80端口映射到宿主机的42399端口
[root@localhost ~]# docker run -d --name web2 -p 42399:80 stevelugyq/nginx
42dfd334e7973ea2eb39a24a5b0eca22f24c83b19d135789ba14b38a7a182912
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
42dfd334e797 stevelugyq/nginx "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 0.0.0.0:42399->80/tcp, :::42399->80/tcp web2
f4e83d54c76e stevelugyq/nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:49154->80/tcp, :::49154->80/tcp web1
[root@localhost ~]#
#访问
[root@localhost ~]# curl http://192.168.109.133:49154
[root@localhost ~]# curl http://192.168.109.133:42399
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
#主机查看端口号
[root@localhost ~]# netstat -natp|grep docker
tcp 0 0 0.0.0.0:42399 0.0.0.0:* LISTEN 87691/docker-proxy
tcp 0 0 0.0.0.0:49154 0.0.0.0:* LISTEN 87577/docker-proxy
tcp6 0 0 :::42399 :::* LISTEN 87695/docker-proxy
tcp6 0 0 :::49154 :::* LISTEN 87581/docker-proxy
#实际上是通过nat表进行转发的
[root@localhost ~]# iptables -nL -t nat
......
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49154 to:172.17.0.2:80
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:42399 to:172.17.0.3:80




Host:容器不会虚拟出自己的网卡,配置主机的IP等,而是使用宿主机的IP和端口
Container: 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP,端口范围
None: 该模式关闭了容器的网络功能。
Bridge:默认为该模式,此模式会为每一个容器分配,设置IP等,并将容器连接到一个docker0 的虚拟网桥,通过docker 0 网桥以及iptables nat 表配置与宿主机通信。
自定义网络
在安装Docker 时,它会自动创建三个网络,bridge(创建容器默认连接到此网络),none,host
方法一:
docker network ls
方法二:
docker network list
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
18eb681e0bcf bridge bridge local
f97b03a5a9c6 host host local
31c5c12df613 none null local
[root@localhost ~]# docker network list
NETWORK ID NAME DRIVER SCOPE
18eb681e0bcf bridge bridge local
f97b03a5a9c6 host host local
31c5c12df613 none null local

使用docker run 创建Docker 容器时,可以使用 --net或者–network 选项指定容器的网络模式

#创建容器web 3,指定网络模式为 host
#因为是host模式,所有宿主机和容器共享ip和端口
docker run -d --name web3 --net=host nginx
#访问宿主机的ip和80端口,则可以访问到web3的nginx服务
firefox http://192.168.109.133:80

#基于镜像centos:7 创建一个名为test1的容器
[root@localhost ~]# docker run -itd --name test1 centos:7 /bin/bash
74eeef825f02734fcf25b64565064bd61e7ef3a10fba9e5092f0b0549e29bc3d
#查看容器的pid号
[root@localhost ~]# docker inspect -f '{{.State.Pid}}' test1
88046
#查看该容器的命名空间编号
[root@localhost ~]# ls -l /proc/88046/ns
总用量 0
lrwxrwxrwx 1 root root 0 6月 24 01:31 ipc -> ipc:[4026532801]
lrwxrwxrwx 1 root root 0 6月 24 01:31 mnt -> mnt:[4026532799]
lrwxrwxrwx 1 root root 0 6月 24 01:30 net -> net:[4026532804]
lrwxrwxrwx 1 root root 0 6月 24 01:31 pid -> pid:[4026532802]
lrwxrwxrwx 1 root root 0 6月 24 01:31 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 6月 24 01:31 uts -> uts:[4026532800]
#创建test2容器,使用container网络模式,和test1共享network Namespace
[root@localhost ~]# docker run -itd --name test2 --net=container:test1 centos:7 /bin/bash
b4ec3fa1cac64b66f939c068f613da5f85ef314b355b1bbb8fc0e56841d5c996
#查看test2容器的pid
[root@localhost ~]# docker inspect -f '{{.State.Pid}}' test2
94769
#查看该容器的命名空间编号
[root@localhost ~]# ls -l /proc/94769/ns/
总用量 0
lrwxrwxrwx 1 root root 0 6月 24 13:44 ipc -> ipc:[4026532897]
lrwxrwxrwx 1 root root 0 6月 24 13:44 mnt -> mnt:[4026532092]
lrwxrwxrwx 1 root root 0 6月 24 13:44 net -> net:[4026532804]
lrwxrwxrwx 1 root root 0 6月 24 13:44 pid -> pid:[4026532898]
lrwxrwxrwx 1 root root 0 6月 24 13:44 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 6月 24 13:44 uts -> uts:[4026532896]


bridge模式是docker的默认网络模式,不写 – net参数,就是bridge模式。
相当于Vmware中的 nat 模式,容器使用独立network Namespace,并连接到docker0虚拟网卡。通过docker0网桥以及iptables nat表配置与宿主机通信,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上。

[root@localhost ~]# docker run -itd --name test4 centos:7 /bin/bash
c9d19872effbab980926319b55c6e37a997bac9ad739789a45f85a7bc4618da5
[root@localhost ~]# docker inspect test4 | grep -i 'networkmode'
"NetworkMode": "default",

直接使用bridge 模式,还是无法指定IP运行docker 的,可以先自定义网络,在指定IP运行docker
如:
docker network create --subnet=172.18.0.0/16 --opt
“com.docker.network.bridge.name”=“docker1” mynetwork
------ docker 1 为 执行ifconfig -a 命令时显示的网卡名,如果不适用 --opt 参数指定此名称,使用 ifconfig -a 查看网卡的网络信息时,看到的将会是类似 br-110… 这样的名字
----- mynetwork 为执行 docker network list 命令时 显示的 bridge 网络模式名称
#直接执行此命令,则报错
[root@localhost ~]# docker run -itd --name test5 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
1b885f7950b7874ec98176dce8d850c54d9fe642a5896317de28745ba926056b
docker: Error response from daemon: user specified IP address is supported on user defined networks only.
#先自定义网络,设置网卡地址池,网卡名,网络模式名
[root@localhost ~]# docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
9c210d8fa83493211ed3abdae304e8e144db88ba8e50086f2588fd465f5ffb9d
#再使用网络创建自定义网络的容器
[root@localhost ~]# docker run -itd --name test6 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash
962bda412fb89c98ee0a70788a5e09d48a760034d756373f18ef6b45cc4ec429
#查看网络
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
18eb681e0bcf bridge bridge local
f97b03a5a9c6 host host local
9c210d8fa834 mynetwork bridge local
31c5c12df613 none null local
[root@localhost ~]#
#进入容器
root@localhost ~]# docker exec -it test6 bash
#下载网络管理工具
[root@962bda412fb8 /]# yum install -y net-tools
#查看容器的网卡信息
[root@962bda412fb8 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.10 netmask 255.255.0.0 broadcast 172.18.255.255
ether 02:42:ac:12:00:0a txqueuelen 0 (Ethernet)
RX packets 7240 bytes 23877777 (22.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6861 bytes 373846 (365.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0




Host、ContainerNone、Bridge(默认)、自定义网络(还是四种网络模式,只是可以自定义网段)
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用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新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最